पोस्टमास्टर अत्यधिक सीपीयू और डिस्क राइट्स का उपयोग करता है


9

PostgreSQL 9.1.2 का उपयोग करना

मैं अत्यधिक सीपीयू उपयोग और पोस्टमास्टर कार्यों से डिस्क पर बड़ी मात्रा में लिखता देख रहा हूं। ऐसा तब भी होता है जब मेरा आवेदन लगभग कुछ भी नहीं कर रहा है (10s आवेषण प्रति मिनट)। हालाँकि, उचित संख्या में कनेक्शन खुले हैं।

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि मेरे आवेदन में क्या कारण है। मैं postgresql के साथ बहुत नया हूँ, और अब तक कहीं भी नहीं मिला है। मैंने अपनी कॉन्फ़िग फ़ाइल में कुछ लॉगिंग विकल्पों को चालू किया है, और pg_stat_activity टेबल में कनेक्शनों को देखा है, लेकिन वे सभी निष्क्रिय हैं। फिर भी प्रत्येक कनेक्शन ~ 50% CPU खपत करता है, और डिस्क पर (15M / s कुछ भी नहीं पढ़ रहा है) लिख रहा है।

मैं मूल रूप से बहुत कम tweaks के साथ स्टॉक postgresql.conf का उपयोग कर रहा हूं। मैं इस पर नज़र रखने के लिए मैं क्या कर सकता हूँ, इस पर कोई सलाह या संकेत देना चाहूँगा।

यहाँ एक नमूना है जो मुझे शीर्ष / iotop दिखा रहा है:

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 / आधार / निर्देशिका में कुछ अस्थायी (?) फ़ाइलों के लिए प्रतीत होती है। यहाँ फ़ाइल संरचना के बारे में मेरी समझ यह है कि प्रत्येक तालिका को मूल रूप से एक फ़ाइल के रूप में संग्रहीत किया जाता है जिसका नाम तालिका का ओआईडी है। हालाँकि, नाम की कई टन फाइलें हैं 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

अपडेट : पोस्टमास्टर प्रक्रियाओं पर स्ट्रेस चलाना मूल रूप से बहुत सारी फ़ाइल 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 बैकएंड का बैकएंड आईडी है, जिसने फ़ाइल बनाई , और एफएफएफ फाइलनोड नंबर है। ... "
मिलन ए

वाह, यह एक अच्छा प्रदर्शन डिस्क I / O सबसिस्टम है। वास्तव में श्रमिक क्या कर रहे हैं, इस बारे में स्ट्रेस क्या कहता है?
Womble

@ MilenA.Radev, इसलिए ऐसा लग रहा है कि मैं अस्थायी टेबल के साथ कुछ अजीब / अत्यधिक कर सकता हूं। यह दिलचस्प है। मेरे पास बहुत से ट्रिगर हैं जो अस्थायी तालिकाओं का उपयोग करते हैं। मैं इन पर करीब से नजर डालूंगा।
वुल्फकैसल

@womble, मैंने स्ट्रेस से आउटपुट के साथ सवाल अपडेट किया है।
भेड़चाल

क्या आप वास्तव में एक प्रदर्शन समस्या का सामना कर रहे हैं?
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जो अस्थायी तालिकाओं को आवंटित रैम को नियंत्रित करता है। उन अस्थायी बफ़र्स को प्रति कनेक्शन आवंटित किया गया है और डिफ़ॉल्ट मान (8 एमबी) शायद आपकी साइट के लिए बहुत कम है।

हो सकता है कि आपको अपने क्लाइंट एप्लिकेशन के व्यवहार को थोड़ा बदलने की आवश्यकता हो, इस पर निर्भर करता है कि आप अपने अस्थायी तालिकाओं का उपयोग कैसे करते हैं। स्टैक ओवरफ्लो पर एक अच्छा जवाब के साथ एक समान प्रश्न है ।


मुझे अपने इन-हाउस विशेषज्ञ से पूछना होगा कि क्या हमने टेम्पप_बफर्स ​​मान को समायोजित करने की कोशिश की है या नहीं (हमने बहुत सी अलग-अलग चीजों की कोशिश की)। सवाल यह है कि आप वास्तव में लागू नहीं करते हैं क्योंकि हम उस तरह से अस्थायी तालिकाओं का उपयोग नहीं कर रहे हैं। मैंने कुछ और विवरणों के साथ प्रश्न को अपडेट किया है।
wolfcastle

प्रश्न के अपडेट के लिए और postgresql.conf फ़ाइल के लिए धन्यवाद, यही हमें इस स्थिति में सुधार करने के लिए प्रयास करने की आवश्यकता है। मैं @ उत्तर के साथ सहमत हूं जो कि मैंने जो सुझाव दिया है, उसके साथ इनलाइन हैं temp_buffers। क्या आप हमें यह भी बता सकते हैं कि जिस डीबी का आकार आप दोहराने की कोशिश कर रहे हैं उसका आकार क्या है? कितनी तालिकाएँ, प्रति तालिका आकार और DB का कुल आकार?
टोनिन

0

क्या आप अपनी पोस्टग्रैसक्ल्.कॉन्फ़ फाइल कर सकते हैं? अनुकूलित के तहत आपका पोस्टग्रैक्स्ल काफी महत्वपूर्ण प्रतीत होता है।

क्या आप भी पोस्ट कर सकते हैं:

  • यदि आप अपने अस्थायी तालिकाओं के लिए अनलॉक्ड टेबल का उपयोग कर रहे हैं?

  • कितने डिस्क और किस में RAID विन्यास?


मैंने यहाँ postgresql.conf फ़ाइल डाली है । मेरा मानना ​​है कि आप एक ऐसी तालिका नहीं बना सकते हैं जो अस्थायी और अलिखित हो। RAID 1 + 0 (3TB कुल संग्रहण) में 6 1TB डिस्क हैं
wolfcastle
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.