আমার একটি পোস্টগ্রিএসকিউএল 9.2 উদাহরণ রয়েছে যা 16 গিগাবাইট র্যাম সহ আরএইচইল 6.3, 8-কোর মেশিনে চলছে। সার্ভারটি এই ডাটাবেসে উত্সর্গীকৃত। প্রদত্ত যে ডিফল্ট postgresql.conf মেমরি সেটিংস সম্পর্কিত যথেষ্ট রক্ষণশীল, আমি ভেবেছিলাম পোস্টগ্রিসকে আরও মেমরি ব্যবহার করার অনুমতি দেওয়া ভাল ধারণা হতে পারে। আমার অবাক করার বিষয়, wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server- র পরামর্শ অনুসরণ করে আমি চালিত প্রতিটি ক্যোয়ারী উল্লেখযোগ্যভাবে কমিয়ে দিয়েছি তবে আরও জটিল প্রশ্নগুলির ক্ষেত্রে এটি স্পষ্টতই বেশি লক্ষণীয়।
আমি প্যাগটিউন চালানোর চেষ্টা করেছি যা আরও বেশি পরামিতিগুলির সাথে সুরক্ষার সাথে নিম্নলিখিত প্রস্তাবটি দিয়েছিল, তবে এতে কোনও পরিবর্তন হয়নি। এটি র্যাম আকারের 1/4 ভাগের ভাগযুক্ত_বাফারদের পরামর্শ দেয় যা অন্য কোথাও পরামর্শের সাথে সঙ্গতিপূর্ণ বলে মনে হয় (এবং বিশেষত পিজি উইকিতে)।
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
আমি সেটিংস পরিবর্তন করে (ব্যবহার করে reindex database
) পুরো ডাটাবেসটিকে পুনরায় সূচি দেওয়ার চেষ্টা করেছি , তবে এটি কোনওরকমই কাজে লাগেনি । আমি ভাগ করে নেওয়া_বাফারস এবং ওয়ার্ক_মেমের সাথে প্রায় খেলেছি। খুব রক্ষণশীল ডিফল্ট মানগুলি (128 কে / 1 এমবি) থেকে ধীরে ধীরে এগুলি পরিবর্তন করা ক্রমান্বয়ে কর্মক্ষমতা হ্রাস পেয়েছে।
আমি EXPLAIN (ANALYZE,BUFFERS)
কয়েকটি অনুসন্ধানে ছুটে এসেছি এবং অপরাধী মনে হচ্ছে হ্যাশ জোড় উল্লেখযোগ্যভাবে ধীর। কেন তা আমার কাছে পরিষ্কার নয়।
কিছু সুনির্দিষ্ট উদাহরণ দেওয়ার জন্য আমার নীচের প্রশ্নটি রয়েছে। এটি ডিফল্ট কনফিগারেশনে 2100 মিলিয়ন ডলার এবং বর্ধিত আকারের বৃদ্ধি সহ কনফিগারেশনে 00 3300ms এ চলে:
select count(*) from contest c
left outer join contestparticipant cp on c.id=cp.contestId
left outer join teammember tm on tm.contestparticipantid=cp.id
left outer join staffmember sm on cp.id=sm.contestparticipantid
left outer join person p on p.id=cp.personid
left outer join personinfo pi on pi.id=cp.personinfoid
where pi.lastname like '%b%' or pi.firstname like '%a%';
EXPLAIN (ANALYZE,BUFFERS)
উপরের প্রশ্নের জন্য:
- ডিফল্ট বাফারস: http://explain.depesz.com/s/xaHJ
- বড় বাফার: http://explain.depesz.com/s/Plk
প্রশ্নটি হল আমি বাফারের আকার বাড়ানোর সময় আমি কেন কর্মক্ষমতা হ্রাস পাচ্ছি? মেশিনটি অবশ্যই স্মৃতির বাইরে চলেছে না। ওএসে ভাগ করা মেমরিটি ( shmmax
এবং shmall
) খুব বড় মানগুলিতে সেট করা থাকলে বরাদ্দ , এটি কোনও সমস্যা হবে না। পোস্টগ্র্রেস লগতে আমি কোনও ত্রুটি পাচ্ছি না। আমি ডিফল্ট কনফিগারেশনে অটোভ্যাকুম চালাচ্ছি তবে এর সাথে কিছু করার আছে বলে আমি আশা করি না। সমস্ত কোয়েরি একই মেশিনে কয়েক সেকেন্ডের ব্যবধানে চালিত হয়েছিল, কেবল পরিবর্তিত কনফিগারেশন (এবং পুনরায় চালু করা পিজি) দিয়ে।
সম্পাদনা: আমি সবেমাত্র একটি আকর্ষণীয় তথ্য পেয়েছি: আমি যখন ২০১০-এর মাঝামাঝি আইম্যাক (ওএসএক্স 10.7.5) তে পোস্টগ্রিস 9.2.1 এবং 16 জিবি র্যামের সাথেও একই পরীক্ষা করি তখন আমি ধীর গতি অনুভব করি না। বিশেষ করে:
set work_mem='1MB';
select ...; // running time is ~1800 ms
set work_mem='96MB';
select ...' // running time is ~1500 ms
আমি যখন সার্ভারে ঠিক একই ডেটা দিয়ে ঠিক একই প্রশ্নের (উপরের একটিটি) করি তখন আমি work_mem = 1MB সহ 2100 এমএস এবং 96 এমবি সহ 3200 এমএস পাই।
ম্যাকের এসএসডি রয়েছে তাই এটি বোধগম্যভাবে দ্রুত, তবে এটি এমন একটি আচরণ প্রদর্শন করে যা আমি প্রত্যাশা করব।
আরও দেখুন pgsql-কর্মক্ষমতার উপর ফলো-আপ আলোচনা ।