यदि आपके वर्तमान कार्यशील डेटा को संभालने के लिए आपके postgresql DB उदाहरण को अधिक RAM मेमोरी की आवश्यकता है, तो आप कैसे जांच करेंगे?
यदि आपके वर्तमान कार्यशील डेटा को संभालने के लिए आपके postgresql DB उदाहरण को अधिक RAM मेमोरी की आवश्यकता है, तो आप कैसे जांच करेंगे?
जवाबों:
यदि आप सभी लिनक्स पर हैं, तो 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 जीबी पर सेट करने में सक्षम होना चाहिए और अभी भी भविष्य के विकास के लिए जगह है।
मैंने इस एसक्यूएल को टेबल बनाम डिस्क हिट अनुपात दिखाने के लिए बनाया:
-- 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