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

Điều cần kiểm tra xem Khả năng sử dụng bộ nhớ PostgreSQL có cao không

Việc đọc từ bộ nhớ sẽ luôn hiệu quả hơn so với việc chuyển sang đĩa, vì vậy đối với tất cả các công nghệ cơ sở dữ liệu, bạn muốn sử dụng càng nhiều bộ nhớ càng tốt. Nếu bạn không chắc chắn về cấu hình hoặc bạn gặp lỗi, điều này có thể tạo ra mức sử dụng bộ nhớ cao hoặc thậm chí là sự cố hết bộ nhớ.

Trong blog này, chúng ta sẽ xem xét cách kiểm tra việc sử dụng bộ nhớ PostgreSQL của bạn và thông số nào bạn nên tính đến để điều chỉnh nó. Đối với điều này, hãy bắt đầu bằng cách xem tổng quan về kiến ​​trúc của PostgreSQL.

Kiến trúc PostgreSQL

Kiến trúc của PostgreSQL dựa trên ba phần cơ bản:Quy trình, Bộ nhớ và Đĩa.

Bộ nhớ có thể được phân thành hai loại:

  • Bộ nhớ cục bộ :Nó được tải bởi mỗi quy trình phụ trợ để sử dụng riêng cho quá trình xử lý truy vấn. Nó được chia thành các khu vực phụ:
    • Work mem:Work mem được sử dụng để sắp xếp các bộ dữ liệu theo phép ORDER BY và DISTINCT cũng như để nối các bảng.
    • Ghi nhớ công việc bảo trì:Một số loại hoạt động bảo trì sử dụng khu vực này. Ví dụ:VACUUM, nếu bạn không chỉ định autovacuum_work_mem.
    • Bộ đệm tạm thời:Nó được sử dụng để lưu trữ các bảng tạm thời.
  • Bộ nhớ dùng chung :Nó được phân bổ bởi máy chủ PostgreSQL khi nó được khởi động và nó được sử dụng bởi tất cả các quy trình. Nó được chia thành các khu vực phụ:
    • Vùng đệm được chia sẻ:Nơi PostgreSQL tải các trang có bảng và chỉ mục từ đĩa để hoạt động trực tiếp từ bộ nhớ, giảm khả năng truy cập đĩa.
    • Bộ đệm WAL:Dữ liệu WAL là nhật ký giao dịch trong PostgreSQL và chứa các thay đổi trong cơ sở dữ liệu. Bộ đệm WAL là vùng mà dữ liệu WAL được lưu trữ tạm thời trước khi ghi vào đĩa vào các tệp WAL. Điều này được thực hiện sau mỗi khoảng thời gian xác định trước được gọi là điểm kiểm tra. Điều này rất quan trọng để tránh mất thông tin trong trường hợp máy chủ bị lỗi.
    • Nhật ký cam kết:Nó lưu trạng thái của tất cả các giao dịch để kiểm soát đồng thời.

Làm thế nào để biết Điều gì đang xảy ra

Nếu bạn đang sử dụng bộ nhớ cao, trước tiên, bạn nên xác nhận quy trình nào đang tạo ra mức tiêu thụ.

Sử dụng Lệnh Linux "Hàng đầu"

Lệnh linux hàng đầu có lẽ là tùy chọn tốt nhất ở đây (hoặc thậm chí là một lệnh tương tự một như htop). Với lệnh này, bạn có thể thấy các tiến trình / tiến trình đang tiêu tốn quá nhiều bộ nhớ.

Khi bạn xác nhận rằng PostgreSQL chịu trách nhiệm về vấn đề này, bước tiếp theo là kiểm tra lý do.

Sử dụng Nhật ký PostgreSQL

Kiểm tra cả nhật ký hệ thống và PostgreSQL chắc chắn là một cách tốt để có thêm thông tin về những gì đang xảy ra trong cơ sở dữ liệu / hệ thống của bạn. Bạn có thể thấy các thông báo như:

Resource temporarily unavailable

Out of memory: Kill process 1161 (postgres) score 366 or sacrifice child

Nếu bạn không có đủ bộ nhớ trống.

Hoặc thậm chí nhiều lỗi thông báo cơ sở dữ liệu như:

FATAL:  password authentication failed for user "username"

ERROR:  duplicate key value violates unique constraint "sbtest21_pkey"

ERROR:  deadlock detected

Khi bạn đang có một số hành vi không mong muốn ở phía cơ sở dữ liệu. Vì vậy, nhật ký rất hữu ích để phát hiện những loại vấn đề này và thậm chí hơn thế nữa. Bạn có thể tự động hóa việc giám sát này bằng cách phân tích cú pháp các tệp nhật ký đang tìm kiếm các tác phẩm như “FATAL”, “ERROR” hoặc “Kill”, vì vậy bạn sẽ nhận được cảnh báo khi nó xảy ra.

Sử dụng Pg_top

Nếu bạn biết rằng quy trình PostgreSQL đang sử dụng bộ nhớ cao, nhưng nhật ký không hữu ích, bạn có một công cụ khác có thể hữu ích ở đây, pg_top.

