สถานการณ์ ฉันมีฐานข้อมูล postgresql 9.2 ซึ่งค่อนข้างมีการปรับปรุงอย่างมากตลอดเวลา ระบบจึงถูก จำกัด ด้วย I / O และตอนนี้ฉันกำลังพิจารณาที่จะอัพเกรดอีกครั้งฉันแค่ต้องการทิศทางที่จะเริ่มปรับปรุง
นี่คือภาพว่าสถานการณ์ดู 3 เดือนที่ผ่านมาได้อย่างไร:
อย่างที่คุณเห็นอัปเดตบัญชีการปฏิบัติงานสำหรับการใช้งานดิสก์ส่วนใหญ่ นี่เป็นอีกภาพของการมองสถานการณ์ในหน้าต่าง 3 ชั่วโมงที่มีรายละเอียดมากขึ้น:
อย่างที่คุณเห็นอัตราการเขียนสูงสุดคือประมาณ 20MB / s
ซอฟต์แวร์
เซิร์ฟเวอร์กำลังใช้งาน Ubuntu 12.04 และ postgresql 9.2 ประเภทของการอัปเดตจะมีการอัปเดตขนาดเล็กตามปกติในแต่ละแถวที่ระบุโดย ID UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id
เช่น ฉันได้ลบและปรับดัชนีให้มากที่สุดเท่าที่ฉันคิดว่าเป็นไปได้และการกำหนดค่าเซิร์ฟเวอร์ (ทั้งเคอร์เนล linux และ postgres conf) ก็ปรับให้เหมาะสมเช่นกัน
ฮาร์ดแวร์ ฮาร์ดแวร์เป็นเซิร์ฟเวอร์เฉพาะที่มี 32GB ECC ram, 4x 600GB 15.000 รอบต่อนาทีดิสก์ SAS ในอาร์เรย์ RAID 10 ควบคุมโดย LSI RAID คอนโทรลเลอร์ที่มี BBU และโปรเซสเซอร์ Intel Xeon E3-1245 Quadcore
คำถาม
- ประสิทธิภาพการทำงานของกราฟนั้นสมเหตุสมผลสำหรับระบบที่มีความสามารถนี้ (อ่าน / เขียน) หรือไม่?
- ดังนั้นฉันจึงควรมุ่งเน้นไปที่การอัพเกรดฮาร์ดแวร์หรือตรวจสอบลึกเข้าไปในซอฟต์แวร์ (เคอร์เนล tweaking, confs, แบบสอบถาม ฯลฯ )?
- หากทำการอัปเกรดฮาร์ดแวร์หมายเลขดิสก์จะมีผลต่อประสิทธิภาพหรือไม่
------------------------------ UPDATE ------------------- ----------------
ตอนนี้ฉันได้อัพเกรดเซิร์ฟเวอร์ฐานข้อมูลของฉันด้วย Intel 520 SSD สี่ตัวแทนที่จะเป็นดิสก์ SAS ขนาด 15k ตัวเก่า ฉันกำลังใช้ตัวควบคุมการโจมตีตัวเดียวกัน สิ่งต่าง ๆ ได้รับการปรับปรุงให้ดีขึ้นมากอย่างที่คุณเห็นจากประสิทธิภาพการทำงานของ I / O ที่ดีขึ้นดังต่อไปนี้ดีขึ้นประมาณ 6-10 ครั้ง - และนั่นยอดเยี่ยมมาก! อย่างไรก็ตามฉันคาดหวังว่าจะมีการปรับปรุงให้ดีขึ้นกว่า 20-50 เท่าตามคำตอบและความสามารถของ I / O ของ SSD ใหม่ ดังนั้นที่นี่คำถามอื่นไป
คำถามใหม่ มีบางสิ่งในการกำหนดค่าปัจจุบันของฉันซึ่ง จำกัด ประสิทธิภาพของ I / O ของระบบของฉัน (ซึ่งเป็นคอขวด)
การกำหนดค่าของฉัน:
/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
ผลผลิตของ 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
: 'Asynchronous กระทำเป็นตัวเลือกที่ช่วยให้การทำธุรกรรมเสร็จเร็วขึ้นในราคาที่การทำธุรกรรมล่าสุดอาจหายไปหากฐานข้อมูลควรผิดพลาด'
synchronous_commit = off
หลังจากที่ได้อ่านเอกสารที่postgresql.org/docs/9.2/static/wal-async-commit.html (3) การกำหนดค่าของคุณมีลักษณะอย่างไร เช่น. ผลการค้นหานี้:SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');