ดูและล้างแคช / บัฟเฟอร์ Postgres หรือไม่


90

บางครั้งฉันเรียกใช้แบบสอบถาม Postgres ใช้เวลา 30 วินาที จากนั้นฉันเรียกใช้แบบสอบถามเดียวกันทันทีและใช้เวลา 2 วินาที ดูเหมือนว่า Postgres มีแคชบางประเภท ฉันสามารถดูสิ่งที่แคชถืออยู่ได้หรือไม่? ฉันสามารถบังคับให้ล้างแคชทั้งหมดเพื่อวัตถุประสงค์ในการปรับแต่งได้หรือไม่?

หมายเหตุ: โดยพื้นฐานแล้วฉันกำลังมองหาเวอร์ชัน postgres ของคำสั่ง SQL Server ต่อไปนี้:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

แต่ฉันก็อยากรู้วิธีดูว่ามีอะไรอยู่ในบัฟเฟอร์นั้นจริงๆ

ขอบคุณสำหรับความช่วยเหลือ

คำตอบ:


60

คุณสามารถดูว่ามีอะไรอยู่ในบัฟเฟอร์แคช PostgreSQL โดยใช้โมดูล pg_buffercache ฉันได้ทำการนำเสนอชื่อ " Inside the PostgreSQL Buffer Cache " ซึ่งอธิบายถึงสิ่งที่คุณเห็นและฉันแสดงคำค้นหาที่ซับซ้อนมากขึ้นเพื่อช่วยตีความข้อมูลที่สอดคล้องกับสิ่งนั้น

นอกจากนี้ยังสามารถดูแคชของระบบปฏิบัติการในบางระบบได้เช่นกันดู [pg_osmem.py] สำหรับตัวอย่างคร่าวๆ

ไม่มีวิธีใดที่จะล้างแคชได้อย่างง่ายดาย บน Linux คุณสามารถหยุดเซิร์ฟเวอร์ฐานข้อมูลและใช้สิ่งอำนวยความสะดวกdrop_cachesเพื่อล้างแคชของระบบปฏิบัติการ อย่าลืมฟังคำเตือนเพื่อเรียกใช้การซิงค์ก่อน


29
เป็นไปได้ไหมที่จะข้ามการแคชภายในเซสชันเดียว? เรามักจะต้องทดสอบประสิทธิภาพการค้นหาที่แตกต่างกันและการแคชนี้ทำให้ยากมากที่จะประเมินว่าวิธีใดวิธีหนึ่งดีกว่าวิธีอื่น (ยกเว้นเมื่อเปรียบเทียบประสิทธิภาพการแคช!)
EvilPuppetMaster

7
ไม่มีวิธีหลีกเลี่ยงหรือล้างแคชของฐานข้อมูล สิ่งที่คุณทำได้เพื่อล้างมันคือรีสตาร์ทเซิร์ฟเวอร์
Greg Smith

2
เป็นไปได้ไหมว่าสิ่งนี้สามารถทำให้เป็นไปได้เช่นในการพัฒนาในอนาคต หรือนี่เป็นเพียงสิ่งที่ระบบปัจจุบัน (PG และ Linux) จะเป็นไปไม่ได้ถ้าจะลอง?
Kuberchaun

9
เมื่อใช้การติดตั้ง PostgreSQL ที่มีการจัดการเช่น Amazon RDS จะไม่มีสิทธิ์เข้าถึงระบบปฏิบัติการและการล้างแคช OS สำหรับการทดสอบอาจเป็นเรื่องยากมากดังนั้นคุณลักษณะนี้จะเป็นประโยชน์อย่างมากใน PostgreSQL
Samuli Pahaoja

4
ไม่สามารถสร้างคำค้นหาที่ช้าได้ซึ่งเป็นปัญหาฉันจะแน่ใจได้อย่างไรว่าแบบสอบถามของฉันทำงานหลังจากการปรับจูน การรีสตาร์ทเซิร์ฟเวอร์ไม่ใช่ตัวเลือกที่ฉันกำลังทดสอบแบบสอบถามใน prod เนื่องจากเพียงแค่ prod มีการทำงานพร้อมกันล็อกและบันทึกเพียงพอที่จะทำให้เกิดปัญหาอีกครั้ง
deFreitas

