PostgreSQL có thể mở rộng quy mô khá tốt theo chiều dọc. Bạn càng cung cấp nhiều tài nguyên (CPU, bộ nhớ, đĩa) cho máy chủ PostgreSQL của mình, thì nó càng hoạt động tốt. Tuy nhiên, trong khi một số phần của Postgres có thể tự động sử dụng tài nguyên gia tăng, các phần khác cần thay đổi cấu hình trước khi có thể nhận thấy các cải tiến.
Đọc tiếp để tìm hiểu thêm về cách đảm bảo PostgreSQL sử dụng đầy đủ hệ thống mà bạn đang chạy nó.
CPU
Tự động chia tỷ lệ
PostgreSQL có kiến trúc quy trình truyền thống, bao gồm một quy trình chính (được gọi là postmaster ) tạo ra một quy trình mới (được gọi là phụ trợ ) cho mỗi kết nối máy khách mới. Điều này có nghĩa là nếu có nhiều lõiCPU hơn, nhiều quy trình hơn có thể chạy đồng thời và do đó các nhà sản xuất cá nhân không phải cạnh tranh nhiều về tính khả dụng của CPU. Các truy vấn ràng buộc CPU sẽ hoàn thành nhanh hơn.
Bạn có thể muốn điều chỉnh các kết nối đồng thời tối đa được phép ở cấp độ toàn hệ thống, mỗi cơ sở dữ liệu hoặc mỗi người dùng:
-- system level
ALTER SYSTEM SET max_connections = 200;
-- database level
ALTER DATABASE dbname CONNECTION LIMIT 200;
-- user level
ALTER ROLE username CONNECTION LIMIT 20;
để các ứng dụng giả mạo không thể kết thúc quá nhiều kết nối.
Cần điều chỉnh gì
Máy chủ PostgreSQL có thể sinh ra quy trình để thực hiện các nhiệm vụ trông nhà, như hút bụi, sao chép, đăng ký (để sao chép hợp lý), v.v.
Cài đặt cấu hình cấp cao nhất cho số lượng quy trình công nhân là:
# typically specified in postgresql.conf
max_worker_processes = 16
Tăng giá trị này có thể dẫn đến tăng tốc các công việc bảo trì, truy vấn song song và tạo chỉ mục.
Truy vấn song song
Bắt đầu với phiên bản 9.6, Postgres có thể thực hiện song song các truy vấn nếu người lập kế hoạch truy vấn quyết định nó sẽ hữu ích. Truy vấn song song bao gồm các nhân viên sinh sản, phân phối công việc giữa họ và sau đó thu thập (thu thập) kết quả. đặt trước đó, Postgres sẽ xác định số lượng công nhân có thể được tạo cho truy vấn song song tùy thuộc vào giá trị của hai cài đặt cấu hình:
# the maximum number of workers that the system can
# support for parallel operations
max_parallel_workers = 8
# the maximum number of workers that can be started
# by a single Gather or Gather Merge node
max_parallel_workers_per_gather = 8
Nếu bạn có CPU không hoạt động và các truy vấn có thể chạy song song, việc tăng các giá trị này sẽ làm tăng tốc độ các truy vấn đó.
Tạo chỉ mục song song
Trong Postgres 11, hỗ trợ tạo chỉ mục B-Tree song song đã được thêm vào. Nếu bạn thường xuyên tạo chỉ mục B-Tree hoặc REINDEX chúng, việc tăng giá trị này có thể giúp:
# the maximum number of parallel workers that can be
# started by a single utility command
max_parallel_maintenance_workers = 8
Điều này sẽ cho phép Postgres sinh ra nhiều công nhân này (tùy thuộc vào tổng thể max_worker_processes
) để tăng tốc độ tạo chỉ mục B-Tree.
Sao chép logic
Bản sao lôgic (có sẵn trong Postgres 10 trở lên), dựa vào các quy trình xử lý của worker ở phía đăng ký để tìm nạp các thay đổi từ nhà xuất bản. Bằng cách giao các Postgres để sinh ra nhiều nhân viên sao chép hợp lý hơn, các thay đổi có thể được tìm nạp và áp dụng song song, đặc biệt nếu có nhiều bảng hơn. Cài đặt cấu hình này làm tăng tổng số nhân viên sao chép:
# maximum number of logical replication workers
max_logical_replication_workers = 8
Trong sao chép trực tuyến, bạn có thể bắt đầu đồng bộ hóa với bản sao lưu cơ sở. Tuy nhiên, sao chép giả mạo, các thay đổi phải được thực hiện thông qua chính giao thức nhân bản, qua mạng. Điều này có thể tốn thời gian. Việc cho phép nhiều công nhân hơn trong giai đoạn đồng bộ hóa có thể đẩy nhanh quá trình này:
# basically the number of tables that are synced in
# parallel during initialization of subscription
max_sync_workers_per_subscription = 8
Autovacuum
Theo định kỳ, dựa trên một loạt các cài đặt cấu hình, Postgres sẽ cung cấp các công nhân sẽ BỎ QUA các bảng cơ sở dữ liệu. Tất nhiên, điều này được gọi làautovacuum và số lượng công nhân mà trình khởi chạy autovacuum tạo ra mỗi lần có thể được thiết lập thông qua cài đặt cấu hình:
# the maximum number of autovacuum processes
autovacuum_max_workers = 8
Nén WAL
Nếu bạn có CPU để dự phòng, bạn có thể đổi CPU lấy băng thông đĩa bằng cách nén các trang được ghi vào tệp WAL. Điều này làm giảm số lượng dữ liệu cần được ghi vào đĩa, với chi phí của nhiều chu kỳ CPU hơn để kiểm tra dữ liệu. Nó cũng làm giảm kích thước dữ liệu cần được gửi qua wire để sao chép trực tuyến.
Thực tế, những lợi ích của việc nén WAL rất xứng đáng với chi phí đầu tư rất hợp lý. Để bật tính năng này, hãy sử dụng:
# compresses full page images written to WAL
wal_compression = on
Bộ nhớ
Tự động chia tỷ lệ
Hệ điều hành tự động quản lý và sử dụng bộ nhớ mà bất kỳ ứng dụng nào không sử dụng để lưu vào bộ đệm dữ liệu được đọc và ghi vào đĩa gần đây. Điều này giúp tăng tốc đáng kể các ứng dụng sử dụng nhiều đĩa và chắc chắn là PostgreSQL.
Trong Linux, máy chủ lưu trữ phổ biến nhất cho Postgres, kích thước của bộ đệm ẩn đĩa hệ điều hành không thể do người dùng đặt. Đây là quyền quản lý nội bộ của Linux. Dưới áp suất bộ nhớ, nó sẽ nhường bộ nhớ đệm ổ đĩa cho các ứng dụng.
Cần tinh chỉnh những gì
Công cụ lập kế hoạch truy vấn
Công cụ lập kế hoạch truy vấn phải bao gồm số lượng bộ nhớ đệm ổ đĩa do OSas cung cấp vào ước tính của nó. Nếu bạn đã quản lý để tăng đáng kể bộ đệm đĩa hệ điều hành (bằng cách tăng bộ nhớ khả dụng), thì việc tăng cài đặt cấu hình này có thể giúp cải thiện ước tính của người lập kế hoạch:
# the planner's assumption about the effective size
# of the disk cache that is available to a single query.
effective_cache_size = 64GB
Shared Memory
PostgreSQL sử dụng một tập hợp các bộ đệm được chia sẻ giữa tất cả các worker và backendprocesses. Đây được gọi là bộ đệm được chia sẻ và dung lượng bộ nhớ được cấp phát cho bộ đệm dùng chung được đặt bằng cách sử dụng cài đặt cấu hình:
shared_buffers = 32GB
Bộ đệm tạm thời
Khi các bảng tạm thời được truy cập bởi một truy vấn, bộ đệm sẽ được cấp phát vào bộ đệm ẩn nội dung được đọc trong đó. Kích thước của bộ đệm này được đặt bằng cách sử dụng cài đặt cấu hình:
# the maximum number of temporary buffers used
# by each database session
temp_buffers = 100MB
Nếu bạn còn trống bộ nhớ và các truy vấn sử dụng nhiều bảng tạm thời, việc tăng giá trị này có thể tăng tốc các truy vấn như vậy.
Bộ nhớ làm việc
Bộ nhớ làm việc được cấp phát cục bộ và riêng tư bởi các phụ trợ. Nó được sử dụng để sắp xếp và tham gia vàofulfil mà không cần phải tạo thành các bảng tạm thời. Việc tăng điều này từ mặc định là 4MB có thể cho phép các truy vấn hoàn thành nhanh hơn bằng cách tạo bảng tạm thời:
# the amount of memory to be used by internal sort
# operations and hash tables before writing to temporary disk files
work_mem = 16MB
Hoạt động bảo trì
Bộ nhớ được sử dụng bởi VACUUM, tạo chỉ mục và các lệnh bảo trì khác được điều khiển bởi cài đặt cấu hình Maint_work_mem
. Việc tăng số lượng này có thể tăng tốc các hoạt động này, đặc biệt là trên các chỉ mục hoặc bảng cần được tạo lại.
Bộ nhớ do nhân viên autovacuum sử dụng có thể được lấy từ kho công việc bảo trì (bằng cách đặt autovacuum_work_mem =-1
) hoặc được định cấu hình độc lập.
# the maximum amount of memory to be used by
# maintenance operations
maintenance_work_mem = 128MB
# maximum amount of memory to be used by each
# autovacuum worker process
autovacuum_work_mem = -1
Đĩa
Tự động chia tỷ lệ
Đĩa có thể được làm lớn hơn, nhanh hơn hoặc đồng thời hơn. Kích thước của đĩa chỉ là điều mà PostgreSQL không cần phải được hướng dẫn. Theo mặc định, PostgreSQL sẽ không hạn chế bản thân sử dụng bất kỳ dung lượng đĩa có sẵn nào. Điều này thường ổn.
Tuy nhiên, bạn có thể đặt giới hạn về tổng kích thước của các tệp tạm thời được tạo, cung cấp một số biện pháp bảo vệ chống lại các truy vấn cố gắng sắp xếp một tỷ mũi tên và những thứ tương tự:
# the maximum amount of disk space that a process
# can use for temporary files
temp_file_limit = 500GB
Cần tinh chỉnh gì
Đồng thời
Đĩa RAID-ed và hệ thống tệp như ZFS có thể được thiết lập để hỗ trợ nhiều đơn vị tiền tệ hơn. Có nghĩa là, bạn có thể có một số lần đọc / ghi đĩa đang được phục vụ hiện tại bởi các hệ thống tệp như vậy do cách lưu trữ hoặc xử lý dữ liệu liên tục.
Bạn có thể cho phép Postgres phát hành nhiều I / O đĩa đồng thời, bằng cách sử dụng cài đặt cấu hình này:
# the number of concurrent disk I/O operations that
# PostgreSQL expects can be executed simultaneously
effective_io_concurrency = 4
Tuy nhiên, điều này hiện chỉ được sử dụng khi quét heap bitmap.
Chi phí Trang Ngẫu nhiên
Công cụ lập kế hoạch truy vấn Postgres giả định rằng đọc tuần tự nhanh hơn đọc ngẫu nhiên. Chính xác là giá trị bạn có thể điều chỉnh nhanh hơn bao nhiêu. Theo mặc định, nó giả sử số lần đọc giá trị gấp 4 lần.
Tùy thuộc vào thiết lập đĩa, khối lượng công việc và điểm chuẩn của bạn, nếu bạn chắc chắn rằng lần đọcrandom được nói, chỉ tốn kém gấp đôi so với lần đọc tuần tự, bạn có thể thông báo cho Postgres:
# the planner's estimate of the cost of a disk page
# fetch that is part of a series of sequential fetches
seq_page_cost = 1
# the planner's estimate of the cost of a
# non-sequentially-fetched disk page
random_page_cost = 2
Không gian bảng
Để tận dụng lợi thế của nhiều đĩa không được gắn kết thành một hệ thống tập tin đơn lớn, bạn có thể sử dụng không gian bảng. Với không gian bảng, bạn có thể đặt bảng hoặc lập chỉ mục các hệ thống tệp khác nhau. Điều này có thể cải thiện tính đồng thời và cung cấp một cách dễ dàng để xử lý sự phát triển của bảng.
CREATE TABLESPACE disk2 LOCATION '/mnt/disk2/postgres';
Đọc thêm về không gian bảng tại đây.
Mạng
Mạng thường là tài nguyên ít được sử dụng nhất trên máy chủ PostgreSQL và hiếm khi được bão hòa. Nếu bạn cần mở rộng quy mô, thật dễ dàng để thêm nhiều giao diện mạng hơn, mỗi giao diện mạng có IP riêng của nó và yêu cầu PostreSQL lắng nghe tất cả chúng:
listen_addresses = '10.1.0.10,10.1.0.11'
Các máy khách sẽ phải được cân bằng tải trên tất cả các IP mà Postgreslistens trên đó.
Khác
Có một số cài đặt cấu hình khác có thể được điều chỉnh, hầu hết trong số đó sử dụng nhiều CPU hơn và bộ nhớ.
Hoạt động theo phân vùng
Postgres 10 đã giới thiệu phân vùng bảng, đã được cải thiện lên trên Postgres 11. Một số tối ưu hóa truy vấn trên các phân vùng không được bật mặc định, vì chúng có thể dẫn đến tiêu thụ CPU và bộ nhớ cao hơn. Đây là:
# allow a join between partitioned tables to be
# performed by joining the matching partitions
enable_partitionwise_join = on
# allow grouping or aggregation on a partitioned
# tables performed separately for each partition
enable_partitionwise_aggregate = on