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

Kiến trúc và điều chỉnh bộ nhớ trong cơ sở dữ liệu PostgreSQL

Quản lý bộ nhớ trong PostgreSQL rất quan trọng để cải thiện hiệu suất của máy chủ cơ sở dữ liệu. Tệp cấu hình PostgreSQL (postgres.conf) quản lý cấu hình của máy chủ cơ sở dữ liệu. Nó sử dụng các giá trị mặc định của các tham số, nhưng chúng tôi có thể thay đổi các giá trị này để phản ánh tốt hơn khối lượng công việc và môi trường hoạt động.

Trong blog này, chúng tôi sẽ đề cập đến các thông số liên quan đến bộ nhớ này. Nhưng trước khi bắt đầu, chúng ta hãy xem kiến ​​trúc bộ nhớ trong PostgreSQL.

Kiến trúc bộ nhớ

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

  1. Khu vực bộ nhớ cục bộ:Khu vực này được phân bổ bởi mỗi quy trình phụ trợ để sử dụng riêng.
  2. Vùng bộ nhớ dùng chung:Nó được sử dụng bởi tất cả các quy trình của máy chủ PostgreSQL.

Vùng bộ nhớ cục bộ

Trong PostgreSQL, mỗi quy trình phụ trợ cấp phát bộ nhớ cục bộ để xử lý truy vấn; mỗi khu vực được chia thành các khu vực con có kích thước cố định hoặc thay đổi.

Các khu vực phụ như sau.

Work_mem

Người thực thi sử dụng khu vực này để sắp xếp các bộ theo các phép toán ORDER BY và DISTINCT. Nó cũng sử dụng nó để kết hợp các bảng bằng các thao tác hợp nhất-nối và tham gia băm.

Maintenance_work_mem

Tham số này được sử dụng cho một số loại hoạt động bảo trì (VACUUM, REINDEX).

Temp_buffers

Người thực thi sử dụng khu vực này để lưu trữ các bảng tạm thời.

Vùng bộ nhớ dùng chung

Vùng bộ nhớ dùng chung được phân bổ bởi máy chủ PostgreSQL khi nó khởi động. Các khu vực này được chia thành nhiều khu vực phụ có kích thước cố định.

Vùng đệm được chia sẻ

PostgreSQL tải các trang trong bảng và chỉ mục từ bộ lưu trữ liên tục đến vùng đệm được chia sẻ, sau đó hoạt động trực tiếp trên chúng.

Bộ đệm WAL

PostgreSQL hỗ trợ cơ chế WAL (Viết trước nhật ký) để đảm bảo rằng không có dữ liệu nào bị mất sau sự cố máy chủ. Dữ liệu WAL thực sự là một nhật ký giao dịch trong PostgreSQL và bộ đệm WAL là vùng đệm của dữ liệu WAL trước khi ghi nó vào một bộ lưu trữ liên tục.

Nhật ký cam kết

Nhật ký cam kết (CLOG) lưu giữ trạng thái của tất cả các giao dịch và là một phần của cơ chế kiểm soát đồng thời. Nhật ký cam kết được cấp phát cho bộ nhớ dùng chung và được sử dụng trong suốt quá trình xử lý giao dịch.

PostgreSQL xác định bốn trạng thái giao dịch sau.

  1. IN_PROGRESS
  2. ĐÃ CAM KẾT
  3. ĐÃ ĐƯỢC GIỚI THIỆU
  4. ĐÃ GỬI HÀNG
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức

Điều chỉnh các tham số bộ nhớ PostgreSQL

Có một số tham số quan trọng được khuyến nghị để quản lý bộ nhớ trong PostgreSQL. Bạn nên tính đến những điều sau.

Shared_buffers

Tham số này chỉ định dung lượng bộ nhớ được sử dụng cho bộ đệm bộ nhớ dùng chung. Tham số shared_buffers xác định lượng bộ nhớ được dành riêng cho máy chủ để lưu dữ liệu vào bộ nhớ đệm. Giá trị mặc định của shared_buffers thường là 128 megabyte (128MB).

Giá trị mặc định của tham số này rất thấp vì trên một số nền tảng như các phiên bản Solaris cũ hơn và SGI, việc có các giá trị lớn yêu cầu hành động xâm lấn như biên dịch lại hạt nhân. Ngay cả trên các hệ thống Linux hiện đại, nhân có thể sẽ không cho phép đặt bộ đệm chia sẻ lên hơn 32MB mà không điều chỉnh cài đặt nhân trước.

Cơ chế đã thay đổi trong PostgreSQL 9.4 trở lên, vì vậy cài đặt hạt nhân sẽ không phải điều chỉnh ở đó.

Nếu có tải cao trên máy chủ cơ sở dữ liệu, thì việc đặt giá trị cao sẽ cải thiện hiệu suất.

Nếu bạn có một máy chủ DB chuyên dụng với 1GB RAM trở lên, giá trị khởi đầu hợp lý cho thông số cấu hình shared_buffer là 25% bộ nhớ trong hệ thống của bạn.

Giá trị mặc định của shared_buffers =128 MB. Thay đổi yêu cầu khởi động lại máy chủ PostgreSQL.

Khuyến nghị chung để đặt shared_buffers như sau.

  • Bộ nhớ dưới 2GB, hãy đặt giá trị của shared_buffers thành 20% tổng bộ nhớ hệ thống.
  • Bộ nhớ dưới 32 GB, hãy đặt giá trị của shared_buffers thành 25% tổng bộ nhớ hệ thống.
  • Bộ nhớ trên 32 GB, hãy đặt giá trị của shared_buffers thành 8GB

Work_mem

Tham số này chỉ định dung lượng bộ nhớ được sử dụng bởi các hoạt động sắp xếp nội bộ và bảng băm trước khi ghi vào các tệp đĩa tạm thời. Nếu nhiều cách sắp xếp phức tạp đang diễn ra và bạn có đủ bộ nhớ, thì việc tăng tham số work_mem cho phép PostgreSQL thực hiện việc sắp xếp trong bộ nhớ lớn hơn, nhanh hơn so với các loại tương đương dựa trên đĩa.

Lưu ý rằng đối với một truy vấn phức tạp, nhiều hoạt động sắp xếp hoặc băm có thể đang chạy song song. Mỗi thao tác sẽ được phép sử dụng nhiều bộ nhớ như giá trị này chỉ định trước khi nó bắt đầu ghi dữ liệu vào các tệp tạm thời. Có một khả năng là một số phiên có thể thực hiện các hoạt động như vậy đồng thời. Do đó, tổng bộ nhớ được sử dụng có thể gấp nhiều lần giá trị của tham số work_mem.

Hãy nhớ rằng khi chọn giá trị phù hợp. Các phép toán sắp xếp được sử dụng cho các phép nối ORDER BY, DISTINCT và hợp nhất. Bảng băm được sử dụng trong các phép nối băm, xử lý dựa trên băm của các truy vấn con IN và tổng hợp dựa trên băm.

Tham số log_temp_files có thể được sử dụng để ghi nhật ký các tệp sắp xếp, băm và tạm thời, điều này có thể hữu ích trong việc tìm ra liệu các loại có tràn vào đĩa thay vì phù hợp với bộ nhớ hay không. Bạn có thể kiểm tra các loại tràn vào đĩa bằng cách sử dụng GIẢI THÍCH các gói PHÂN TÍCH. Ví dụ:trong đầu ra của GIẢI THÍCH PHÂN TÍCH, nếu bạn thấy dòng như:“ Phương pháp sắp xếp:kết hợp bên ngoài Đĩa:7528kB ”, Work_mem ít nhất 8MB sẽ giữ dữ liệu trung gian trong bộ nhớ và cải thiện thời gian phản hồi truy vấn.

Giá trị mặc định của work_mem =4MB.

Khuyến nghị chung để đặt work_mem như sau.

  • Bắt đầu với giá trị thấp:32-64MB
  • Sau đó, tìm kiếm các dòng "tệp tạm thời" trong nhật ký
  • Đặt thành 2-3 lần tệp tạm thời lớn nhất

bảo trì _work_mem

