পোস্টমাস্টার অতিরিক্ত সিপিইউ এবং ডিস্ক রাইট ব্যবহার করে


9

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% সঠিক নাও হতে পারে, তবে আমি মনে করি এটি বেশ কাছাকাছি।


3
আপনার বোধগম্যতা কিছুটা পুরানো, আপনি যদি সরকারী ডকুমেন্টেশনটি দেখেন তবে আপনি দেখতে পাবেন যে "... অস্থায়ী সম্পর্কের জন্য, ফাইলটির নাম টিবিবিবি_এফএফএফ ফর্মের, যেখানে বিবিবি ফাইলটির তৈরি ব্যাকএন্ডের ব্যাকএন্ড আইডি , এবং এফএফএফ হ'ল ফাইলনোড নম্বর "" "
মাইলেন এ রাদেব

বাহ, এটি একটি ভাল সম্পাদনকারী ডিস্ক আই / ও সাবসিস্টেম। শ্রমিকরা আসলে কী করছে সে সম্পর্কে স্ট্রেস কী বলে?
দোলা

@ মিলেনা.রাদেব, সুতরাং দেখে মনে হচ্ছে অস্থায়ী টেবিলগুলি নিয়ে আমি কিছু অদ্ভুত / অতিরিক্ত কাজ করছি। এটা মজার. আমার কাছে প্রচুর ট্রিগার রয়েছে যা অস্থায়ী টেবিলগুলি ব্যবহার করে। আমি এগুলি আরও কাছাকাছি দেখব।
ওল্ফক্যাসল

@ ওম্বল, আমি স্ট্রেস থেকে আউটপুট দিয়ে প্রশ্নটি আপডেট করেছি।
ওল্ফক্যাসল

আপনি কি আসলে কোনও পারফরম্যান্স সমস্যা অনুভব করছেন?
voretaq7

উত্তর:


1

আপনার পোস্টগ্রিএসকিউএল কনফিগারেশনটি বন্ধ। এটি আপনার প্রাথমিক পোস্ট থেকে সন্দেহজনক ছিল,

 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

আপনার সার্ভারে 32 গিগাবাইটের মধ্যে, ~ 25GB er 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   

কীভাবে এটি আপনার কার্য সম্পাদনকে পরিবর্তন করে এবং প্রয়োজন অনুসারে আরও টিউন করতে পারে তা আমাকে জানান Do

আনলগ করা টেবিলগুলির বিষয়ে, যদি আপনার অস্থায়ী টেবিলগুলিতে অস্থায়ী ডেটা থাকে যা অল্পকালীন এবং আপনি যেমন উল্লেখ করেছেন, সেশনে তৈরি করা হয়েছে, অবরুদ্ধ টেবিলগুলি ব্যবহার করা আরও ভাল।

যদি তা গ্রহণযোগ্য হয় তবে আপনি সারণী পোস্ট সেশনটি কেটে ফেলতে পারবেন।

এখানে আরও তথ্য - http://michael.otacoo.com/postgresql-2/unlogged-table-performance-in-postgresql-9-1/

প্রতিলিপি জন্য আপনার টেম্প টেবিলগুলি কেন দরকার তা সম্পর্কে আমি নিশ্চিত। আপনি PostgreSQL স্ট্রিমিংয়ের প্রতিলিপি ব্যবহার করতে পারবেন না?


0

অস্থায়ী টেবিলগুলি ব্যবহার করা এবং দীর্ঘ স্থায়ী সংযোগ থাকা (সম্ভবত সংযোগ পুলিং জড়িত রয়েছে) বোঝা হতে পারে যদি আপনার সার্ভার এটি প্রস্তুত না করে। আপনি যে পোস্টগ্রিএসকিউএল প্যারামিটারটি দিয়ে খেলতে চেষ্টা করতে পারেন তা হ'ল temp_buffersঅস্থায়ী সারণীতে বরাদ্দ হওয়া র্যাম নিয়ন্ত্রণ করে। এই অস্থায়ী বাফারগুলি প্রতি সংযোগের জন্য বরাদ্দ করা হয় এবং ডিফল্ট মান (8 এমবি) সম্ভবত আপনার সাইটের জন্য খুব কম।

আপনি কীভাবে আপনার অস্থায়ী টেবিলগুলি ব্যবহার করেন তার উপর নির্ভর করে আপনার ক্লায়েন্ট অ্যাপ্লিকেশনটির আচরণের কিছুটা পরিবর্তন করতেও পারে। স্ট্যাক ওভারফ্লোতে একটি দুর্দান্ত উত্তরের সাথে একই রকম প্রশ্ন রয়েছে ।


আমি টেম্পবফার্স মানটি সামঞ্জস্য করার চেষ্টা করেছি কিনা তা সম্পর্কে আমার বাড়ির বিশেষজ্ঞকে জিজ্ঞাসা করতে হবে (আমরা প্রচুর বিভিন্ন জিনিস চেষ্টা করেছি)। আপনি যে প্রশ্নটির দিকে ইঙ্গিত করেছেন সেটি আসলে কার্যকর হয় না কারণ আমরা সেভাবে অস্থায়ী সারণীগুলি ব্যবহার করছি না। আমি আরও কিছু বিবরণ দিয়ে প্রশ্ন আপডেট করেছি।
ওল্ফকেসেল

প্রশ্নটির জন্য আপডেট এবং পোস্টগ্রেকএলএলসিএনএফ ফাইলের জন্য ধন্যবাদ, আমাদের এই পরিস্থিতিতে উন্নতির জন্য চেষ্টা করা দরকার। আমি @Chida উত্তর যা আমি কি wrt পরামর্শ দিয়ে ইনলাইন হয় তার সাথে একমত temp_buffers। আপনি যে ডিবিটির প্রতিলিপি তৈরির চেষ্টা করছেন তার আকার কী তাও বলতে পারেন? কত টেবিল, প্রতি টেবিলে গড় আকার এবং ডিবি এর মোট আকার?
টনিন

0

আপনি কি আপনার postgresql.conf ফাইল পোস্ট করতে পারেন? আপনার পোস্টগ্রেকসএলটি উল্লেখযোগ্যভাবে অনুকূলিত হয়েছে।

আপনি কি পোস্ট করতে পারেন:

  • আপনি যদি অস্থায়ী টেবিলগুলির জন্য আনলগড টেবিলগুলি ব্যবহার করছেন?

  • কত ডিস্ক এবং কোন RAID কনফিগারেশন?


আমি এখানে পোস্টগ্রেকসএলএল.কম ফাইলটি রেখেছি । আমি বিশ্বাস করি আপনি কোনও টেবিল তৈরি করতে পারবেন না যা অস্থায়ী এবং আনলগ থাকা উভয়ই। একটি RAID 1 + 0 (3TB মোট স্টোরেজ) এ 6 1TB ডিস্ক রয়েছে
উল্ফকাস্টল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.