CodeGym /Các khóa học /SQL SELF /Các chỉ số hệ thống PostgreSQL

Các chỉ số hệ thống PostgreSQL

SQL SELF
Mức độ , Bài học
Có sẵn

Hãy tưởng tượng server PostgreSQL của bạn giống như một nhà hàng, còn tụi mình là mấy ông kiểm tra chất lượng. Để nhà hàng chạy mượt, tụi mình phải để ý xem có bao nhiêu nguyên liệu (CPU, RAM, đĩa) đang được dùng, khi nào thì hết, và ai đang xài mấy cái đó. Nếu lơ là, "nhà hàng" của mình có thể nhận quá nhiều đơn và không xử lý nổi, hoặc sập luôn giữa buổi trưa. Đó là lý do tại sao hiểu các chỉ số hệ thống là cực kỳ quan trọng.

Các chỉ số quan trọng cần theo dõi với PostgreSQL:

  1. CPU: cho biết bao nhiêu thời gian xử lý được dùng để thực thi truy vấn.
  2. Bộ nhớ (RAM): cho thấy PostgreSQL dùng RAM như thế nào, kể cả cache truy vấn.
  3. Dung lượng đĩa: cái này thì dễ đoán nhất: bạn không thể lưu nhiều dữ liệu hơn dung lượng đĩa cho phép.

Mục tiêu của tụi mình là học cách kiểm tra và hiểu các chỉ số hệ thống của PostgreSQL để tránh mấy vụ lag hoặc thiếu tài nguyên.

Theo dõi sử dụng CPU

CPU là trái tim của server. PostgreSQL có thể ngốn CPU cho cả truy vấn phức tạp lẫn mấy tác vụ nền như tự động phân tích và dọn dẹp (autovacuum). Nếu database của bạn giống như một đứa ham ăn, cứ "ăn" CPU liên tục, thì đã đến lúc phải can thiệp rồi đó.

  1. Dùng công cụ hệ thống.
    Đầu tiên, xác định xem PostgreSQL đang xài bao nhiêu CPU ở mức hệ thống. Trên Linux, bạn có thể dùng lệnh top hoặc htop.

Tìm tiến trình PostgreSQL (thường sẽ có tên database của bạn). Ví dụ, postgres: postgres [your_query].

Chú ý cột %CPU. Nếu nó cứ cao ngất ngưởng hoài, thì đó là dấu hiệu nguy hiểm.

  1. Phân tích tải CPU từ PostgreSQL.

PostgreSQL có sẵn các view để theo dõi tải. Cái hữu ích nhất là pg_stat_activity, nó hiển thị các truy vấn đang chạy.

Ví dụ truy vấn:

SELECT pid, usename, query, state, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;

Cái gì quan trọng ở đây?

  • state = 'active' sẽ chỉ hiển thị các truy vấn đang chạy.
  • duration cho biết truy vấn đã "ăn" CPU bao lâu rồi.

Mẹo thực tế:

Nếu bạn thấy truy vấn nào chạy lâu bất thường, kiểm tra lại xem có index nào được dùng chưa. Ngoài ra, bạn có thể kết thúc tiến trình gây vấn đề bằng pg_terminate_backend.

Ví dụ kết thúc:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'active' AND duration > interval '10 minutes';

Theo dõi sử dụng bộ nhớ

Bộ nhớ là tài nguyên quan trọng thứ hai cho PostgreSQL, nhất là khi nói đến cache dữ liệu. PostgreSQL dùng RAM rất nhiều (thông qua các tham số work_memshared_buffers) để tăng tốc xử lý.

  1. Các tham số PostgreSQL chính về bộ nhớ:
  • shared_buffers: Đây là vùng bộ nhớ chính mà PostgreSQL dùng. Thường nó chiếm khoảng 25-40% tổng RAM của server.
  • work_mem: Bộ nhớ cho các thao tác sort và hash trong một truy vấn. Giá trị càng lớn thì càng nhiều thao tác tạm được xử lý trong RAM (thay vì ghi ra đĩa).
  1. Kiểm tra cấu hình bộ nhớ hiện tại.

Để xem các cấu hình bộ nhớ đang dùng cho PostgreSQL, chạy lệnh:

SHOW shared_buffers;
SHOW work_mem;

Ví dụ kết quả:

1GB
4MB

Có nghĩa là server dành 1GB cho shared_buffers và 4MB cho mỗi thao tác sort/hash.

  1. Theo dõi bộ nhớ với pg_stat_activity

Bạn có thể kiểm tra từng kết nối đang dùng bao nhiêu RAM. Có một truy vấn tiện như sau:

SELECT pid, usename, state, backend_start, pg_size_pretty(pg_backend_memory_contexts_size(pid)) AS memory_used
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY memory_used DESC;

Truy vấn này sẽ cho bạn biết mỗi kết nối đang dùng bao nhiêu RAM.

Mẹo: nếu một kết nối nào đó ngốn quá nhiều RAM, kiểm tra xem truy vấn có sort hay aggregate gì không, có thể tối ưu lại được.

Theo dõi dung lượng đĩa

Đĩa là "bể chứa" cuối cùng cho PostgreSQL. Dù bạn có nhiều RAM và CPU, PostgreSQL vẫn cần dung lượng đĩa để lưu dữ liệu, log giao dịch (WAL) và file tạm.

  1. Kiểm tra dung lượng database.

Bắt đầu với cái cơ bản: xác định dung lượng database.

SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;

Truy vấn này làm gì?

Nó hiển thị tổng dung lượng database hiện tại ở dạng dễ đọc (MB, GB).

  1. Kiểm tra dung lượng bảng và index.

Để xác định "ông nặng ký" trong database, dùng truy vấn này:

SELECT relname AS table_name, pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

Ví dụ kết quả:

table_name total_size
orders 1 GB
customers 500 MB
transactions 300 MB
  1. Theo dõi WAL (log giao dịch).

Nếu database của bạn hoạt động nhiều, log giao dịch sẽ phình ra rất nhanh. Kiểm tra dung lượng WAL như sau:

SELECT pg_size_pretty(pg_xlog_location_diff(pg_current_wal_lsn(), '0/0')) AS wal_size;

Kết luận

Bây giờ bạn đã có công cụ và kiến thức để theo dõi các chỉ số hệ thống của PostgreSQL:

  1. Dùng htop hoặc pg_stat_activity để theo dõi tải CPU.
  2. Cấu hình shared_bufferswork_mem để tận dụng RAM tối ưu.
  3. Thường xuyên kiểm tra dung lượng database, bảng và index để tránh hết dung lượng đĩa.

Những kỹ năng này sẽ giúp bạn tránh được mấy vụ sập bất ngờ và giữ cho server PostgreSQL luôn khỏe mạnh. Nghĩ về server, hãy nhớ: tài nguyên được tổ chức hợp lý sẽ giúp sản phẩm của bạn trở thành "nhà hàng" hot nhất với khách hàng (người dùng) đó nha.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION