ZFS:PostgreSQL 的 ARC 和缓冲区缓存

ZFS:PostgreSQL 的 ARC 和缓冲区缓存

我使用的是 Ubuntu Xenial、zfs 和 PostgreSQL 9.5,目前所有更新都可用。所有测试均在 EC2 m4.xlarge(8GB RAM)和表大小 ~4GB 上进行。PostgreSQL effective_cache_size=6GB。

第一种情况:primarycache=metadata,arc_max_size=1GB(也测试了 4 和 6GB),arc_size=~160mb,但 Ubuntu 不使用 buff/cache 进行顺序扫描(free -m 显示 buff/cache=200MB 并且不会增长),而是在每次执行查询时从磁盘读取数据。因此查询非常慢。

第二种情况:primarycache=all,arc_max_size=4GB。顺序读取被缓存,但每当数据库发生更改(Postgres 从主服务器接收更新)时,缓存就会失效(我看到 Postgres 从磁盘读取数据)。

我做错了什么?

附言

cat /etc/modprobe.d/zfs.conf
options zfs zfs_prefetch_disable=1
options zfs zfs_nocacheflush=1
options zfs zfs_arc_max=7073741824

答案1

我在 zfs-discuss 和实验中所学到的知识:

  • zfs_prefetch_disable=1 - 显著降低顺序扫描的性能 - 不要禁用它
  • zfs_nocacheflush=1 - 导致数据损坏 - 不要启用它

ZFS 配置对我有用,并且对于序列读取来说甚至比 ext4 更快:

  • 记录大小=8K pg_data_95
  • 记录大小=8K pg_wal_95
  • atime=关闭 pg_data_95
  • 时间=关闭 pg_wal_95
  • 相关时间=在 pg_data_95
  • 相关时间=在 pg_wal_95
  • logbias=吞吐量 pg_data_95
  • 压缩=lz4 pg_data_95
  • 压缩=lz4 pg_wal_95
  • xattr=sa pg_data_95
  • xattr=sa pg_wal_95
  • 主缓存=元数据 pg_wal_95

我还设置了 ashift=9 以获得更好的压缩,但无论如何它在 EC2 EBS 上是默认的。

相关内容