PostgreSQLを使うならZFS

(Last Updated On: 2018/09/02)

PostgreSQLを使うならZFSで決まりです。数値で明らかです。ZFS以外を使うのは論外なくらいの性能差があります。

TL;DR;

PostgreSQL(他のデータベースでも)はZFSで使いましょう。

ベンチマーク環境

ハードウェア

  • CPU: Xeon E3-1230 v5 @ 3.40GHz
  • MEM: 32GB ECC
  • HDD: HGST 7200 rpm HDD – HDS721010CLA332
  • SSD: Crucial CT250MX200SSD

HDDは古く、SDDの性能も良いとは言えない物です。

ソフトウェア

  • OS: Fedora 27
  • Kernel: 4.14.8-300.fc27.x86_64
  • ZFS: ZFS on Linux 0.7.5 – zfs-0.7.5-1.fc27.x86_64
  • PostgreSQL 10 (2017/12/26 git版)

参考:FedoraでZFSを使う

pgbenchのオプション

  • スケールファクタ 100
  • クライアント 100
  • スレッド数 50
  • pgbench結果は揺れが大きいので、3回実行して最大の結果を掲載

postgresql.confの変更箇所

  • なし

ZFSオプション

  • atime=off
  • relatime=on
  • recordsize=8K
  • HDDは1台、ディスク全体をZFSに利用
  • ARC(メモリキャッシュ)サイズは8GBに制限
  • ZIL logキャッシュ(ZFSログの書き込みキャッシュ)はSSDの2GBを利用
  • L2ARCなし(SSDのデータキャッシュなし)

 

ベンチマーク:RAMディスク

/tmp (tmpfsはRAMディスク) で実行。これ以上の性能は見込めない。

 

参考ベンチマーク:Ext4 + fsync=off

PostgreSQLはfsync=offに設定するとRAMディスクと同等の性能を実現できます。このため、PostgreSQLでRAMディスクを使う意味はあまりありません。

 

ベンチマーク:Ext4

 

ベンチマーク:XFS

 

ベンチマーク:Btrfs

 

ベンチマーク:ZFS (キャッシュなし)

キャッシュなしもでZFSのパフォーマンスは約2倍の性能でExt4, XFSを圧倒しています。BtrfsはZFSには少し及びません。

 

ベンチマーク:ZFS + Logキャッシュ

SSDでZIL(ZFS Intent Log)をキャッシュすると、文字通り他のファイルシステムとは桁違い、XFSとは25倍以上、の性能差になります。HDDの信頼性とSSDの速さの良いところ取りです。

 

参考ベンチマーク:SATA5台のRAIDZ + Logキャッシュ

一般にIOPSを要求される場合、ストライピング(RAIDZ)は不利とされています。しかし、このシステムの場合、以下のようなベンチマーク結果になります。

HDDは5400rpmの静音型ですが、新しいHDD、サイズが3TB(HGSTは1TB)である点が異なります。あくまで参考数値です。

追記:動作をよく見てみると単一のディスクでは単純にスループットが頭打ちになり、よりスループットが大きくなるRAIDZの方が高性能になったという形でした。DBだからIOPS重視でミラーで、と安直に決めない方がよいです。

参考ベンチマーク:SSD上のBtrfs

SSDにログをキャッシュしているから速いのでは?と思った方も多いと思います。ファイルシステムとして高性能だったBtrfsはこのシステムのルートファイルシステムになっています。SSD+Btrfsの参考として掲載します。ZFSには少し及ばない結果でした。

 

まとめ

環境によってベンチマーク結果は異なりますが、ほぼ全ての環境でPostgreSQLを使うならZFSで決まりでしょう。

ZFS on Linuxはデフォルトで搭載メモリの半分をARC(データキャッシュ)に使います。PostgreSQLのバッファキャッシュやワークメモリも必要です。多くの場合、半分よりも少ないメモリをARCに割り当てた方が良いでしょう。今時はメモリは十分にあると思います。足りなければ追加も簡単です。

ZFSとBtrfsはファイルシステムのデータ領域のチェックサムを取って整合性を維持しています。ZFSでLogをキャッシュする場合、SSDの信頼性が気になるかも知れません。Logのキャッシュもミラーリング可能で安全に利用できます。

 

Facebook Comments
Pocket