22

ฉันไม่เห็นคำสั่งใด ๆ ในการล้างแคชใน PostgreSQL สิ่งที่คุณเห็นน่าจะเป็นเพียงดัชนีปกติและแคชข้อมูลที่อ่านจากดิสก์และเก็บไว้ในหน่วยความจำ โดยทั้ง postgresql และแคชในระบบปฏิบัติการ เพื่อกำจัดสิ่งนั้นทั้งหมดวิธีเดียวที่ฉันรู้:

สิ่งที่คุณควรทำคือ:

  1. ปิดระบบเซิร์ฟเวอร์ฐานข้อมูล (pg_ctl, sudo service postgresql stop, sudo systemctl stop postgresqlฯลฯ )
  2. echo 3 > /proc/sys/vm/drop_caches สิ่งนี้จะล้างไฟล์ OS / บล็อกแคช - สำคัญมากแม้ว่าฉันจะไม่รู้วิธีทำใน OS อื่น (ในกรณีที่ไม่ได้รับอนุญาตให้ลองทำsudo sh -c "echo 3 > /proc/sys/vm/drop_caches"ตามคำถามนั้น )
  3. เริ่มต้นเซิร์ฟเวอร์ฐานข้อมูล (เช่นsudo service postgresql start, sudo systemctl start postgresql)

1
คิดว่าจะเป็นประโยชน์ที่จะทราบ: หากไดเรกทอรีข้อมูลของ Postgres ไม่ได้อยู่ในไดรฟ์ข้อมูลเดียวกันกับที่ติดตั้ง "/" คุณอาจต้องต่อจำนวนก่อน / หลังการดำเนินการด้านบน (ไม่แน่ใจว่าจริงๆแล้ว) นอกจากนี้ (อาจจะวูดูเล็กน้อย) ลองเรียกใช้ 'การซิงค์' ก่อนและหลังขั้นตอนเหล่านั้น
ประดับเครื่องหมาย

18

