我使用的是 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 上是默认的。