PostgreSQLとbtrfs-オイルダイエット中の象

最近、 Wikiのファイルシステムに関する記事を見て、私はbtrfsに興味を持ちました。つまり、その豊富な機能、安定したステータス、そして最も重要なこと-透過的なデータ圧縮のメカニズムです。 テキスト情報を含むデータベースがどれだけ簡単に圧縮されるかを知っているので、たとえばpostgresのような使用シナリオでこれがどれだけ適用できるかを明確にしたいと思いました。



もちろん、このテストは完全であるとは言えません。読み取りだけが関係し、それは線形であるためです。 しかし、結果はすでに特定のケースでのbtrfsへの可能な移行について考えさせます。



しかし、主な目標は、それがいかに合理的であるか、そしてファイルシステムレベルでの透過的な圧縮アプローチが隠しうる落とし穴についてのコミュニティの意見を見つけることです。



時間を無駄にしたくない人のために、すぐに調査結果についてお話しします。 compress = lzoオプションを使用してbtrfsでホストされるPostgreSQLデータベースは、データベースのサイズを2つに縮小し(圧縮なしのFSと比較して)、マルチスレッドシーケンシャルリードを使用すると、ディスクサブシステムの負荷を大幅に削減します。



在庫は何ですか



物理サーバー-1台



テスト方法



したがって、2台のディスクを持つ物理マシンがあります:最初のディスクにはメインのpostgresデータベース(initdbの後)が含まれ、2番目のディスクはテスト済みのファイルシステム(ext4、btrfs lzo / zlib)にマークアップを作成せずに完全にフォーマットされています。



pg_basebackupを使用して作成された、テストに関係するバックアップコピーのテーブルスペースは、テストディスクに配置されます。 メインのpostgresデータベースも復元されます。



テストの本質は、5つのテーブルのシーケンシャルな読み取り(5つのスレッドのクローン)です。



このスクリプトは非常に単純で、単純なExplain Explainです。



各テーブルのサイズは13GBで、合計ボリュームは約65GBです。



最も単純なパラメーター「sar 1」-CPU ALL;を使用して、sarからチャートのデータを取得します。 「Sar -d 1」-I / O



開始する前に、次のコマンドを使用してページキャッシュをリセットします。



free && sync && echo 3 > /proc/sys/vm/drop_caches && free
      
      





バックグラウンドプロセスの完了を確認します。



 SELECT sa.pid, sa.state, sa.query FROM pg_stat_activity sa;
      
      





フィギュア



寸法


FS DBサイズ ディスクサイズ 圧縮係数
btrfs-zlib 156GB 35GB 4.4
btrfs-lzo 156GB 67GB 2.3
ext4 156GB 156GB 1


順次読み取り(分析の説明)


btrfs-zlib 302000ミリ秒
btrfs-lzo 262000ミリ秒
ext4 420000ミリ秒


グラフ


CPU負荷
btrfs-zlib
btrfs-lzo
ext4




IOブロック転送
btrfs-zlib
btrfs-lzo
ext4




イオ待って
btrfs-zlib
btrfs-lzo
ext4




おわりに



グラフからわかるように、lzoアルゴリズムを使用した圧縮はCPUにわずかな負荷を与えるだけであり、占有スペースの2倍の削減とある程度の加速により、このアプローチは非常に魅力的です。 Zlibはデータベースを4回押しますが、同時にCPUの負荷はすでに大幅に増加しています(CPU時間の7.5%まで)。これは、特定のシナリオでもまったく問題ありません。 ただし、btrfsは最近(カーネル3.10から)安定状態を取得したばかりであり、時期尚早に運用環境に導入することは可能です。 一方、同期レプリカを使用すると、この問題も解決されます。



PS



私の知る限り、zlibとおそらくlzoはSSE 4.2の命令を使用します。これにより、プロセッサーの負荷が軽減され、一部の仮想化環境では、プロセッサーの負荷が高くても圧縮を利用できない可能性があります。



誰かがこれに影響を与える方法を教えてくれたら、ハードウェアアクセラレーションを使用した場合と使用しない場合の違いを再確認します。



All Articles