कैशर्स / बफ़र्स देखें और साफ़ करें


89

कभी-कभी मैं एक पोस्टग्रेज क्वेरी चलाता हूं जिसमें 30 सेकंड लगते हैं। फिर, मैं तुरंत उसी क्वेरी को चलाता हूं और इसमें 2 सेकंड लगते हैं। ऐसा प्रतीत होता है कि Postgres में किसी प्रकार का कैशिंग है। क्या मैं किसी तरह देख सकता हूं कि कैश क्या है? क्या मैं सभी कैश को ट्यूनिंग प्रयोजनों के लिए साफ़ करने के लिए बाध्य कर सकता हूँ?

नोट: मैं मूल रूप से निम्नलिखित SQL सर्वर कमांड के पोस्टग्रेज संस्करण की तलाश कर रहा हूं:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

लेकिन मैं यह भी जानना चाहूंगा कि उस बफर में वास्तव में क्या है, यह कैसे देखा जाए।

किसी भी मदद के लिए धन्यवाद।

जवाबों:


59

आप देख सकते हैं कि pg_buffercache मॉड्यूल का उपयोग करके PostgreSQL बफर कैश में क्या है। मैंने " इनसाइड द पोस्टग्रीक बफर बफर " नामक एक प्रस्तुति की है जो बताती है कि आप क्या देख रहे हैं, और मैं उस जानकारी की व्याख्या करने में मदद करने के लिए कुछ और जटिल प्रश्न दिखाता हूं जो उस के साथ चलते हैं।

ऑपरेटिंग सिस्टम कैश को कुछ सिस्टम पर भी देखना संभव है, एक कुछ मोटे उदाहरण के लिए [pg_osmem.py] देखें।

कैश को आसानी से साफ़ करने का कोई तरीका नहीं है। लिनक्स पर आप डेटाबेस सर्वर को रोक सकते हैं और OS कैश को खाली करने के लिए drop_caches सुविधा का उपयोग कर सकते हैं ; पहले सिंक को चलाने के लिए चेतावनी पर ध्यान देना सुनिश्चित करें।


29
क्या केवल एक सत्र के भीतर कैशिंग को रोकना संभव है? हमें अक्सर विभिन्न प्रश्नों के प्रदर्शन की आवश्यकता होती है और यह कैशिंग यह आकलन करना बहुत कठिन बना देता है कि क्या एक विधि दूसरे की तुलना में बेहतर है (कैश्ड प्रदर्शन की तुलना के अलावा!)
EvilPuppetMaster 2

7
डेटाबेस के कैश को बायपास या फ्लश करने का कोई तरीका नहीं है। आप इसे साफ़ करने के लिए सर्वर को पुनः आरंभ कर सकते हैं।
ग्रेग स्मिथ

2
क्या यह बोधगम्य है कि यह संभव हो सकता है, उदाहरण के लिए भविष्य के विकास में? या यह सिर्फ कुछ है कि अगर मौजूदा सिस्टम (पीजी और लिनक्स) के साथ संभव नहीं होगा अगर एक कोशिश करनी थी?
कुबेरचुन

9
अमेजन आरडीएस जैसे एक प्रबंधित पोस्टग्रेक्यूएल इंस्टॉलेशन का उपयोग करते समय, किसी के पास ओएस तक पहुंच नहीं होती है, और परीक्षण उद्देश्यों के लिए ओएस कैश को खाली करना बहुत कठिन हो सकता है, इसलिए यह सुविधा पोस्टग्रेएसक्यूएल में बहुत फायदेमंद होगी।
समुली पाहौजा

4
एक धीमी क्वेरी को पुन: उत्पन्न नहीं कर सकता यह एक समस्या है, मैं यह कैसे सुनिश्चित कर सकता हूं कि मेरी क्वेरी एक ट्यूनिंग के बाद प्रदर्शन कर रही है? सर्वर को फिर से शुरू करना एक विकल्प नहीं है मैं प्रश्न का परीक्षण कर रहा हूं क्योंकि ठेस में सिर्फ
ठिकाने हैं

21

