Xem và xóa bộ đệm / bộ đệm Postgres?


89

Đôi khi tôi chạy một truy vấn Postgres mất 30 giây. Sau đó, tôi ngay lập tức chạy cùng một truy vấn và mất 2 giây. Có vẻ như Postgres có một số loại bộ nhớ đệm. Tôi có thể bằng cách nào đó xem bộ nhớ cache đó đang giữ những gì không? Tôi có thể buộc xóa tất cả bộ nhớ đệm cho mục đích điều chỉnh không?

Lưu ý: Về cơ bản, tôi đang tìm kiếm phiên bản postgres của lệnh SQL Server sau:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Nhưng tôi cũng muốn biết cách xem những gì thực sự chứa trong bộ đệm đó.

Cảm ơn vì bất kì sự giúp đỡ.

Câu trả lời:


59

Bạn có thể xem những gì trong bộ đệm PostgreSQL đệm bằng cách sử dụng mô-đun pg_buffercache. Tôi đã thực hiện một bài thuyết trình có tên " Inside the PostgreSQL Buffer Cache " giải thích những gì bạn đang thấy và tôi hiển thị một số truy vấn phức tạp hơn để giúp diễn giải thông tin đi kèm với đó.

Cũng có thể xem xét bộ nhớ cache của hệ điều hành trên một số hệ thống, hãy xem [pg_osmem.py] để biết một ví dụ hơi đơn giản.

Không có cách nào để xóa bộ nhớ đệm một cách dễ dàng. Trên Linux, bạn có thể dừng máy chủ cơ sở dữ liệu và sử dụng phương tiện drop_caches để xóa bộ nhớ cache của hệ điều hành; trước tiên hãy chú ý đến cảnh báo ở đó để chạy đồng bộ hóa.


29
Có thể bỏ qua bộ nhớ đệm trong một phiên duy nhất không? Chúng ta thường cần phải kiểm tra hiệu suất truy vấn khác nhau và bộ nhớ đệm này làm cho nó rất khó để đánh giá liệu một phương pháp là tốt hơn so với khác (trừ khi so sánh hiệu suất lưu trữ!)
EvilPuppetMaster

7
Không có cách nào để bỏ qua hoặc xóa bộ nhớ cache của cơ sở dữ liệu. Tất cả những gì bạn có thể làm để xóa nó là khởi động lại máy chủ.
Greg Smith

2
Có thể hình dung được rằng điều này có thể được thực hiện, chẳng hạn như trong sự phát triển trong tương lai? Hay đây chỉ là thứ mà với các hệ thống hiện tại (PG và Linux) sẽ không thể thực hiện được nếu bạn thử?
Kuberchaun 19/12/11

9
Khi sử dụng cài đặt PostgreSQL được quản lý như Amazon RDS, người ta không có quyền truy cập vào HĐH và việc làm trống bộ đệm HĐH cho mục đích thử nghiệm có thể rất khó, vì vậy tính năng này sẽ rất có lợi trong PostgreSQL.
Samuli Pahaoja

4
Không thể tạo lại một truy vấn chậm, đó là một vấn đề, làm thế nào tôi có thể chắc chắn rằng truy vấn của tôi đang hoạt động sau một lần thực hiện? Khởi động lại máy chủ không phải là một tùy chọn Tôi đang thử nghiệm truy vấn trong prod vì chỉ cần prod có đồng thời, khóa và bản ghi đủ để tái tạo sự cố
deFreitas 23/03

21

Tôi chưa thấy bất kỳ lệnh nào để xóa bộ nhớ đệm trong PostgreSQL. Những gì bạn thấy có thể chỉ là chỉ mục bình thường và bộ nhớ cache dữ liệu được đọc từ đĩa và được lưu trong bộ nhớ. bởi cả postgresql và bộ nhớ đệm trong hệ điều hành. Để loại bỏ tất cả những điều đó, cách duy nhất tôi biết:

