পোস্টগ্র্রেস কেন আই / ও কোনও ফাইল ছাড়াই 95% অলস বসে আছে?


8

আমার একটি টাইলমিল / পোস্টজিআইএস স্ট্যাক একটি ওপেনস্ট্যাক ক্লাউডে একটি 8 কোর উবুন্টু 12.04 ভিএম চলছে। এটি একটি খুব অনুরূপ সিস্টেমের একটি পুনর্নির্মাণ যা গত সপ্তাহে খুব একই ধরণের হার্ডওয়্যার (একই মেঘ, তবে বিভিন্ন শারীরিক হার্ডওয়্যার, আমি বিশ্বাস করি) উপর দুর্দান্তভাবে চলছিল। আমি স্ট্যাকটি ঠিক ঠিক একইভাবে পুনর্নির্মাণের চেষ্টা করেছি (আমি তৈরি কিছু স্ক্রিপ্ট ব্যবহার করে)।

সবকিছু চলতে থাকে, তবে ডাটাবেসগুলি ধীরে ধীরে ধীরে ধীরে প্রশ্নগুলি চালাচ্ছে, যা খুব ধীরে ধীরে টাইল প্রজন্মের সাথে নিজেকে প্রকাশ করে। একটি উদাহরণ ক্যোয়ারী (অস্ট্রেলিয়ার প্রতিটি শহরে ব্যাসার্ধের মধ্যে থাকা পাবগুলির সংখ্যা গণনা করুন), যা আগে 10-20 সেকেন্ডের মতো কিছু নিয়েছিল এখন 10 মিনিটের বেশি সময় নিবে:

explain (analyze, buffers) update places set pubs = 
(select count(*) from planet_osm_point p where p.amenity = 'pub' and st_dwithin(p.way,places.way,scope)) +
(select count(*) from planet_osm_polygon p where p.amenity = 'pub' and st_dwithin(p.way,places.way,scope)) ;
 Update on places  (cost=0.00..948254806.93 rows=9037 width=160) (actual time=623321.558..623321.558 rows=0 loops=1)
   Buffers: shared hit=132126300
   ->  Seq Scan on places  (cost=0.00..948254806.93 rows=9037 width=160) (actual time=68.130..622931.130 rows=9037 loops=1)
         Buffers: shared hit=132107781
         SubPlan 1
           ->  Aggregate  (cost=12.95..12.96 rows=1 width=0) (actual time=0.187..0.188 rows=1 loops=9037)
                 Buffers: shared hit=158171
                 ->  Index Scan using planet_osm_point_index on planet_osm_point p  (cost=0.00..12.94 rows=1 width=0) (actual time=0.163..0.179 rows=0 loops=9037)
                       Index Cond: (way && st_expand(places.way, (places.scope)::double precision))
                       Filter: ((amenity = 'pub'::text) AND (places.way && st_expand(way, (places.scope)::double precision)) AND _st_dwithin(way, places.way, (places.scope)::double precision))
                       Buffers: shared hit=158171
         SubPlan 2
           ->  Aggregate  (cost=104917.24..104917.25 rows=1 width=0) (actual time=68.727..68.728 rows=1 loops=9037)
                 Buffers: shared hit=131949237
                 ->  Seq Scan on planet_osm_polygon p  (cost=0.00..104917.24 rows=1 width=0) (actual time=68.138..68.716 rows=0 loops=9037)
                       Filter: ((amenity = 'pub'::text) AND (way && st_expand(places.way, (places.scope)::double precision)) AND (places.way && st_expand(way, (places.scope)::double precision)) AND _st_dwithin(way, places.way, (places.scope)::double precision))
                       Buffers: shared hit=131949237
 Total runtime: 623321.801 ms

(আমি এই কোয়েরিটিকে একটি লক্ষণ হিসাবে অন্তর্ভুক্ত করছি, সমস্যার সমাধান করার জন্য সরাসরি নয় particular এই বিশেষ ক্যোয়ারীটি সপ্তাহে বা আরও একবার চালানো হয়))

সার্ভারে র‌্যামি 32 গিগাবাইট রয়েছে, এবং আমি পোস্টগ্র্রেসটি নীচের অনুসারে কনফিগার করেছি (ওয়েবে প্রাপ্ত নিম্নলিখিত পরামর্শগুলি):

shared_buffers = 8GB
autovacuum = on
effective_cache_size = 8GB
work_mem = 128MB
maintenance_work_mem = 64MB
wal_buffers = 1MB
checkpoint_segments = 10

iostat কিছুই পড়ছে না, কিছুটা ডেটা লিখিত হয়েছে (কোথায় বা কেন হয় না) এবং 95% নিষ্ক্রিয় সিপিইউ দেখায়:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.40    0.00    0.00    0.11    0.00   94.49

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               0.20         0.00         0.80          0          8
vdb               2.30         0.00        17.58          0        176

থেকে নমুনা আউটপুট vmstat:

  procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
...
 1  0      0 18329748 126108 12600436    0    0     0    18  148  140  5  0 95  0
 2  0      0 18329400 126124 12600436    0    0     0     9  173  228  5  0 95  0

