আপনার পোস্টগ্রেএসকিএল ডিবি-র বর্তমানের চলমান ডেটা হ্যান্ডেল করার জন্য আরও র্যাম মেমরির প্রয়োজন আছে কিনা তা আপনি কীভাবে পরীক্ষা করবেন?
আপনার পোস্টগ্রেএসকিএল ডিবি-র বর্তমানের চলমান ডেটা হ্যান্ডেল করার জন্য আরও র্যাম মেমরির প্রয়োজন আছে কিনা তা আপনি কীভাবে পরীক্ষা করবেন?
উত্তর:
আপনি যদি লিনাক্সে থাকেন তবে আই / ও হ্রাস করতে আপনার মোট শারীরিক র্যামটি ডিস্কে থাকা আপনার ডাটাবেসের আকারের চেয়ে বড় হওয়া উচিত। শেষ পর্যন্ত এটি পুরো ডাটাবেসটি ওএস রিড ক্যাশে থাকবে এবং আই / ও ডিস্কে পরিবর্তনগুলি সীমাবদ্ধ করবে। আমি "du -shc $ PGDATA / বেস" চালিয়ে ডিবি আকার খুঁজতে পছন্দ করি - এই পদ্ধতিটি সমস্ত ডাটাবেসকে একক সংখ্যায় একত্রিত করে। যতক্ষণ না আপনি তার চেয়ে বড়, এটি ভাল হওয়া উচিত।
অতিরিক্তভাবে, আপনি গাদা এবং সূচক ব্লক ফেচগুলির ক্যাশে হিট রেটটি দেখতে পারেন। এগুলি পোস্টগ্রেএসকিউএল এর ভাগ করা বাফারগুলিতে হিটের হার পরিমাপ করে। সংখ্যাগুলি কিছুটা বিভ্রান্তিমূলক হতে পারে - যদিও এটি ভাগ করা বাফার্স ক্যাশে মিস হতে পারে তবে এটি ওএস রিড ক্যাশে হিট হতে পারে। তবুও, ওএস রিড ক্যাশে হিটগুলির তুলনায় ভাগ করা বাফারগুলিতে হিটগুলি এখনও কম ব্যয়বহুল (যা পরিবর্তে ডিস্কে ফিরে যাওয়ার চেয়ে কয়েক মাত্রার অর্ডার দ্বারা কম ব্যয়বহুল)।
ভাগ করা বাফার হিট রেটটি দেখার জন্য, আমি এই কোয়েরিটি ব্যবহার করি:
SELECT relname, heap_blks_read, heap_blks_hit,
round(heap_blks_hit::numeric/(heap_blks_hit + heap_blks_read),3)
FROM pg_statio_user_tables
WHERE heap_blks_read > 0
ORDER BY 4
LIMIT 25;
এটি আপনাকে শীর্ষ 25 সবচেয়ে খারাপ অপরাধীদের দেয় যেখানে সমস্ত টেবিলের জন্য বাফার ক্যাশেটি মিস করা হয় যেখানে "ডিস্ক" থেকে কমপক্ষে একটি ব্লক আনতে হয়েছিল (আবারও, যা ওএস রিড ক্যাশে অথবা প্রকৃত ডিস্ক আই / ও হতে পারে)। আপনি WHERE ধারাটিতে মান বাড়িয়ে দিতে পারেন বা খুব কম ব্যবহৃত টেবিলগুলি ফিল্টার করার জন্য heap_blks_hit এর জন্য অন্য শর্ত যুক্ত করতে পারেন।
একই আইডিক্যাল ক্যোয়ারী বিশ্বব্যাপী স্ট্রিং "হিপ" "আইডেক্স" এর পরিবর্তে প্রতি টেবিলের মোট সূচক হিট রেট পরীক্ষা করতে ব্যবহার করা যেতে পারে। প্রতি সূচক ব্রেকডাউন পেতে pg_statio_user_indexes একবার দেখুন।
ভাগ করা বাফার সম্পর্কে একটি দ্রুত নোট: লিনাক্সে এটির জন্য থাম্বের একটি ভাল নিয়মটি হল কনফিগারেশন প্যারামিটার শেয়ারড-বাফারগুলিকে র্যামের 1/4 অংশে সেট করা , তবে 8 জিবি-র বেশি নয়। এটি একটি কঠোর এবং দ্রুত নিয়ম নয়, বরং একটি সার্ভার টিউন করার জন্য একটি ভাল সূচনা পয়েন্ট। যদি আপনার ডাটাবেসটি কেবল 4 জিবি এবং আপনার একটি 32 জিবি সার্ভার রয়েছে তবে 8 জিবি শেয়ার্ড বাফারগুলি আসলে অতিরিক্ত ওভারকিল এবং আপনার এটি 5 বা 6 জিবিতে সেট করতে সক্ষম হওয়া উচিত এবং এখনও ভবিষ্যতের বিকাশের জন্য জায়গা থাকতে পারে।
আমি এই এসকিউএলটি টেবিল বনাম ডিস্ক হিট অনুপাত দেখানোর জন্য তৈরি করেছি:
-- perform a "select pg_stat_reset();" when you want to reset counter statistics
with
all_tables as
(
SELECT *
FROM (
SELECT 'all'::text as table_name,
sum( (coalesce(heap_blks_read,0) + coalesce(idx_blks_read,0) + coalesce(toast_blks_read,0) + coalesce(tidx_blks_read,0)) ) as from_disk,
sum( (coalesce(heap_blks_hit,0) + coalesce(idx_blks_hit,0) + coalesce(toast_blks_hit,0) + coalesce(tidx_blks_hit,0)) ) as from_cache
FROM pg_statio_all_tables --> change to pg_statio_USER_tables if you want to check only user tables (excluding postgres's own tables)
) a
WHERE (from_disk + from_cache) > 0 -- discard tables without hits
),
tables as
(
SELECT *
FROM (
SELECT relname as table_name,
( (coalesce(heap_blks_read,0) + coalesce(idx_blks_read,0) + coalesce(toast_blks_read,0) + coalesce(tidx_blks_read,0)) ) as from_disk,
( (coalesce(heap_blks_hit,0) + coalesce(idx_blks_hit,0) + coalesce(toast_blks_hit,0) + coalesce(tidx_blks_hit,0)) ) as from_cache
FROM pg_statio_all_tables --> change to pg_statio_USER_tables if you want to check only user tables (excluding postgres's own tables)
) a
WHERE (from_disk + from_cache) > 0 -- discard tables without hits
)
SELECT table_name as "table name",
from_disk as "disk hits",
round((from_disk::numeric / (from_disk + from_cache)::numeric)*100.0,2) as "% disk hits",
round((from_cache::numeric / (from_disk + from_cache)::numeric)*100.0,2) as "% cache hits",
(from_disk + from_cache) as "total hits"
FROM (SELECT * FROM all_tables UNION ALL SELECT * FROM tables) a
ORDER BY (case when table_name = 'all' then 0 else 1 end), from_disk desc