Tình huống tôi có một cơ sở dữ liệu postgresql 9.2 được cập nhật khá nhiều mọi lúc. Do đó, hệ thống bị ràng buộc I / O và hiện tôi đang xem xét thực hiện nâng cấp khác, tôi chỉ cần một số hướng dẫn về nơi bắt đầu cải thiện.
Dưới đây là hình ảnh về tình hình trong 3 tháng qua:
Như bạn có thể thấy, cập nhật các hoạt động chiếm phần lớn việc sử dụng đĩa. Dưới đây là một hình ảnh khác về tình hình trong cửa sổ 3 giờ chi tiết hơn:
Như bạn có thể thấy, tốc độ ghi cao nhất là khoảng 20MB / s
Phần mềm
Máy chủ đang chạy Ubuntu 12.04 và postgresql 9.2. Loại cập nhật được cập nhật nhỏ thường trên các hàng riêng lẻ được xác định bởi ID. Ví dụ UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id
. Tôi đã loại bỏ và tối ưu hóa các chỉ mục nhiều nhất có thể, và cấu hình máy chủ (cả kernel linux và postgres conf) cũng được tối ưu hóa khá tốt.
Phần cứng Phần cứng là một máy chủ chuyên dụng với ram ECC 32 GB, các đĩa SAS 4x 600 GB 15.000 vòng / phút trong một mảng RAID 10, được điều khiển bởi bộ điều khiển đột kích LSI với BBU và bộ xử lý Quadcore Intel Xeon E3-1245.
Câu hỏi
- Hiệu suất được xem bởi các biểu đồ có hợp lý cho một hệ thống tầm cỡ này (đọc / ghi) không?
- Do đó, tôi có nên tập trung vào việc nâng cấp phần cứng hoặc điều tra sâu hơn vào phần mềm (tinh chỉnh kernel, confs, truy vấn, v.v.) không?
- Nếu thực hiện nâng cấp phần cứng, số lượng đĩa có phải là hiệu suất không?
------------------------------ CẬP NHẬT ------------------- ----------------
Bây giờ tôi đã nâng cấp máy chủ cơ sở dữ liệu của mình với bốn ổ SSD intel 520 thay vì các ổ đĩa 15k cũ. Tôi đang sử dụng bộ điều khiển đột kích tương tự. Mọi thứ đã được cải thiện khá nhiều, như bạn có thể thấy từ hiệu suất I / O cao nhất sau đây đã được cải thiện khoảng 6-10 lần - và điều đó thật tuyệt!. Tuy nhiên, tôi đã mong đợi một cái gì đó giống như cải thiện 20-50 lần theo các câu trả lời và khả năng I / O của SSD mới. Vì vậy, ở đây đi một câu hỏi khác.
Câu hỏi mới Có điều gì trong cấu hình hiện tại của tôi, đó là hạn chế hiệu năng I / O của hệ thống của tôi (nút thắt ở đâu)?
Cấu hình của tôi:
/etc/postgresql/9.2/main/postgresql.conf
data_directory = '/var/lib/postgresql/9.2/main'
hba_file = '/etc/postgresql/9.2/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.2/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.2-main.pid'
listen_addresses = '192.168.0.4, localhost'
port = 5432
unix_socket_directory = '/var/run/postgresql'
wal_level = hot_standby
synchronous_commit = on
checkpoint_timeout = 10min
archive_mode = on
archive_command = 'rsync -a %p postgres@192.168.0.2:/var/lib/postgresql/9.2/wals/%f </dev/null'
max_wal_senders = 1
wal_keep_segments = 32
hot_standby = on
log_line_prefix = '%t '
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 1920MB
checkpoint_completion_target = 0.7
effective_cache_size = 22GB
work_mem = 160MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 7680MB
max_connections = 400
/etc/sysctl.conf
# sysctl config
#net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
# ipv6 settings (no autoconfiguration)
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_dad=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_dad=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra_rtr_pref=0
net.ipv6.conf.all.accept_ra_pinfo=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=0
# Updated according to postgresql tuning
vm.dirty_ratio = 10
vm.dirty_background_ratio = 1
vm.swappiness = 0
vm.overcommit_memory = 2
kernel.sched_autogroup_enabled = 0
kernel.sched_migration_cost = 50000000
/etc/sysctl.d/30-postgresql-shm.conf
# Shared memory settings for PostgreSQL
# Note that if another program uses shared memory as well, you will have to
# coordinate the size settings between the two.
# Maximum size of shared memory segment in bytes
#kernel.shmmax = 33554432
# Maximum total size of shared memory in pages (normally 4096 bytes)
#kernel.shmall = 2097152
kernel.shmmax = 8589934592
kernel.shmall = 17179869184
# Updated according to postgresql tuning
Đầu ra của MegaCli64 -LDInfo -LAll -aAll
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name :
RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0
Size : 446.125 GB
Sector Size : 512
Is VD emulated : No
Mirror Data : 446.125 GB
State : Optimal
Strip Size : 64 KB
Number Of Drives per span:2
Span Depth : 2
Default Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy : Disk's Default
Encryption Type : None
Is VD Cached: No
synchronous_commit
: '
synchronous_commit = off
, sau khi đọc các tài liệu tại postgresql.org/docs/9.2/static/wal-async-commit.html . (3). Cấu hình của bạn trông như thế nào? Ví dụ. kết quả của truy vấn này:SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');