Postmaster ใช้ CPU และ Disk Writes มากเกินไป


9

ใช้ PostgreSQL 9.1.2

ฉันเห็นการใช้งาน CPU มากเกินไปและมีการเขียนไปยังดิสก์จำนวนมากจากงานไปรษณีย์ สิ่งนี้เกิดขึ้นแม้ในขณะที่แอปพลิเคชันของฉันไม่ได้ทำอะไรเลย (เม็ดมีด 10 เม็ดต่อนาที) มีจำนวนการเชื่อมต่อที่เปิดอยู่อย่างไรก็ตาม

ฉันพยายามระบุว่าอะไรในแอปพลิเคชันของฉันทำให้เกิดสิ่งนี้ ฉันค่อนข้างใหม่กับ postgresql และไม่ได้ไปไกลขนาดนี้ ฉันได้เปิดใช้งานตัวเลือกการบันทึกบางอย่างในไฟล์กำหนดค่าของฉันและดูการเชื่อมต่อในตาราง pg_stat_activity แต่ทั้งหมดไม่ได้ใช้งาน การเชื่อมต่อแต่ละครั้งใช้ CPU ประมาณ 50% และกำลังเขียน ~ 15M / s ไปยังดิสก์ (ไม่ต้องอ่านอะไรเลย)

ฉันใช้พื้น postgresql.conf โดยทั่วไปแล้วมีการปรับแต่งเล็กน้อย ฉันขอขอบคุณคำแนะนำหรือคำแนะนำเกี่ยวกับสิ่งที่ฉันสามารถทำได้เพื่อติดตามเรื่องนี้

นี่คือตัวอย่างของสิ่งที่แสดงให้ฉันเห็น:

Cpu(s): 18.9%us, 14.4%sy,  0.0%ni, 53.4%id, 11.8%wa,  0.0%hi,  1.5%si,  0.0%st
Mem:  32865916k total,  7263720k used, 25602196k free,   575608k buffers
Swap: 16777208k total,        0k used, 16777208k free,  4464212k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                          
17057 postgres  20   0  236m  33m  13m R 45.0  0.1  73:48.78 postmaster                                                                                                                       
17188 postgres  20   0  219m  15m  11m R 42.3  0.0  61:45.57 postmaster                                                                                                                       
17963 postgres  20   0  219m  16m  11m R 42.3  0.1  27:15.01 postmaster                                                                                                                       
17084 postgres  20   0  219m  15m  11m S 41.7  0.0  63:13.64 postmaster                                                                                                                       
17964 postgres  20   0  219m  17m  12m R 41.7  0.1  27:23.28 postmaster                                                                                                                       
18688 postgres  20   0  219m  15m  11m R 41.3  0.0  63:46.81 postmaster                                                                                                                       
17088 postgres  20   0  226m  24m  12m R 41.0  0.1  64:39.63 postmaster                                                                                                                       
24767 postgres  20   0  219m  17m  12m R 41.0  0.1  24:39.24 postmaster                                                                                                                       
18660 postgres  20   0  219m  14m 9.9m S 40.7  0.0  60:51.52 postmaster                                                                                                                       
18664 postgres  20   0  218m  15m  11m S 40.7  0.0  61:39.61 postmaster                                                                                                                       
17962 postgres  20   0  222m  19m  11m S 40.3  0.1  11:48.79 postmaster                                                                                                                       
18671 postgres  20   0  219m  14m   9m S 39.4  0.0  60:53.21 postmaster                                                                                                                       
26168 postgres  20   0  219m  15m  10m S 38.4  0.0  59:04.55 postmaster  


Total DISK READ: 0.00 B/s | Total DISK WRITE: 195.97 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                                        
17962 be/4 postgres    0.00 B/s   14.83 M/s  0.00 %  0.25 % postgres: aggw aggw [local] idle
17084 be/4 postgres    0.00 B/s   15.53 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
17963 be/4 postgres    0.00 B/s   15.00 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
17188 be/4 postgres    0.00 B/s   14.80 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
17964 be/4 postgres    0.00 B/s   15.50 M/s  0.00 %  0.24 % postgres: aggw aggw [local] idle
18664 be/4 postgres    0.00 B/s   15.13 M/s  0.00 %  0.23 % postgres: aggw aggw [local] idle
17088 be/4 postgres    0.00 B/s   14.71 M/s  0.00 %  0.13 % postgres: aggw aggw [local] idle
18688 be/4 postgres    0.00 B/s   14.72 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
24767 be/4 postgres    0.00 B/s   14.93 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
18671 be/4 postgres    0.00 B/s   16.14 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
17057 be/4 postgres    0.00 B/s   13.58 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
26168 be/4 postgres    0.00 B/s   15.50 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle
18660 be/4 postgres    0.00 B/s   15.85 M/s  0.00 %  0.00 % postgres: aggw aggw [local] idle

