Three Cache Layers Between Select and Disk
3 months ago
- #Performance
- #Caching
- #Postgres
- Postgres在SELECT查询和磁盘之间存在三层缓存:共享缓冲区、操作系统页缓存和磁盘。
- 共享缓冲区是Postgres自身在进程内存中的缓存,读取页面时首先检查此处。
- 操作系统页缓存是内核维护的磁盘块缓存,若数据已缓存则可减少磁盘I/O。
- 磁盘是最底层,当数据不在缓存中时才会发起实际的I/O请求。
- 过度增加共享缓冲区可能会耗尽操作系统页缓存,反而损害性能。
- Postgres的页面大小为8KB,包含头部数据、行指针和堆元组。
- work_mem参数控制排序等操作的内存分配:过小会导致磁盘溢出,过大会占用过多RAM。
- Postgres的缓存命中率仅统计共享缓冲区命中,不反映实际磁盘读取情况。
- 查询获取大量行后又丢弃会导致高IOPS和性能问题。
- Postgres的MVCC机制导致行数据分散在不同页面,增加查询时的随机I/O