PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Đo lường thống kê điểm kiểm tra PostgreSQL

Các trạm kiểm soát có thể là một lực cản lớn đối với việc cài đặt PostgreSQL nhiều ghi. Bước đầu tiên để xác định các vấn đề trong lĩnh vực này là theo dõi tần suất chúng xảy ra, điều này vừa được thêm vào cơ sở dữ liệu gần đây một giao diện dễ sử dụng hơn.

Điểm kiểm tra là các hoạt động bảo trì định kỳ mà cơ sở dữ liệu thực hiện để đảm bảo rằng mọi thứ mà nó đang lưu vào bộ nhớ đệm trong bộ nhớ đã được đồng bộ hóa với đĩa. Ý tưởng là khi bạn đã hoàn thành một mục, bạn có thể không cần phải lo lắng về các mục nhập cũ hơn được đặt vào nhật ký ghi trước của cơ sở dữ liệu. Điều đó có nghĩa là ít thời gian hơn để khôi phục sau sự cố.
Vấn đề với các điểm kiểm tra là chúng có thể rất nặng, vì để hoàn thành một điểm kiểm tra đòi hỏi phải ghi từng bit dữ liệu đã thay đổi trong bộ đệm ẩn của cơ sở dữ liệu ra đĩa. Có một số tính năng được thêm vào PostgreSQL 8.3 cho phép bạn giám sát tốt hơn chi phí của trạm kiểm soát và hạ thấp nó bằng cách lan truyền hoạt động trong một khoảng thời gian dài hơn. Tôi đã viết một bài báo dài về những thay đổi đó có tên là Checkpoints và Background Writer đề cập đến những gì đã thay đổi, nhưng đọc khá khô khan.
Điều bạn có thể muốn biết là cách giám sát các điểm kiểm tra trên hệ thống sản xuất của bạn và cách nhận biết nếu chúng xảy ra quá thường xuyên. Mặc dù mọi thứ đã được cải thiện, nhưng hiện tượng "tăng đột biến điểm kiểm tra" trong đó I / O đĩa trở nên thực sự nặng vẫn có thể xảy ra ngay cả trong các phiên bản PostgreSQL hiện tại. Và việc điều chỉnh cấu hình mặc định để có dung lượng ổ đĩa rất thấp và khôi phục sự cố nhanh cũng không ích gì thay vì hiệu suất. Tham số checkpoint_searies là một đầu vào về tần suất một điểm kiểm tra xảy ra được mặc định là 3, điều này buộc một điểm kiểm tra chỉ sau 48 MB ghi.
Bạn có thể tìm hiểu tần suất điểm kiểm tra theo hai cách. Bạn có thể bật log_checkpoints và xem những gì xảy ra trong nhật ký. Bạn cũng có thể sử dụng chế độ xem pg_stat_bgwriter, cung cấp số lượng của từng nguồn trong số hai nguồn cho các điểm kiểm tra (thời gian trôi qua và số lần ghi xảy ra) cũng như thống kê về mức độ công việc mà họ đã làm.
Vấn đề chính là làm cho điều đó dễ dàng hơn làm điều đó cho đến gần đây, không thể đặt lại các bộ đếm bên trong của pg_stat_bgwriter. Điều đó có nghĩa là bạn phải chụp nhanh với dấu thời gian trên đó, đợi một lúc, chụp một ảnh nhanh khác, sau đó trừ tất cả các giá trị để lấy được bất kỳ thống kê hữu ích nào từ dữ liệu. Đó là một nỗi đau.
Đau đớn quá rồi mà tôi đã viết một bản vá để làm cho nó dễ dàng hơn. Với phiên bản phát triển hiện tại của cơ sở dữ liệu, bây giờ bạn có thể gọi pg_stat_reset_shared (‘bgwriter’) và bật tất cả các giá trị này về 0 một lần nữa. Điều này cho phép tuân theo một thực tiễn đã từng phổ biến trên PostgreSQL. Trước 8.3, có một tham số có tên là stats_reset_on_server_start mà bạn có thể bật. Điều đó đặt lại tất cả thống kê nội bộ của máy chủ mỗi khi bạn khởi động. Điều đó có nghĩa là bạn có thể gọi hàm pg_postmaster_start_time () tiện dụng, so sánh với thời gian hiện tại và luôn có số lượng chính xác về hoạt động / giây của bất kỳ thống kê nào có sẵn trên hệ thống.
Nó vẫn chưa tự động, nhưng bây giờ rằng việc đặt lại các phần được chia sẻ này là có thể, bạn có thể tự làm. Chìa khóa đầu tiên là tích hợp xóa thống kê vào trình tự khởi động máy chủ của bạn. Tập lệnh như thế này sẽ hoạt động:


pg_ctl start -l $PGLOG -w
psql -c "select pg_stat_reset();"
psql -c "select pg_stat_reset_shared('bgwriter');"

Lưu ý "-w" trên lệnh start ở đó – điều đó sẽ khiến pg_ctl phải đợi cho đến khi máy chủ khởi động xong trước khi nó quay trở lại, điều này rất quan trọng nếu bạn muốn thực hiện ngay một câu lệnh chống lại nó.
Nếu bạn đã hoàn thành và thời gian bắt đầu máy chủ của bạn về cơ bản giống như khi bắt đầu thu thập số liệu thống kê của người viết nền, giờ đây bạn có thể sử dụng truy vấn thú vị này:


SELECT
total_checkpoints,
seconds_since_start / total_checkpoints / 60 AS minutes_between_checkpoints
FROM
(SELECT
EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time())) AS seconds_since_start,
(checkpoints_timed+checkpoints_req) AS total_checkpoints
FROM pg_stat_bgwriter
) AS sub;

Và nhận được một báo cáo đơn giản về tần suất các điểm kiểm tra đang diễn ra trên hệ thống của bạn. Đầu ra giống như sau:


total_checkpoints           | 9
minutes_between_checkpoints | 3.82999310740741

Những gì bạn làm với thông tin này là nhìn chằm chằm vào khoảng thời gian trung bình và xem liệu nó có quá nhanh không. Thông thường, bạn muốn một điểm kiểm tra xảy ra không quá năm phút một lần và trên một hệ thống bận rộn, bạn có thể cần đẩy nó lên mười phút hoặc hơn để có hy vọng theo kịp. Với ví dụ này, cứ 3,8 phút một lần có lẽ là quá nhanh – đây là hệ thống cần checkpoint_segment cao hơn.
Sử dụng kỹ thuật này để đo khoảng checkpoint cho phép bạn biết liệu bạn có cần tăng các thông số checkpoint_segment và checkpoint_timeout theo thứ tự không để đạt được mục tiêu đó. Bạn có thể tính toán các con số theo cách thủ công ngay bây giờ và khi 9.0 xuất xưởng, đó là thứ bạn có thể cân nhắc tạo hoàn toàn tự động - miễn là bạn không ngại số liệu thống kê của mình biến mất mỗi khi máy chủ khởi động lại.
Có một số cách thú vị khác để phân tích dữ liệu mà người viết nền cung cấp cho bạn trong pg_stat_bgwriter, nhưng tôi sẽ không bỏ qua tất cả các thủ thuật của mình hôm nay.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Toán tử không tồn tại:json =json

  2. Nhiều cơ sở dữ liệu trong docker và docker-soạn

  3. Đo điểm chuẩn Giải pháp đám mây PostgreSQL được quản lý:Phần thứ hai - Amazon RDS

  4. Chuyển tên bảng làm tham số trong psycopg2

  5. Liệt kê các hàm được lưu trữ tham chiếu đến một bảng trong PostgreSQL