อัปเดต : มีการเขียนไฟล์จำนวนมากดูเหมือนว่าจะเป็นไฟล์ชั่วคราว (?) บางไฟล์ในไดเรกทอรี $ PG_DATA / base / ความเข้าใจของฉันเกี่ยวกับโครงสร้างไฟล์ที่นี่คือแต่ละตารางจะถูกจัดเก็บเป็นไฟล์ที่มีชื่อเป็น OID ของตาราง อย่างไรก็ตามมีชื่อไฟล์tnn_nnnnnnnมากมายและเป็นไฟล์เหล่านี้ที่ดูเหมือนว่าจะเขียน (อาจเขียนทับ) อย่างต่อเนื่อง ไฟล์เหล่านี้มีไว้เพื่ออะไร? มีไฟล์ ~ 4700 และมีขนาด 8K:

-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t12_1430975
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t16_1432736
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t28_1439066
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t24_1436243
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t24_1436210
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t19_1393372
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t28_1439051
-rw-------. 1 postgres postgres     8192 Jul  3 23:08 t8_1430334

อัปเดต : การเรียกใช้ strace บนกระบวนการโพสต์มาสเตอร์โดยทั่วไปจะแสดงไฟล์ I / O เป็นจำนวนมาก:

open("base/16388/t24_1435947_fsm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435947_vm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435947", O_RDWR)  = 9
lseek(9, 0, SEEK_END)                   = 8192
ftruncate(9, 0)                         = 0
lseek(9, 0, SEEK_END)                   = 0
open("base/16388/t24_1435941", O_RDWR)  = 18
lseek(18, 0, SEEK_END)                  = 0
write(9, "\0\0\0\0\0\0\0\0\1\0\0\0000\0\360\37\360\37\4 \0\0\0\0b1\5\0\2\0\0\0"..., 8192) = 8192
lseek(18, 0, SEEK_END)                  = 0
close(9)                                = 0
open("base/16388/t24_1435947", O_RDWR)  = 9
lseek(9, 0, SEEK_END)                   = 8192
close(18)                               = 0
close(9)                                = 0
open("base/16388/t24_1435944_fsm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435944_vm", O_RDWR) = -1 ENOENT (No such file or directory)
open("base/16388/t24_1435944", O_RDWR)  = 9
lseek(9, 0, SEEK_END)                   = 0
close(9)                                = 0

ปรับปรุง : ดังนั้นปัญหานี้ดูเหมือนจะเป็นทุกอย่างที่จะทำกับตารางชั่วคราว เราเปลี่ยนการตั้งค่าเพื่อให้ตารางชั่วคราวเป็นตาราง 'ปกติ' และกิจกรรมบนดิสก์ทั้งหมดหายไปและประสิทธิภาพกลับไปสู่ตำแหน่งที่ฉันคาดไว้ ตอนนี้การเปลี่ยนแปลงนี้เป็นเพียงการทดสอบที่รวดเร็วและสกปรก: หากเราจะเปลี่ยนไปใช้ตารางปกติเรามีปัญหาเกี่ยวกับการทำงานพร้อมกันและการล้างข้อมูล ตารางชั่วคราวนั้นชั่วร้ายจริง ๆ หรือว่าเราใช้ในทางที่ผิด

ปรับปรุง : พื้นหลังบางอย่างเพิ่มเติม ฉันทำใช้ในบ้านพัฒนาคำสั่งตามตัวกลางการจำลองแบบ มันค่อนข้างเป็นผู้ใหญ่และมีการใช้งานในหลายโครงการมานานหลายปี แต่ใช้ MySQL เราได้ทำงานกับ PostgreSQL ในช่วงสองสามปีที่ผ่านมาเท่านั้น เราใช้ตารางชั่วคราวเป็นส่วนหนึ่งของกลไกการจำลองแบบ เมื่อใดก็ตามที่มีการเชื่อมต่อใหม่เราจะสร้างตารางชั่วคราวสำหรับแต่ละตารางในฐานข้อมูล ด้วยการเชื่อมต่อ 10-20 รายการ (อายุการใช้งานยาวนาน) และ ~ 50 ตารางสิ่งนี้สามารถรวมกับตารางชั่วคราวจำนวนมาก สร้างตารางชั่วคราวทั้งหมดด้วย:

