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% सटीक नहीं हो सकता है, लेकिन मुझे लगता है कि यह बहुत करीब है।