मैंने PostgreSQL में कैश फ्लश करने के लिए कोई आदेश नहीं देखा है। आप जो देख रहे हैं, वह संभवत: सामान्य सूचकांक और डेटा कैश है जिसे डिस्क से पढ़ा जा रहा है और मेमोरी में रखा गया है। OS में postgresql और caches दोनों द्वारा। उस सब से छुटकारा पाने के लिए, मेरे पास एकमात्र तरीका है:

आपको क्या करना चाहिए:

  1. शटडाउन डेटाबेस सर्वर (pg_ctl, sudo service postgresql stop, sudo systemctl stop postgresql, आदि)
  2. echo 3 > /proc/sys/vm/drop_caches यह OS फ़ाइल / ब्लॉक कैश को हटा देगा - बहुत महत्वपूर्ण है, हालांकि मुझे नहीं पता कि अन्य ओएस पर यह कैसे करना है। (अनुमति से इनकार करने के मामले में, प्रयास करेंsudo sh -c "echo 3 > /proc/sys/vm/drop_caches" के रूप में है कि प्रश्न )
  3. डाटाबेस सर्वर शुरू (उदाहरण के लिए sudo service postgresql start, sudo systemctl start postgresql)

1
सोचा कि यह नोट करना मददगार होगा: यदि पोस्टग्रैज का डेटा डायरेक्टरी उसी वॉल्यूम पर नहीं है, जिस पर '/' लगा हुआ है, तो आपको ऊपर ऑपरेशन के पहले / बाद में umount करने की आवश्यकता हो सकती है (यह निश्चित नहीं है कि कौन सा, वास्तव में)। इसके अलावा (शायद थोड़ा वूडू) उन चरणों से पहले और बाद में 'सिंक' चलाने की कोशिश करें।
marqueed

18

Drop_caches के बारे में ग्रेग स्मिथ का जवाब बहुत मददगार था। मुझे कैश को छोड़ने के अलावा पोस्टग्रेजल सेवा को बंद करना और शुरू करना आवश्यक लगा। यहाँ एक शेल स्क्रिप्ट है जो ट्रिक करती है। (मेरा वातावरण Ubuntu 14.04 और PostgreSQL 9.3 है।)

#!/usr/bin/sudo bash

service postgresql stop
sync
echo 3 > /proc/sys/vm/drop_caches
service postgresql start

मैंने एक ऐसी क्वेरी के साथ परीक्षण किया जिसमें पहली बार 19 सेकंड लगे, और बाद के प्रयासों में 2 सेकंड से भी कम। इस स्क्रिप्ट को चलाने के बाद, क्वेरी ने एक बार फिर 19 सेकंड का समय लिया।


15

मैं अपने लिनक्स बॉक्स पर इस कमांड का उपयोग करता हूं:

sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start

यह पूरी तरह से कैश से छुटकारा दिलाता है।


2
यदि Postgresql संस्करण 9.0 नहीं है: सिंक; sudo service postgresql stop; गूंज 1> / proc / sys / vm / drop_caches; sudo service postgresql start
rusllonrails

@rusllonrails केवल तभी काम करेगा जब सेवा का नाम होगा postgresql, जो मामला नहीं हो सकता है।
jpmc26

मुझे लगता है, syncसर्वर को रोकने के तुरंत बाद किया जाना चाहिए drop_caches, क्योंकि पोस्टग्रेज स्टॉप प्रोसेस के दौरान फिर से कुछ लिख सकते हैं।
greatvovan

8

हां, postgresql में निश्चित रूप से कैशिंग है। आकार को साझा शेयर्स_बफ़र्स द्वारा नियंत्रित किया जाता है । इसके अलावा, पिछले उत्तर का उल्लेख है, ओएस फ़ाइल कैश जो भी उपयोग किया जाता है।

यदि आप देखना चाहते हैं कि कैश में क्या है, तो एक कंट्रिब मॉड्यूल है जिसे pg_buffercache नाम से उपलब्ध है ( कंट्रीब्यूट में / सोर्स ट्री में, कंट्री RPM में, या जहाँ भी आपने इसे इंस्टॉल किया है उसके लिए उपयुक्त है)। इसका उपयोग कैसे करें यह मानक PostgreSQL प्रलेखन में सूचीबद्ध है।