Điều bạn nên làm là:

  1. Shutdown máy chủ cơ sở dữ liệu (pg_ctl, sudo service postgresql stop, sudo systemctl stop postgresql, vv)
  2. echo 3 > /proc/sys/vm/drop_caches Thao tác này sẽ xóa bộ đệm tệp / khối của hệ điều hành - rất quan trọng mặc dù tôi không biết cách làm điều đó trên các hệ điều hành khác. (Trong trường hợp quyền bị từ chối, hãy thử sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"như trong câu hỏi đó )
  3. Khởi động máy chủ cơ sở dữ liệu (ví dụ sudo service postgresql start, sudo systemctl start postgresql)

1
Bạn nghĩ rằng sẽ hữu ích khi lưu ý: nếu thư mục dữ liệu của Postgres không nằm trên cùng ổ đĩa mà '/' được gắn vào, bạn có thể cần phải umount trước / sau thao tác trên (thực sự thì không chắc). Ngoài ra (có thể là một chút voodoo) hãy thử chạy 'đồng bộ hóa' trước và sau các bước đó.
marqueed

18

Câu trả lời của Greg Smith về drop_caches rất hữu ích. Tôi thấy cần phải dừng và bắt đầu dịch vụ postgresql, ngoài việc bỏ bộ nhớ đệm. Đây là một tập lệnh shell thực hiện thủ thuật. (Môi trường của tôi là Ubuntu 14.04 và PostgreSQL 9.3.)

#!/usr/bin/sudo bash

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

Tôi đã thử nghiệm với một truy vấn mất 19 giây trong lần đầu tiên và ít hơn 2 giây cho các lần thử tiếp theo. Sau khi chạy tập lệnh này, truy vấn một lần nữa mất 19 giây.


15

Tôi sử dụng lệnh này trên hộp linux của mình:

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

Nó hoàn toàn thoát khỏi bộ nhớ cache.


2
Nếu phiên bản Postgresql không phải là 9.0: sync; dịch vụ sudo dừng postgresql; echo 1> / proc / sys / vm / drop_caches; dịch vụ sudo PostgreSQL bắt đầu
rusllonrails

@rusllonrails Điều đó sẽ chỉ hoạt động nếu dịch vụ được đặt tên postgresql, có thể không đúng như vậy.
jpmc 26

Tôi nghĩ, syncnên được thực hiện sau khi dừng máy chủ, ngay trước đó drop_caches, vì Postgres có thể viết gì đó trong quá trình dừng lại.
greatvovan

8

Có, chắc chắn postgresql có bộ nhớ đệm. Kích thước được kiểm soát bởi cài đặt shared_buffers . Ngoài ra, như câu trả lời trước đã đề cập, bộ nhớ đệm tệp hệ điều hành cũng được sử dụng.

Nếu bạn muốn xem những gì trong bộ nhớ cache, có một mô-đun đóng góp được gọi là pg_buffercache có sẵn (trong đóng góp / trong cây nguồn, trong RPM đóng góp hoặc bất cứ nơi nào phù hợp với cách bạn cài đặt nó). Cách sử dụng nó được liệt kê trong tài liệu PostgreSQL tiêu chuẩn.

Không có cách nào để xóa bộ đệm ẩn ngoài bộ đệm khởi động lại máy chủ. Bạn có thể xóa bộ nhớ cache của hệ điều hành bằng lệnh được đề cập trong câu trả lời khác - miễn là hệ điều hành của bạn là Linux.


7

Tôi đã có lỗi này.

psql: /cygdrive/e/test_insertion.sql: 9: LỖI: loại tham số 53 (t_stat_gardien) không khớp với tham số khi chuẩn bị kế hoạch (t_stat_avant)

Tôi đang tìm kiếm kế hoạch hiện tại và tìm thấy điều này:

KẾ HOẠCH KHÁM PHÁ

Tôi đã có cái này giữa các lần chèn của mình và nó giải quyết được vấn đề của tôi.


2
Hủy kế hoạch không khắc phục được cho tôi, truy vấn có vẻ được lưu trong bộ nhớ cache
deFreitas

1
Cú pháp đúng là DISCARD PLANS;. Và, như tài liệu nói: "DISCARD giải phóng tài nguyên nội bộ được liên kết với một phiên cơ sở dữ liệu ".
EAmez

6

Có, có thể xóa cả bộ đệm chia sẻ bộ đệm postgres bộ đệm hệ điều hành. Giải pháp dưới đây dành cho Windows ... những người khác đã đưa ra giải pháp linux.

Như nhiều người đã nói, để xóa bộ đệm được chia sẻ, bạn chỉ cần khởi động lại Postgres (không cần khởi động lại máy chủ). Nhưng chỉ làm điều này sẽ không xóa bộ nhớ cache của hệ điều hành.

Để xóa bộ nhớ cache của hệ điều hành được Postgres sử dụng, sau khi dừng dịch vụ, hãy sử dụng Bản đồ RamMap vượt trội ( https://technet.microsoft.com/en-us/sysinternals/rammap ), từ Sysinternals Suite xuất sắc. Khi bạn thực thi RamMap, chỉ cần nhấp vào "Empty" -> "Empty Standby List" trong menu chính.

Khởi động lại Postgres và bạn sẽ thấy bây giờ truy vấn tiếp theo của bạn sẽ rất chậm do không có bộ nhớ cache nào cả.

Bạn cũng có thể thực thi RamMap mà không cần đóng Postgres và có thể sẽ có kết quả "không có bộ nhớ cache" mà bạn muốn, vì như mọi người đã nói, bộ đệm được chia sẻ thường ít tác động so với bộ đệm hệ điều hành. Nhưng đối với một bài kiểm tra đáng tin cậy, tôi muốn dừng postgres như tất cả trước khi xóa bộ nhớ cache của hệ điều hành để đảm bảo.

Lưu ý: AFAIK, tôi không khuyên bạn nên xóa những thứ khác ngoài "Danh sách chờ" khi sử dụng RamMap, vì dữ liệu khác đang được sử dụng bằng cách nào đó và bạn có thể gây ra sự cố / dữ liệu lỏng lẻo nếu bạn làm điều đó. Hãy nhớ rằng bạn đang xóa bộ nhớ không chỉ được sử dụng bởi các tệp postgres mà còn với bất kỳ ứng dụng và hệ điều hành nào khác.

Trân trọng, Thiago L.


Vui mừng nó đã giúp;)
Thiago Linhares de Oliveira

5

đây là lối tắt của tôi

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_buffercachemô-đun để xem xét shared_buffersbộ nhớ cache. Và tại một số thời điểm, tôi cần xóa bộ nhớ cache để thực hiện một số bài kiểm tra hiệu suất trên bộ nhớ cache 'lạnh' vì vậy tôi đã viết một phần mở rộng pg_dropcache thực hiện chính xác điều này. Làm ơn hãy kiểm tra nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.