CREATE TEMPORARY TABLE... ON COMMIT DELETE ROWS;

ซีแมนทิกส์ของตารางชั่วคราวนั้นเข้ากันได้ดีกับชุดการจำลองแบบของเราและทำให้รหัสจำนวนมากง่ายขึ้นที่เราต้องใช้กับ MySQL แต่ดูเหมือนว่าการนำไปใช้นั้นไม่ยุติธรรมเช่นกัน จากการค้นคว้าเล็กน้อยที่ฉันทำฉันไม่คิดว่าตารางชั่วคราวมีความหมายสำหรับฟังก์ชันที่เราใช้

ฉันไม่ใช่ผู้เชี่ยวชาญในบ้าน (ไม่แม้แต่ปิด) ในหัวข้อนี้เพียงแค่เป็นผู้ใช้ดังนั้นคำอธิบายของฉันอาจไม่แม่นยำ 100% แต่ฉันคิดว่ามันค่อนข้างใกล้เคียง


3
ความเข้าใจของคุณค่อนข้างล้าสมัยหากคุณดูเอกสารอย่างเป็นทางการคุณจะพบว่า "... สำหรับความสัมพันธ์ชั่วคราวชื่อไฟล์เป็นรูปแบบ tBBB_FFF โดยที่ BBB เป็น ID แบ็กเอนด์ของแบ็กเอนด์ที่สร้างไฟล์ และ FFF คือหมายเลขไฟล์ ... "
Milen A. Radev

ว้าวนั่นเป็นระบบย่อยของดิสก์ I / O ที่มีประสิทธิภาพ Strace พูดว่าอย่างไรเกี่ยวกับสิ่งที่คนงานกำลังทำอยู่?
womble

@ MilenA.Radev ดังนั้นดูเหมือนว่าฉันอาจจะทำอะไรแปลก ๆ / มากเกินไปกับตารางชั่วคราว สิ่งนี้น่าสนใจ ฉันมีทริกเกอร์จำนวนมากในสถานที่ที่ใช้ประโยชน์จากตารางชั่วคราว ฉันจะดูให้ใกล้ยิ่งขึ้น
wolfcastle

@ womble ฉันได้อัปเดตคำถามด้วยเอาต์พุตจาก strace
wolfcastle

คุณประสบปัญหาเรื่องประสิทธิภาพหรือไม่?
voretaq7

คำตอบ:


1

การกำหนดค่า PostgreSQL ของคุณเป็นวิธีที่ปิด สิ่งนี้น่าสงสัยจากการโพสต์ครั้งแรกของคุณ

 Cpu(s): 18.9%us, 14.4%sy,  0.0%ni, 53.4%id, 11.8%wa,  0.0%hi,  1.5%si,  0.0%st
 Mem:  32865916k total,  7263720k used, 25602196k free,   575608k buffers
 Swap: 16777208k total,        0k used, 16777208k free,  4464212k cached

จาก 32GB ในเซิร์ฟเวอร์ของคุณ ~ 25GB ฟรีไม่รวมบัฟเฟอร์ ~ 575MB

จากไฟล์ postgresql.conf ของคุณ

 shared_buffers = 32MB                   # min 128kB                               
 #temp_buffers = 8MB                     # min 800kB
 #max_prepared_transactions = 0          # zero disables the feature
 ...
 #work_mem = 1MB                         # min 64kB
 #maintenance_work_mem = 16MB            # min 1MB
 #max_stack_depth = 2MB   

ฉันสมมติว่านี่เป็นฐานข้อมูลเฉพาะ หากเป็นเช่นนั้นให้เปลี่ยนเป็นพารามิเตอร์ต่อไปนี้และรีโหลด / รีสตาร์ท

 shared_buffers = 16GB                   # min 128kB                               
 temp_buffers = 128MB                     # min 800kB
 #max_prepared_transactions = 0          # zero disables the feature
 ...
 work_mem = 8MB                         # min 64kB
 maintenance_work_mem = 64MB            # min 1MB
 max_stack_depth = 4MB   