Tham số này chỉ định lượng bộ nhớ tối đa được sử dụng bởi các hoạt động bảo trì như VACUUM, CREATE INDEX và ALTER TABLE ADD FOREIGN KEY. Vì chỉ một trong những hoạt động này có thể được thực thi tại một thời điểm bởi phiên cơ sở dữ liệu và cài đặt PostgreSQL không có nhiều hoạt động trong số chúng chạy đồng thời, nên an toàn khi đặt giá trị của Maint_work_mem lớn hơn đáng kể so với work_mem.

Đặt giá trị lớn hơn có thể cải thiện hiệu suất cho việc hút bụi và khôi phục các kết xuất cơ sở dữ liệu.

Cần nhớ rằng khi autovacuum chạy, lên đến autovacuum_max_workers lần bộ nhớ này có thể được cấp phát, vì vậy hãy cẩn thận không đặt giá trị mặc định quá cao.

Giá trị mặc định của Maint_work_mem =64MB.

Khuyến nghị chung để đặt duy trì_work_mem như sau.

  • Đặt giá trị 10% bộ nhớ hệ thống, tối đa 1GB
  • Có thể bạn có thể đặt nó cao hơn nữa nếu bạn gặp sự cố VACUUM

Effects_cache_size

Hiệu quả_cache_size phải được đặt thành ước tính dung lượng bộ nhớ có sẵn cho bộ nhớ đệm trên đĩa của hệ điều hành và trong chính cơ sở dữ liệu. Đây là hướng dẫn về lượng bộ nhớ bạn mong đợi có sẵn trong hệ điều hành và bộ đệm PostgreSQL, không phải là phân bổ.

Công cụ lập kế hoạch truy vấn PostgreSQL sử dụng giá trị này để tìm ra liệu các kế hoạch mà nó đang xem xét có được mong đợi phù hợp với RAM hay không. Nếu nó được đặt quá thấp, các chỉ mục có thể không được sử dụng để thực hiện các truy vấn theo cách bạn mong đợi. Vì hầu hết các hệ thống Unix đều hoạt động khá mạnh khi lưu vào bộ nhớ đệm, nên ít nhất 50% RAM có sẵn trên máy chủ cơ sở dữ liệu chuyên dụng sẽ chứa đầy dữ liệu được lưu trong bộ nhớ đệm.

Khuyến nghị chung cho effect_cache_size như sau.

  • Đặt giá trị cho số lượng bộ nhớ cache của hệ thống tệp có sẵn
  • Nếu bạn không biết, hãy đặt giá trị thành 50% tổng bộ nhớ hệ thống

Giá trị mặc định của effect_cache_size =4GB.

Temp_buffers

Tham số này đặt số lượng bộ đệm tạm thời tối đa được sử dụng bởi mỗi phiên cơ sở dữ liệu. Bộ đệm cục bộ phiên chỉ được sử dụng để truy cập vào các bảng tạm thời. Cài đặt của thông số này có thể được thay đổi trong các phiên riêng lẻ nhưng chỉ trước khi sử dụng bảng tạm thời lần đầu tiên trong phiên.

Cơ sở dữ liệu PostgreSQL sử dụng vùng bộ nhớ này để lưu giữ các bảng tạm thời của mỗi phiên, chúng sẽ bị xóa khi kết nối bị đóng.

Giá trị mặc định của temp_buffer =8MB.

Kết luận

Hiểu kiến ​​trúc bộ nhớ và điều chỉnh các tham số thích hợp là điều quan trọng để cải thiện hiệu suất. Điều này đặc biệt cần thiết đối với các hệ thống có khối lượng công việc cao. Để biết thêm các mẹo điều chỉnh hiệu suất chung, vui lòng xem lại bảng gian lận hiệu suất này cho PostgreSQL.


  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ổng quan về Serial Pseudo-Datatype cho PostgreSQL

  2. Tránh bế tắc PostgreSQL khi thực hiện cập nhật hàng loạt và thao tác xóa

  3. Chuyển đổi Tập hợp kết quả từ Mảng SQL thành Mảng chuỗi

  4. Cách làm việc với cơ sở dữ liệu PostgreSQL

  5. Làm thế nào để sử dụng RETURNING với ON CONFLICT trong PostgreSQL?