Công cụ này tương tự như công cụ linux hàng đầu, nhưng nó dành riêng cho PostgreSQL. Vì vậy, khi sử dụng nó, bạn sẽ có thêm thông tin chi tiết về những gì đang chạy cơ sở dữ liệu của mình và thậm chí bạn có thể loại bỏ các truy vấn hoặc chạy công việc giải thích nếu bạn phát hiện ra điều gì đó sai. Bạn có thể tìm thêm thông tin về công cụ này tại đây.

Nhưng điều gì sẽ xảy ra nếu bạn không thể phát hiện bất kỳ lỗi nào và cơ sở dữ liệu vẫn đang sử dụng nhiều RAM. Vì vậy, có thể bạn sẽ cần kiểm tra cấu hình cơ sở dữ liệu.

Tham số cấu hình nào cần tính đến

Nếu mọi thứ đều ổn nhưng bạn vẫn gặp vấn đề về hiệu suất sử dụng cao, bạn nên kiểm tra cấu hình để xác nhận xem có đúng không. Vì vậy, sau đây là các tham số mà bạn nên tính đến trong trường hợp này.

shared_buffers

Đây là dung lượng bộ nhớ mà máy chủ cơ sở dữ liệu sử dụng cho bộ đệm bộ nhớ được chia sẻ. Nếu giá trị này quá thấp, cơ sở dữ liệu sẽ sử dụng nhiều đĩa hơn, điều này sẽ gây ra chậm hơn, nhưng nếu nó quá cao, có thể tạo ra mức sử dụng bộ nhớ cao. Theo tài liệu, nếu bạn có một máy chủ cơ sở dữ liệu chuyên dụng với 1GB RAM trở lên, giá trị khởi đầu hợp lý cho shared_buffers là 25% bộ nhớ trong hệ thống của bạn.

work_mem

Nó chỉ định dung lượng bộ nhớ sẽ được ORDER BY, DISTINCT và JOIN sử dụng trước khi ghi vào các tệp tạm thời trên đĩa. Đối với shared_buffers, nếu chúng ta cấu hình tham số này quá thấp, chúng ta có thể có nhiều hoạt động hơn vào đĩa, nhưng quá cao sẽ gây nguy hiểm cho việc sử dụng bộ nhớ. Giá trị mặc định là 4 MB.

max_connections

Work_mem cũng đi đôi với giá trị max_connections, vì mỗi kết nối sẽ thực hiện các thao tác này cùng lúc và mỗi thao tác sẽ được phép sử dụng nhiều bộ nhớ như được chỉ định bởi giá trị này trước nó bắt đầu ghi dữ liệu trong các tệp tạm thời. Tham số này xác định số lượng tối đa các kết nối đồng thời đến cơ sở dữ liệu của chúng tôi, nếu chúng tôi định cấu hình số lượng kết nối cao và không tính đến điều này, bạn có thể bắt đầu gặp sự cố về tài nguyên. Giá trị mặc định là 100.

temp_buffers

Bộ đệm tạm thời được sử dụng để lưu trữ các bảng tạm thời được sử dụng trong mỗi phiên. Tham số này đặt số lượng bộ nhớ tối đa cho tác vụ này. Giá trị mặc định là 8 MB.

Maint_work_mem

Đây là bộ nhớ tối đa mà một hoạt động như Hút bụi, thêm chỉ mục hoặc khóa ngoại có thể sử dụng. Điều tốt là chỉ có thể chạy một thao tác kiểu này trong một phiên và không phải là điều phổ biến nhất để chạy nhiều thao tác này cùng lúc trong hệ thống. Giá trị mặc định là 64 MB.

autovacuum_work_mem

Chân không sử dụng duy trì_work_mem theo mặc định, nhưng chúng ta có thể tách nó ra bằng cách sử dụng tham số này. Chúng tôi có thể chỉ định dung lượng bộ nhớ tối đa được sử dụng bởi mỗi nhân viên hút chân không tại đây.

wal_buffers

Dung lượng bộ nhớ dùng chung cho dữ liệu WAL chưa được ghi vào đĩa. Cài đặt mặc định là 3% shared_buffers, nhưng không nhỏ hơn 64kB và không lớn hơn kích thước của một phân đoạn WAL, thường là 16MB.

Kết luận

Có nhiều lý do khác nhau để sử dụng bộ nhớ cao và việc phát hiện vấn đề gốc có thể là một công việc tốn nhiều thời gian. Trong blog này, chúng tôi đã đề cập đến các cách khác nhau để kiểm tra việc sử dụng bộ nhớ PostgreSQL của bạn và bạn nên tính đến thông số nào để điều chỉnh nó, tránh sử dụng quá nhiều bộ nhớ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể thêm ràng buộc DUY NHẤT vào bảng PostgreSQL, sau khi nó đã được tạo không?

  2. Làm thế nào để xem phiên bản Postgres nào đang chạy

  3. 4 cách để tìm hàng có chứa ký tự chữ hoa trong PostgreSQL

  4. Làm cách nào để ngăn không cho PDO diễn giải dấu chấm hỏi dưới dạng trình giữ chỗ?

  5. cột postgres X không tồn tại