PostgreSQL 9.1.2 ব্যবহার করে
আমি পোস্টমাস্টারের কাজগুলি থেকে অতিরিক্ত সিপিইউ ব্যবহার এবং ডিস্কে প্রচুর পরিমাণে রাইট দেখছি। যদিও আমার অ্যাপ্লিকেশনটি প্রায় কিছুই করছে না (মাইন প্রতি 10 টি সন্নিবেশ করায়) while যুক্তিসঙ্গতগুলির একটি যুক্তিসঙ্গত সংখ্যা খোলা আছে।
আমি আমার অ্যাপ্লিকেশনটিতে কী ঘটছে তা নির্ধারণ করার চেষ্টা করছি। আমি পোস্টগ্রেস্কল নিয়ে বেশ নতুন, আর এখন পর্যন্ত কোথাও পাইনি। আমি আমার কনফিগার ফাইলে কিছু লগিং অপশন চালু করেছি এবং pg_stat_activity টেবিলের সংযোগগুলি দেখেছি, তবে সেগুলি সব অলস। তবুও প্রতিটি সংযোগ ~ 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
আপডেট : ফাইল লেখার অনেকগুলি পিজি_ডাটা / বেস / ডিরেক্টরিতে কিছু অস্থায়ী (?) ফাইলের কাছে মনে হয়। এখানে ফাইলের কাঠামো সম্পর্কে আমার বুঝতে হবে যে প্রতিটি টেবিলটি মূলত একটি ফাইল হিসাবে সঞ্চিত থাকে যার নাম টেবিলের OID। যাইহোক, এখানে অনেকগুলি ফাইলের নামকরণ করা হয়েছে tnn_nnnnnnn
এবং এই ফাইলগুলিই নিয়মিতভাবে লিখিত হতে পারে বলে মনে হয় perhaps এই ফাইলগুলি কিসের জন্য? ফাইলগুলির মধ্যে 00 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
আপডেট : সুতরাং এই সমস্যাটি অস্থায়ী টেবিলগুলির সাথে করার মতো সমস্ত কিছু বলে মনে হচ্ছে। আমরা আমাদের সেটআপটি পরিবর্তন করেছি যাতে অস্থায়ী টেবিলগুলি 'নিয়মিত' সারণী হয় এবং সমস্ত ডিস্ক ক্রিয়াকলাপ চলে যায় এবং আমি যেখানে আশা করেছি সেখানে পারফরম্যান্স ফিরে আসে। এখন, এই পরিবর্তনটি কেবল একটি দ্রুত এবং নোংরা পরীক্ষা ছিল: আমরা যদি নিয়মিত সারণীগুলি ব্যবহার করতে সত্যিই পরিবর্তন করতে চলেছি তবে আমাদের সম্মতি এবং সাফাইয়ের সমস্যা রয়েছে। অস্থায়ী টেবিলগুলি কি আসলেই সেই মন্দ, না আমরা তাদের গালি দিচ্ছি?
আপডেট : আরও কিছু পটভূমি। আমি ঘরে বসে উন্নত বিবৃতি ভিত্তিক রেপ্লিকেশন মিডলওয়্যার ব্যবহার করছি । এটি বেশ পরিপক্ক এবং বেশ কয়েক বছর ধরে বেশ কয়েকটি প্রকল্পে ব্যবহৃত হচ্ছে তবে মাইএসকিউএল ব্যবহার করছে। আমরা কেবল পোস্টগ্র্রেএসকিউএল নিয়ে গত দু'বছর ধরে কাজ করছি। আমরা অনুলিপি প্রক্রিয়াটির অংশ হিসাবে অস্থায়ী টেবিলগুলি মূলত ব্যবহার করছিলাম। যখনই কোনও নতুন সংযোগ স্থাপন করা হয়, আমরা ডাটাবেসে প্রতিটি টেবিলের জন্য একটি অস্থায়ী টেবিল তৈরি করি। 10-20 (দীর্ঘকালীন) সংযোগ এবং ~ 50 টেবিলের সাহায্যে এটি অনেকগুলি অস্থায়ী টেবিলের পরিমাণ হতে পারে। সমস্ত অস্থায়ী টেবিলগুলি এর সাথে তৈরি হয়েছিল:
CREATE TEMPORARY TABLE... ON COMMIT DELETE ROWS;
অস্থায়ী টেবিলগুলির শব্দার্থবিজ্ঞানগুলি আমাদের প্রতিলিপি স্কিমের সাথে খুব ভাল ফিট করে এবং মাইএসকিউএল এর জন্য আমাদের যে কোডটি ব্যবহার করতে হয়েছিল তার অনেকগুলি সরল করে দিয়েছে, তবে দেখে মনে হচ্ছে এটি বাস্তবায়নও যথাযথ হয়নি। আমি যে গবেষণাটি করেছি তা থেকে, আমি মনে করি না যে অস্থায়ী টেবিলগুলি আমরা যে ফাংশনটির জন্য সেগুলি ব্যবহার করেছিলাম তার জন্য আসলেই বোঝানো হয়েছিল।
আমি এই বিষয়টির অভ্যন্তরীণ বিশেষজ্ঞ (এমনকি নিকটবর্তীও) নই, এটির কেবল একজন ব্যবহারকারী, সুতরাং আমার ব্যাখ্যাটি 100% সঠিক নাও হতে পারে, তবে আমি মনে করি এটি বেশ কাছাকাছি।