โปรดแจ้งให้เราทราบว่าการเปลี่ยนแปลงนี้จะส่งผลต่อประสิทธิภาพของคุณได้อย่างไรและสามารถปรับได้ตามต้องการ

เกี่ยวกับตารางที่ไม่ได้ถูกบล็อกถ้าตารางชั่วคราวของคุณมีข้อมูลชั่วคราวที่ชั่วคราวและตามที่คุณกล่าวถึงจะถูกสร้างขึ้นในเซสชั่นจะดีกว่าที่จะใช้ตารางที่ไม่ถูกบล็อก

คุณสามารถตัดเซสชั่นโพสต์ตารางของคุณถ้าเป็นที่ยอมรับ

ข้อมูลเพิ่มเติมที่นี่ - http://michael.otacoo.com/postgresql-2/unlogged-table-performance-in-postgresql-9-1/

ฉันไม่แน่ใจว่าทำไมคุณต้องการตารางชั่วคราวสำหรับการจำลองแบบ คุณไม่สามารถใช้การจำลองแบบสตรีมมิ่ง PostgreSQL ได้หรือไม่


0

การใช้ตารางชั่วคราวและมีการเชื่อมต่อที่ยาวนาน (อาจเกี่ยวข้องกับการรวมการเชื่อมต่อ) อาจเป็นภาระหากเซิร์ฟเวอร์ของคุณไม่ได้เตรียมการไว้ หนึ่งพารามิเตอร์ PostgreSQL ที่คุณสามารถลองเล่นได้นั่นคือtemp_buffersการควบคุม RAM ที่จัดสรรให้กับตารางชั่วคราว บัฟเฟอร์ชั่วคราวเหล่านั้นได้รับการจัดสรรต่อการเชื่อมต่อและค่าเริ่มต้น (8MB) อาจต่ำเกินไปสำหรับไซต์ของคุณ

บางทีคุณอาจต้องเปลี่ยนลักษณะการทำงานของแอปพลิเคชันไคลเอนต์ของคุณขึ้นอยู่กับวิธีการใช้ตารางชั่วคราวของคุณ มีคำถามที่คล้ายกันด้วยคือคำตอบที่ดีในกองมากเกิน


ฉันจะต้องถามผู้เชี่ยวชาญในบ้านของฉันว่าเราพยายามปรับค่า temp_buffers หรือไม่ (เราลองสิ่งต่าง ๆ มากมาย) คำถามที่คุณชี้ไปใช้ไม่ได้จริง ๆ เพราะเราไม่ได้ใช้ตารางชั่วคราวด้วยวิธีนั้น ฉันได้อัปเดตคำถามพร้อมรายละเอียดเพิ่มเติมแล้ว
wolfcastle

ขอบคุณสำหรับการอัปเดตคำถามและสำหรับไฟล์ postgresql.conf นั่นคือสิ่งที่เราต้องพยายามปรับปรุงในสถานการณ์นี้ ผมเห็นด้วยกับคำตอบ @Chida ซึ่งใกล้เคียงกับสิ่งที่ผมแนะนำ temp_buffersWRT คุณสามารถบอกเราว่าขนาดของฐานข้อมูลที่คุณพยายามทำซ้ำมีขนาดเท่าไหร่? มีกี่ตารางขนาดเฉลี่ยต่อตารางและขนาดรวมของฐานข้อมูล
Tonin

0

คุณสามารถโพสต์ไฟล์ postgresql.conf ของคุณได้ไหม postgresql ของคุณดูเหมือนจะอยู่ภายใต้การเพิ่มประสิทธิภาพอย่างมีนัยสำคัญ

คุณสามารถโพสต์:

  • หากคุณใช้ตารางที่ไม่ถูกบล็อกสำหรับตารางชั่วคราว

  • จำนวนดิสก์และการกำหนดค่า RAID ใด


ฉันได้ใส่ไฟล์ postgresql.conf ที่นี่ ฉันเชื่อว่าคุณไม่สามารถสร้างตารางที่เป็นทั้งชั่วคราวและไม่ได้ล็อก มีดิสก์ 6 1TB ใน RAID 1 + 0 (พื้นที่เก็บข้อมูลทั้งหมด 3TB)
wolfcastle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.