web-dev-qa-db-ja.com

Gluster + ZFS、ベンチマーク中のデッドロック:zfs_iput_taskq 100%cpu

最初の背景:私はPHPWebアプリケーションを実行している会社で働いています。いくつかのウェブサーバーにNFS経由でマウントされたストレージバックエンドがあります。今日、1つのWebサーバーがNFSを介してファイルを書き込むと、数分後までファイルが他のマウントされたクライアントに表示されないという問題が発生します。また、冗長ではないため、「目に見えない」メンテナンスを実行することはできません。

私はGlusterFSソリューション(冗長性のために2つまたは3つの複製されたブリック/マシン)への移行を検討してきました。現在、Glusterの「背後」にあるストレージファイルシステムとしてXFSを使用すると、パフォーマンスの面で非常にうまく機能します。 Glusterにも上記の同期の問題はないようです。

ただし、バックエンドファイルシステムとしてZFSを使用したいのですが、その理由は次のとおりです。

  • 安価な圧縮(現在、1.5TBの非圧縮を保存)
  • ストレージボリュームを「ライブ」で拡張するのは非常に簡単です(1つのコマンド、LVMの混乱と比較して)
  • スナップショット、ビット腐敗防止、その他すべてのZFSの栄光。

ソリューションのデモセットアップでは、各サーバーの個別のディスクにZFSバックエンドプールを備えたReplicateGlusterを備えた3台のサーバーがあります。 Linux(0.6.2)+ GlusterFS3.4上のZFSでCentOS6.5を使用しています。 Ubuntu13.10でも試してみました。すべてがVMwareESXにあります。

このセットアップをテストするために、ボリュームをGlusterにマウントし、BlogBench( http://www.pureftpd.org/project/blogbench )を実行して負荷をシミュレートしました。私が抱えている問題は、テストの最後に、ZFSストレージがデッドロックに陥っているように見えることです。 3台のマシンすべてで「zfs_iput_taskq」が90〜100%のCPUで実行されており、テストがフリーズします。テストを中止しても、デッドロックは解消されず、唯一のオプションはハードリブートのようです。

私が試してみました:

  • 一度に無効にする
  • 無効なスケジューラー(noop)
  • 異なる圧縮/圧縮なし
  • ZFSで直接Blogbenchが正常に機能する
  • バックエンドが正常に機能するため、Gluster + XFSのBlogbench

アイデア? ZFSを削除して、他の何かを使用する必要がありますか?代替案?

よろしくオスカー

6
MannerMan

Linux上のZFSは、負荷がかかった状態で適切に動作するために、少し基本的な調整が必要です。 ZFSARCとLinux仮想メモリサブシステムの間には少し苦労があります。

CentOSシステムについては、次のことを試してください。

/etc/modprobe.d/zfs.conf構成ファイルを作成します。これは、モジュールのロード/ブート中に読み取られます。

次のようなものを追加します。

options zfs zfs_arc_max=40000000000
options zfs zfs_vdev_max_pending=24

ここで、zfs_arc_maxはRAMバイト単位(Edit:tryzfs_arc_max=1200000000)の約40%です。zfs_vdev_max_pendingのコンパイル済みデフォルトバージョンに応じて、値は8または10になります。SSDまたは低遅延ドライブの場合は値を高く(48)する必要があります。SASの場合は12〜24の場合があります。それ以外の場合は、デフォルトのままにします。

/etc/sysctl.confにもいくつかのフロア値が必要です。

vm.swappiness = 10
vm.min_free_kbytes = 512000

最後に、CentOSでは、tunedtuned-utilsをインストールし、tuned-adm profile virtual-guestを使用してプロファイルをvirtual-guestに設定することをお勧めします。

これらを試して、問題が解決するかどうかを確認してください。

編集:

zfs set xattr=sa storageを実行します。 理由は次のとおりです。 ボリュームをワイプしてやり直す必要がある場合があります(絶対にそうすることをお勧めします)。

4
ewwhite