Четыре исхода
- hit - нужная страница уже в кеше, диск не трогается. Самый дешёвый;
- read - страницы в кеше нет, её читают с диска в свободный буфер (промах);
- dirtied - буфер изменили в памяти, теперь он «грязный» и отличается от диска;
- written - грязный буфер сбросили на диск (bgwriter, checkpointer или сам бэкенд).
Чем выше доля hit к read, тем меньше обращений к диску. Объём записей показывает нагрузку на запись.
Где смотреть
Простой срез по таблице:
SELECT heap_blks_hit, heap_blks_read
FROM pg_statio_user_tables WHERE relname = 'flights';
Подробно, с PostgreSQL 16, - pg_stat_io: разбивка по типу backend'а,
объекту и виду операции (чтения, записи, попадания, вытеснения,
расширения файла):
SELECT backend_type, object, context, reads, writes, hits
FROM pg_stat_io WHERE reads > 0 OR writes > 0;
Как читать
- много
readпосле прогрева - данные не помещаются в кеш или его вымывает большой скан (см. buffer-ring); - много
writtenбэкендами (вpg_stat_ioконтекстnormal, backend не bgwriter/checkpointer) - bgwriter не поспевает илиshared_buffersмал; - высокий hit-ratio при нагрузке - кеш работает, узкое место в другом.
Состояния - это поведение buffer-cache в цифрах. По ним судят, помог ли кеш конкретному запросу.