คำตอบของ Greg Smith เกี่ยวกับ drop_caches มีประโยชน์มาก ฉันพบว่าจำเป็นต้องหยุดและเริ่มบริการ postgresql นอกเหนือจากการปล่อยแคช นี่คือเชลล์สคริปต์ที่ทำเคล็ดลับ (สภาพแวดล้อมของฉันคือ 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

ฉันใช้คำสั่งนี้ในกล่อง linux ของฉัน:

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: sync; sudo service postgresql หยุด; เสียงสะท้อน 1> / proc / sys / vm / drop_caches; sudo service postgresql เริ่ม
rusllonrails

@rusllonrails จะใช้ได้ก็ต่อเมื่อมีการตั้งชื่อบริการpostgresqlซึ่งอาจไม่เป็นเช่นนั้น
jpmc26

ฉันคิดว่าsyncควรทำหลังจากหยุดเซิร์ฟเวอร์ทันทีก่อนหน้าdrop_cachesนี้เนื่องจาก Postgres สามารถเขียนบางอย่างในระหว่างกระบวนการหยุดได้อีกครั้ง
greatvovan

8

ใช่ postgresql มีการแคชอย่างแน่นอน ขนาดจะถูกควบคุมโดยการตั้งค่าshared_buffers นอกจากนั้นยังมีคำตอบก่อนหน้านี้คือแคชไฟล์ OS ที่ใช้ด้วย

หากคุณต้องการดูสิ่งที่อยู่ในแคชมีโมดูลการสนับสนุนที่เรียกว่าpg_buffercacheพร้อมใช้งาน (ในมีส่วน / ในแผนผังแหล่งที่มาในการสนับสนุน RPM หรือที่ใดก็ตามที่เหมาะสมกับวิธีที่คุณติดตั้ง) วิธีการใช้งานมีอยู่ในเอกสาร PostgreSQL มาตรฐาน

ไม่มีวิธีใดในการล้างแคชบัฟเฟอร์นอกจากการรีสตาร์ทเซิร์ฟเวอร์ คุณสามารถวางแคชของระบบปฏิบัติการด้วยคำสั่งที่กล่าวถึงในคำตอบอื่น ๆ - หากระบบปฏิบัติการของคุณเป็น Linux


7

ฉันมีข้อผิดพลาดนี้

psql: /cygdrive/e/test_insertion.sql: 9: ข้อผิดพลาด: ประเภทของพารามิเตอร์ 53 (t_stat_gardien) ไม่ตรงกับที่เตรียมแผน (t_stat_avant)

ฉันกำลังมองหาการล้างแผนปัจจุบันและพบสิ่งนี้:

ยกเลิกแผน

ฉันมีสิ่งนี้ระหว่างเม็ดมีดและมันช่วยแก้ปัญหาของฉันได้


2
แผนการยกเลิกไม่ได้รับการแก้ไขสำหรับฉันการค้นหายังดูแคช
deFreitas

1
DISCARD PLANS;ไวยากรณ์ที่ถูกต้องคือ และตามที่เอกสารระบุ: "DISCARD เผยแพร่ทรัพยากรภายในที่เกี่ยวข้องกับเซสชันฐานข้อมูล "
EAmez

6

ใช่เป็นไปได้ที่จะล้างทั้งบัฟเฟอร์ที่ใช้ร่วมกันแคช postgres และแคชของระบบปฏิบัติการ วิธีแก้ปัญหาสำหรับWindows ... คนอื่น ๆ ได้ให้โซลูชัน linux แล้ว

อย่างที่หลาย ๆ คนพูดไปแล้วในการล้างบัฟเฟอร์ที่แชร์คุณสามารถรีสตาร์ท Postgres ได้ (ไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์) แต่การทำเช่นนี้จะไม่ล้างแคชของระบบปฏิบัติการ

หากต้องการล้างแคช OS ที่ใช้โดย Postgres หลังจากหยุดบริการแล้วให้ใช้RamMap ที่ยอดเยี่ยม ( https://technet.microsoft.com/en-us/sysinternals/rammap ) จาก Sysinternals Suite ที่ยอดเยี่ยม เมื่อคุณรัน RamMap แล้วให้คลิก "Empty" -> "Empty Standby List" ในเมนูหลัก

รีสตาร์ท Postgres และคุณจะเห็นว่าแบบสอบถามต่อไปของคุณจะช้าเนื่องจากไม่มีแคชเลย

นอกจากนี้คุณยังสามารถรัน RamMap ได้โดยไม่ต้องปิด Postgres และอาจมีผลลัพธ์ "ไม่มีแคช" ที่คุณต้องการเนื่องจากตามที่คนทั่วไปกล่าวไปแล้วบัฟเฟอร์ที่ใช้ร่วมกันมักให้ผลกระทบเพียงเล็กน้อยเมื่อเทียบกับแคชของระบบปฏิบัติการ แต่สำหรับการทดสอบที่เชื่อถือได้ฉันอยากจะหยุด postgres ทั้งหมดก่อนที่จะล้างแคชของระบบปฏิบัติการเพื่อให้แน่ใจ

หมายเหตุ: AFAIK ฉันไม่แนะนำให้ล้างสิ่งอื่น ๆ นอกเหนือจาก "รายการสแตนด์บาย" เมื่อใช้ RamMap เนื่องจากมีการใช้ข้อมูลอื่นอยู่และคุณอาจทำให้เกิดปัญหา / ข้อมูลหลวมได้หากคุณทำเช่นนั้น โปรดจำไว้ว่าคุณกำลังล้างหน่วยความจำไม่เพียง แต่ใช้กับไฟล์ postgres เท่านั้น แต่ยังมีแอปและระบบปฏิบัติการอื่น ๆ ด้วย

ขอแสดงความนับถือ Thiago L.


ดีใจที่ได้ช่วย;)
Thiago Linhares de Oliveira

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ที่ทำสิ่งนี้ได้ โปรดตรวจสอบ


0

หากคุณมีฐานข้อมูลทดสอบโดยเฉพาะคุณสามารถตั้งค่าพารามิเตอร์: บัฟเฟอร์ที่ใช้ร่วมกันเป็น 16 ซึ่งควรปิดใช้งานแคชสำหรับการสืบค้นทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.