सर्वर को पुनरारंभ करने के अलावा बफर कैश को खाली करने के लिए कोई उपाय नहीं हैं। आप ओएस कैश को अन्य उत्तर में बताए गए कमांड के साथ छोड़ सकते हैं - बशर्ते आपका ओएस लिनक्स हो।


7

मेरी यह त्रुटि थी।

psql: /cygdrive/e/test_insertion.sql: 9: ERROR: पैरामीटर 53 का प्रकार (t_stat_gardien) उस योजना से मेल नहीं खाता है जब (t_stat_avant)

मैं वर्तमान योजना और यह पाया एक निस्तब्धता के लिए देख रहा था:

DISCARD PLANS

मेरे पास मेरे आवेषण के बीच यह था और यह मेरी समस्या को हल करता है।



1
सही वाक्य विन्यास है DISCARD PLANS;। और, जैसा कि प्रलेखन में कहा गया है: "DISCARD एक डेटाबेस सत्र से जुड़े आंतरिक संसाधन जारी करता है "।
ईएमेज़

6

हां, दोनों साझा किए गए बफ़र्स कैश और OS कैश पोस्ट को साफ़ करना संभव है । समाधान bellow विंडोज के लिए है ... दूसरों ने पहले से ही लिनक्स समाधान दिया है।

जैसा कि कई लोगों ने पहले ही कहा था, साझा किए गए बफ़र्स को साफ़ करने के लिए आप पोस्टग्रेज़ को पुनः आरंभ कर सकते हैं (सर्वर को पुनरारंभ करने की कोई आवश्यकता नहीं है)। लेकिन ऐसा करने से OS कैश साफ़ नहीं होगा।

Postgres द्वारा उपयोग किए जाने वाले OS कैश को साफ़ करने के लिए, सेवा को रोकने के बाद, Excelent RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap) का उपयोग करें Sysinternals Suite से, ) का । एक बार जब आप RamMap निष्पादित करते हैं, तो मुख्य मेनू में "खाली" -> "खाली स्टैंडबाई सूची" पर क्लिक करें।

पोस्टग्रेट्स को पुनरारंभ करें और आप देखेंगे कि अब आपकी अगली क्वेरी कैश नहीं होने के कारण धीमी हो जाएगी।

आप Postgres को बंद किए बिना भी RamMap को निष्पादित कर सकते हैं, और संभवतः आपके पास "नो कैश" परिणाम होगा, क्योंकि लोग पहले से ही कहते हैं, साझा बफ़र्स आमतौर पर ओएस कैश की तुलना में बहुत कम प्रभाव देते हैं। लेकिन एक विश्वसनीय परीक्षण के लिए, मैं सुनिश्चित करने के लिए OS कैश को साफ़ करने से पहले सभी पोस्टग्रेट्स को रोकना चाहूंगा।

ध्यान दें: AFAIK, मैं अन्य चीजों को क्लीयर करने की अनुशंसा नहीं करता "रामबीज का उपयोग करते समय" स्टैंडबाय सूची के अलावा, क्योंकि अन्य डेटा किसी भी तरह से उपयोग किया जा रहा है, और आप संभावित रूप से समस्याओं / ढीले डेटा का कारण बन सकते हैं यदि आप ऐसा करते हैं। याद रखें कि आप न केवल फ़ाइलों को पोस्टग्रेस द्वारा उपयोग की जाने वाली मेमोरी को साफ़ कर रहे हैं, बल्कि किसी अन्य ऐप और ओएस के रूप में भी।

सादर, थियागो एल।


खुशी है कि यह मदद की;)
थियागो लीन्हेरेस डी ओलिवेरा

5

यह मेरा शॉर्टकट है

echo 1 > /proc/sys/vm/drop_caches; echo 2 > /proc/sys/vm/drop_caches; echo 3 > /proc/sys/vm/drop_caches; rcpostgresql stop; rcpostgresql start;

5

नहीं है pg_buffercacheमॉड्यूल की जांच के लिए shared_buffersकैश। और कुछ बिंदु पर मुझे 'ठंड' कैश पर कुछ प्रदर्शन परीक्षण करने के लिए कैश छोड़ने की आवश्यकता थी इसलिए मैंने एक pg_dropcache एक्सटेंशन लिखा जो वास्तव में ऐसा करता है। कृपया यह देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.