अगर मेरे डीबी को अधिक रैम की आवश्यकता है, तो मैं कैसे जांच सकता हूं?


11

यदि आपके वर्तमान कार्यशील डेटा को संभालने के लिए आपके postgresql DB उदाहरण को अधिक RAM मेमोरी की आवश्यकता है, तो आप कैसे जांच करेंगे?


8
जांच करने की आवश्यकता नहीं है, आपको हमेशा अधिक रैम की आवश्यकता होती है। :)
एलेक्स हॉवान्स्की

1
प्रोग्रामिंग सवाल नहीं है, मैं इसे ServerFault में स्थानांतरित करने के लिए मतदान कर रहा हूं।
GManNickG

1
मैं डीबीए नहीं हूं, लेकिन मैं किसी भी सामान्य प्रश्न को देखकर शुरू करूंगा जो कि मर्ज नेस्टेड लूपेड के बजाय हैश में शामिल होने के किनारे पर है। कुछ db config ट्यूनिंग है जो आप कर सकते हैं कि यह प्रभावित कर सकता है कि किसी विशेष क्वेरी के लिए कितनी मेमोरी उपलब्ध है [डॉक्स की जांच करें या मेलिंग सूची मेरा सुझाव है]। यह देखने के लिए भी उपयोगी हो सकता है कि क्या आपके पास आमतौर पर इस्तेमाल की गई तालिकाओं को रखने के लिए पर्याप्त रैम है। लेकिन आखिरकार, जब तक आपका ENTIRE DB रैम में फिट नहीं हो जाता है आप अधिक उपयोग कर सकते हैं। :)

जवाबों:


14

यदि आप सभी लिनक्स पर हैं, तो I / O को कम करने के लिए आपकी कुल भौतिक रैम डिस्क पर आपके डेटाबेस के आकार से बड़ी होनी चाहिए। अंततः यह पूरा डेटाबेस OS रीड कैश में होगा और I / O डिस्क में परिवर्तन करने के लिए सीमित होगा। मैं "du -shc $ PGDATA / base" चलाकर DB आकार को खोजना पसंद करता हूं - यह विधि सभी डेटाबेस को एक ही संख्या में एकत्रित करती है। जब तक आप उससे बड़े हैं, तब तक यह ठीक होना चाहिए।

इसके अतिरिक्त, आप ढेर और इंडेक्स ब्लॉक के कैश हिट रेट को देख सकते हैं। ये PostgreSQL के साझा बफ़र्स में हिट की दर को मापते हैं। संख्या थोड़ी भ्रामक हो सकती है - भले ही यह साझा बफ़र्स कैश में एक मिस हो गया हो, यह अभी भी ओएस रीड कैश में हिट हो सकता है। फिर भी, साझा बफ़र्स में हिट ओएस रीड कैश में हिट की तुलना में अभी भी कम महंगे हैं (जो बदले में, डिस्क पर वापस जाने की तुलना में परिमाण के कुछ आदेशों से कम महंगे हैं)।

साझा बफ़र्स हिट दर को देखने के लिए, मैं इस क्वेरी का उपयोग करता हूं:

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 सबसे खराब अपराधी प्रदान करता है जहां बफर टेबल सभी तालिकाओं के लिए याद किया जाता है जहां कम से कम एक ब्लॉक को "डिस्क" (फिर से, जो या तो ओएस पढ़ा कैश या वास्तविक डिस्क I / O हो सकता है) से प्राप्त किया जाना था। आप WHERE क्लॉज में मान बढ़ा सकते हैं या शायद ही कभी उपयोग की गई तालिकाओं को फ़िल्टर करने के लिए heap_blks_hit के लिए कोई अन्य शर्त जोड़ सकते हैं।

उसी मूल प्रश्न का उपयोग प्रति तालिका कुल इंडेक्स हिट दर को "आइडल" के साथ स्ट्रिंग "हीप" को बदलने के लिए किया जा सकता है। प्रति-इंडेक्स ब्रेकडाउन पाने के लिए pg_statio_user_indexes पर एक नज़र डालें।

साझा किए गए बफ़र्स के बारे में एक त्वरित टिप्पणी: लिनक्स में इसके लिए अंगूठे का एक अच्छा नियम है कि कॉन्फ़िगरेशन पैरामीटर शेयर्ड_buffers को 1/4 RAM पर सेट किया जाए , लेकिन 8GB से अधिक नहीं। यह एक कठिन और तेज़ नियम नहीं है, बल्कि एक सर्वर को ट्यून करने के लिए एक अच्छा शुरुआती बिंदु है। यदि आपका डेटाबेस केवल 4GB का है और आपके पास 32GB सर्वर है, तो 8GB साझा बफ़र्स वास्तव में ओवरकिल है और आपको इसे 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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.