আমার ডিবির আরও বেশি র‌্যামের দরকার আছে তা আমি কীভাবে চেক করতে পারি?


11

আপনার পোস্টগ্রেএসকিএল ডিবি-র বর্তমানের চলমান ডেটা হ্যান্ডেল করার জন্য আরও র‌্যাম মেমরির প্রয়োজন আছে কিনা তা আপনি কীভাবে পরীক্ষা করবেন?


8
চেক করার দরকার নেই, আপনার সবসময় আরও বেশি র‌্যাম দরকার। :)
অ্যালেক্স হাওয়ানস্কি

1
কোনও প্রোগ্রামিং প্রশ্ন নয়, আমি এটিকে সার্ভারফল্টে স্থানান্তরিত করার জন্য ভোট দিচ্ছি।
GManNickG

1
আমি ডিবিএ নই, তবে কোনও সাধারণ জিজ্ঞাসা দেখে নেস্ট লুপডের পরিবর্তে হ্যাশ যোগদানের প্রান্তে এসে পৌঁছতে শুরু করব। আপনি করতে পারেন এমন কিছু ডিবি কনফিগার টিউনিং রয়েছে যা কোনও নির্দিষ্ট প্রশ্নের সাথে মেমরির কতটা উপলব্ধ তা প্রভাবিত করতে পারে [ডক্স পরীক্ষা করুন বা মেইলিং তালিকাটি আমার পরামর্শ হিসাবে ইমেল করুন]। আপনার ব্যবহৃত সাধারণভাবে ব্যবহৃত টেবিলগুলি ক্যাশে রাখতে পর্যাপ্ত র্যাম রয়েছে কিনা তাও দরকারী useful তবে শেষ পর্যন্ত, আপনার ENTRE DB র‍্যামের সাথে ফিট না হলে আপনি আরও ব্যবহার করতে পারবেন। :)

উত্তর:


14

আপনি যদি লিনাক্সে থাকেন তবে আই / ও হ্রাস করতে আপনার মোট শারীরিক র‌্যামটি ডিস্কে থাকা আপনার ডাটাবেসের আকারের চেয়ে বড় হওয়া উচিত। শেষ পর্যন্ত এটি পুরো ডাটাবেসটি ওএস রিড ক্যাশে থাকবে এবং আই / ও ডিস্কে পরিবর্তনগুলি সীমাবদ্ধ করবে। আমি "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 জিবিতে সেট করতে সক্ষম হওয়া উচিত এবং এখনও ভবিষ্যতের বিকাশের জন্য জায়গা থাকতে পারে।


9

আমি এই এসকিউএলটি টেবিল বনাম ডিস্ক হিট অনুপাত দেখানোর জন্য তৈরি করেছি:

-- 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

এখানে চিত্র বর্ণনা লিখুন


1

এটি কাজ করে, যেমন হেরোকু ডকের ভাষায়:

SELECT
    'cache hit rate' AS name,
     sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) AS ratio
FROM pg_statio_user_tables;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.