স্ট্রচে আটকে আমি পোস্টগ্র্রেস ডেটা ডিরেক্টরিটি ভিডিএ থেকে ভিডিবিতে স্থানান্তরিত করেছি তবে অবশ্যই এতে কোনও পার্থক্য হয়নি।

তাই আমি ক্ষতিতে আছি। পোস্টগ্র্রেস কেন কেবলমাত্র 5% উপলব্ধ সিপিইউ ব্যবহার করে যখন এটি কোনও আই / ও এর জন্য অপেক্ষা না করে? আমি আরও তদন্ত, অন্য সরঞ্জাম, চেষ্টা করার এলোমেলো জিনিসগুলির জন্য যে কোনও পরামর্শকে স্বাগত জানাব।

হালনাগাদ

আমি সার্ভারটি স্ন্যাপশট করে এটিকে একই মেঘের ভিন্ন অংশে (একটি ভিন্ন প্রাপ্যতা অঞ্চল) চালু করেছিলাম। ফলাফলগুলি কিছুটা অদ্ভুত ছিল। vmstatএই সার্ভারে 12% সিপিইউ ব্যবহারের রিপোর্ট করেছে (যা আমি এখন 8 টি ভিও ভিএম-তে একক পোস্টগ্রিজ ক্যোয়ারির জন্য প্রত্যাশিত মান হিসাবে বুঝতে পারি) - যদিও প্রকৃত ক্যোয়ারী এক্সিকিউশন সময়টি কার্যত অভিন্ন (630 সেকেন্ড বনাম 623)।

আমি এখন বুঝতে পারি যে এই বিশেষ ক্যোয়ারী সম্ভবত এই কারণে ভাল নমুনা নয়: এটি কেবলমাত্র একটি কোর ব্যবহার করতে পারে, এবং এটি একটি update(যেখানে টাইল রেন্ডারিং কেবলমাত্র select)।

আমি এটাও লক্ষ্য করিনি explainযে দৃশ্যত planet_osm_polygonকোনও সূচক ব্যবহার করছে না। এটি কারণ হতে পারে, তাই আমি এটি পরবর্তী তাড়া করব।

Update2

সমস্যাটি স্পষ্টতই মনে হচ্ছে যে গ্রহ_সম_পলিগন সূচক (এস) ব্যবহার করা হচ্ছে না / হচ্ছে। দুটি আছে (একটি osm2pgsql দ্বারা তৈরি, একটি এলোমেলো গাইড অনুসরণ করে আমার দ্বারা নির্মিত):

CREATE INDEX idx_planet_osm_polygon_tags
  ON planet_osm_polygon
  USING gist
  (tags);


CREATE INDEX planet_osm_polygon_pkey
  ON planet_osm_polygon
  USING btree
  (osm_id);

প্ল্যানেট_সোম_পলিগন এবং গ্রহ_সোম_পয়েন্টের পরিসংখ্যানগুলি বেশ প্রকাশ করে, আমার মনে হয়:

planet_osm_polygon:

Sequential Scans    194204  
Sequential Tuples Read  60981018608 
Index Scans 1574    
Index Tuples Fetched    0

planet_osm_point:

Sequential Scans    1142    
Sequential Tuples Read  12960604    
Index Scans 183454  
Index Tuples Fetched    43427685

যদি আমি এটি সঠিকভাবে পড়ে থাকি তবে পোস্টগ্রিস 1574 বার গ্রহ_সম_পলিগন অনুসন্ধান করেছে, কিন্তু বাস্তবে কখনও কিছুই খুঁজে পেল না, তাই একটি হাস্যকরভাবে বিপুল সংখ্যক নৃশংস অনুসন্ধান করেছে।

নতুন প্রশ্ন: কেন?

রহস্য সমাধান

ফ্রেডেরিক র্যামের উত্তরের জন্য ধন্যবাদ , উত্তরটি মোটামুটি সহজ বলে প্রমাণিত হয়েছে: কোনও কারণে কোনও স্থানিক সূচক ছিল না। এগুলি পুনরায় জন্মানোতে তুচ্ছ ছিল:

create index planet_osm_polygon_polygon on planet_osm_polygon using gist(way);
create index planet_osm_polygon_point on planet_osm_point using gist(way);

এই ক্যোয়ারীটি চালাতে এখন 4.6 সেকেন্ড সময় লাগে। স্থানিক সূচকের বিষয়টি! :)


আমি বুঝতে পারি যে এই এন্ট্রিটি বেশ পুরানো, তবে আমি একই ধরণের সমস্যাটি ভোগ করছি। সূচকটি ইতিমধ্যে বিদ্যমান থাকায় আমি দুইবার গ্রহ_সম_পলিগন_পয়েন্ট তৈরি করতে পারি না। তবে সূচকে কী বলা হয় তা সত্য নয়?
সেবাস্তিয়ান বোর্গ্রায়ে

