Làm thế nào để tính toán lỗi bộ nhớ cache cho PostgreSQL


7

Tôi đang quản trị một máy chủ nơi một công cụ sử dụng PostgreSQL chạy. Công cụ này tự xử lý hầu hết các cấu hình PostgreSQL, nhưng tôi đang quan sát một số vấn đề về hiệu năng. Tôi có thể xác nhận ở cấp hệ điều hành rằng có rất nhiều I / O đang diễn ra , do đó tôi nghi ngờ rằng có rất nhiều lỗi nhớ cache đang diễn ra.

Nếu bạn tìm kiếm "cache miss" hoặc "cache miss postgresql" hoặc các tìm kiếm tương tự trên Internet, bạn sẽ tìm thấy rất nhiều tài liệu tham khảo về " thống kê cache_miss ". Nhưng không nơi nào được giải thích làm thế nào để có được chúng! Tôi hiểu rằng giá trị đó phải được tính trừ các lần truy cập khỏi các lần tìm nạp . Nhưng vì tôi không có quản trị viên DB có kinh nghiệm , tôi thực sự không hiểu với các giá trị có nghĩa là: -S

Tôi đã tìm thấy tài liệu PostgreSQL - Giám sát hoạt động cơ sở dữ liệu, nhưng tôi không chắc liệu công thức sau đây có phải là tất cả những gì tôi cần không:

cache_miss = "result_of" pg_stat_get_db_blocks_fetched(oid) - "result_of" pg_stat_get_db_blocks_hit(oid)

Một lời giải thích cho người giả sẽ được đánh giá cao.

Cảm ơn bạn trước!


Cơ sở dữ liệu lớn như thế nào? Liệu cơ sở dữ liệu phù hợp với bộ nhớ? Bạn đang kiểm tra vmstat / iuler trên một chiếc giày lạnh? Hãy nhớ rằng cơ sở dữ liệu phải được tải trong bộ nhớ trước khi bộ nhớ đệm có thể có hiệu quả.
François Beausoleil

Thật không may, DB sẽ không bao giờ phù hợp với bộ nhớ, vì nó lớn hơn 200 GB! = -Tôi không kiểm tra vmstat / iuler trên một chiếc giày lạnh và sẽ xem xét nó. Nhưng nó sẽ chỉ cho tôi nhớ bộ nhớ cache Kernel, phải không? Tôi bắt đầu nghĩ rằng bộ đệm DB bị thiếu là trường blks_read từ chế độ xem pg_stat_database
silvavlis

Câu trả lời:


1

Có một đoạn trong tài liệu của PostgreSql: ( Tại đây )

Note: pg_stat_get_blocks_fetched minus pg_stat_get_blocks_hit gives the number of kernel read() calls issued for the table, index, or database; the number of actual physical reads is usually lower due to kernel-level buffering. The *_blks_read statistics columns use this subtraction, i.e., fetched minus hit.

Điều này có thể giải thích nghi ngờ của bạn.


1

Tôi sử dụng truy vấn này để hiển thị disk x cachelượt truy cập:

-- 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

nhập mô tả hình ảnh ở đây


Chào bạn Vì vậy, "lần truy cập đĩa" của bạn vẫn có thể nhấn bộ đệm đĩa hệ điều hành phải không? Đó là, nó đánh vào bộ nhớ đệm được chia sẻ?
Duarte Carreira

Đúng! Giá trị "lần truy cập đĩa" có nghĩa là không tìm thấy bộ dữ liệu trong bộ chia sẻ của cơ sở dữ liệu. Nhưng điều đó không nhất thiết có nghĩa là db đã vào đĩa để lấy bộ dữ liệu. Đôi khi nó có thể giúp bạn có được manh mối tốt, đặc biệt khi bạn có một máy chủ chuyên dụng, nơi gần như toàn bộ bộ nhớ được dành cho các bộ chia sẻ. Trong trường hợp đó, nếu bạn có tỷ lệ phần trăm "đĩa" cao, điều đó chắc chắn có nghĩa là đã đến lúc nâng cấp bộ nhớ.
Christian

Trong trường hợp bạn có máy chủ dùng chung (và bạn không thể "dự trữ" gần như toàn bộ bộ nhớ cho bộ chia sẻ) và bạn có tỷ lệ phần trăm "lần truy cập đĩa" cao, điều đó có nghĩa là cơ sở dữ liệu đang "chạy đua" với quá trình sử dụng bộ nhớ khác và tùy thuộc vào việc sử dụng bộ nhớ (bởi các quá trình khác), có lẽ nó sẽ vào đĩa để nhận bộ dữ liệu. Vì vậy, trong trường hợp này hay trường hợp khác, bạn phải tránh tỷ lệ phần trăm "đĩa" cao.
Christian
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.