PostgreSQL 教程: 检查缓存命中率

一月 18, 2024

摘要:在本教程中,您将学习如何在 PostgreSQL 中检查缓存命中率。

介绍

如果您的调查使您认为存在数据库性能问题,则应考虑分析数据库的缓存性能。PostgreSQL 数据库使用内部缓存和操作系统的页面缓存,来存储通常请求的数据。这样一来,数据库就可以在亚毫秒级的时间内从内存中提取数据,而不是从磁盘中提取数据(这可能需要几毫秒)。

PostgreSQL 在pg_statio_user_tables表中,为数据库中的所有表提供了缓存命中率统计信息。该表中有两个很有用的列:heap_blks_read定义为“从此表读取的磁盘块数”,heap_blks_hit定义为“此表中的缓冲区命中数”。

索引命中率

此查询将提供数据库缓存中的索引命中率。索引命中率在确定查询使用到索引的频率非常有用:

SELECT 100 * (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) AS index_hit_rate
  FROM pg_statio_user_indexes;

缓存命中率

大多数应用程序通常一次访问其总数据的一小部分。PostgreSQL 将经常访问的数据保存在内存中,以避免从磁盘进行低效读取。您可以在 pg_statio_user_tables 视图中查看有关它的统计信息。

一个重要的衡量标准是,在工作负载中来自内存缓存的数据与来自磁盘的数据的百分比:

SELECT
  sum(heap_blks_read) AS heap_read,
  sum(heap_blks_hit)  AS heap_hit,
  100 * sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) AS cache_hit_rate
FROM
  pg_statio_user_tables;

如果您发现自己的命中率明显低于 99%,则可能需要考虑增加数据库可用的缓存。

提高内部缓存性能

一个表的缓存命中率较低的主要原因之一是,数据库的内部缓存缓冲区中分配的空间不足。此内部缓存缓冲区用于将表行从磁盘加载到内存,如果没有足够的空间可分配,则数据库服务器将不断从磁盘获取数据。

对于 PostgreSQL 数据库,缓存缓冲区大小通过shared_buffers参数进行配置。它告诉数据库它可以分配多少计算机内存,来在内存中存储数据。默认值非常低(128 MB),因为某些内核在不更改内核设置的情况下不支持更多内存。最佳值最终取决于给定数据库的数据访问模式,但 PostgreSQL 建议,如果您使用的是专用数据库服务器,则最初应将其配置为服务器总内存的 25%。对于较大的数据库来说,更多的内存可能是有益的,但优化是有限制的,因为 PostgreSQL 数据库也使用操作系统的缓存。分配给 shared_buffers 的内存越多,可用于操作系统缓存的内存就越少。