আচ্ছা সূচকটি যদি বিদ্যমান থাকে তবে আপনি কেন অন্য একটি তৈরি করতে চান? তবে যে কোনও ক্ষেত্রে আপনি পুরানোটিকে বাদ দিতে পারেন বা নতুনটির নাম পরিবর্তন করতে পারেন।
স্টিভ বেনেট

আমি কেবল উভয় সূচকেই জিজ্ঞাসা করছি: গ্রিটি_সোম_পলিগোনকে গিস্ট (উপায়) ব্যবহার করে সূচী_গ্রহ_পলিগন_পয়েন্ট তৈরি করুন; সূচক (উপায়) ব্যবহার করে গ্রহ_মাস_পয়েন্টে সূচী গ্রহ_সোম_পলিয়োন_পয়েন্ট তৈরি করুন; গ্রহ_সাম_পলিগন_পয়েন্ট নামকরণ করা হয়েছে, যা আমার কিছু মিস না হলে এটিকে ভুল বলে মনে হচ্ছে।
সেবাস্তিয়ান বোর্গ্রেউ

উহু! বুঝলাম না। হ্যাঁ আমার উত্তরে একটি টাইপো আছে।
স্টিভ বেনেট

ধন্যবাদ স্টিভ, আপনি ভবিষ্যতের রেফারেন্সের জন্য আপনার উত্তরটিতে টাইপও সংশোধন করতে পারেন। ধন্যবাদ।
সেবাস্তিয়ান বোর্গ্রেউ

উত্তর:


4

আপনার বিশ্লেষণ.ডেপস.কম.কমের মাধ্যমে অ্যানেলিজ আউটপুটটি চালানো হাইলাইট করে যে স্লোনেসের বেশিরভাগ অংশ এই ক্রিয়া থেকে আসে:

Seq Scan on planet_osm_polygon p 

এর আগে কি সূচি ছিল? আপনি এখন এটি সূচক করতে পারেন?

এই সমস্যার ক্ষেত্রটি অনুসন্ধান করে আমি একটি ওপেন স্ট্রিট ম্যাপ সাইটে একটি সম্পর্কিত প্রশ্নোত্তরও পেয়েছি:


এটি নির্দেশ করার জন্য ধন্যবাদ - আমি এটি মিস করেছি। এই টেবিলে আসলে দুটি সূচী রয়েছে। আরও তথ্যের সাথে আমার প্রশ্ন আপডেট করা।
স্টিভ বেনেট

ওহ - সেই লিঙ্কটির উত্তর ছিল। হ্যাঁ, "সূচক" থাকলেও এটি কেবল আইডি ক্ষেত্রেই ছিল, আসল জ্যামিতি ক্ষেত্রটি নয় ("উপায়") - তাই স্থানিক সূচকগুলির জন্য এতটাই বেহুদা। ফ্রেডেরিকের মন্তব্যে এর উত্তর রয়েছে।
স্টিভ বেনেট

4

পোস্টগ্রিএসকিউএল যে কোনও প্রদত্ত ক্যোয়ারির জন্য কেবল একটি কোর ব্যবহার করতে পারে। এটি অনেকগুলি সমসাময়িক প্রশ্নের সাথে ভাল সমান্তরাল পারফরম্যান্স অর্জন করে, তবে কেবলমাত্র বেশ কয়েকটি বড় কোয়েরিগুলির কাজের চাপের জন্য বৃহত্তর মূল সংখ্যাগুলি থেকে উপকৃত হয় না। সুতরাং আপনি যদি কেবল একটি একক ক্যোয়ারী চালিয়ে যাচ্ছেন যে 5% এত বিস্ময়কর নয়, যদিও আমি এটি 8-কোর সিস্টেমে 12% হওয়ার আশা করব।

আইওয়েটের অভাব পরামর্শ দেয় যে এটি সম্ভবত ডিস্ক I / O এর জন্য ক্ষতিগ্রস্থ হচ্ছে না।

সুতরাং - এটি সিপিইউতে বা আই / ও-তে কোনও বাধা নেই বলে মনে হচ্ছে না।

লক দ্বারা কি কোয়েরিটি কেবল সময়ের জন্য অবরুদ্ধ করা সম্ভব? pg_stat_activityক্যোয়ারির জন্য চেক করুন এবং pg_locksমঞ্জুরিপ্রাপ্ত কোনও লক রয়েছে কিনা তা দেখার জন্য যোগ দিন । (পিজি লক পর্যবেক্ষণের বিষয়ে ক্যানড প্রশ্ন রয়েছে)।

পরবর্তী কাজটি হ'ল কয়েকটি নিম্ন স্তরের সিস্টেম পরীক্ষা চালানো। চালান pg_test_fsync, সিসবেঞ্চের সিপিইউ এবং আই / ও পরীক্ষাগুলি ইত্যাদি ব্যবহার করুন these এগুলি যদি খারাপভাবেও সম্পাদন করে তবে এটি আপনার হোস্টিং সরবরাহকারীর সাথে উত্থাপন করুন।

perf top -aআপনারও কিছুটা আউটপুট সংগ্রহ করা উচিত , দেখুন এটি আসলে কী করছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.