最初の背景:私はPHPWebアプリケーションを実行している会社で働いています。いくつかのウェブサーバーにNFS経由でマウントされたストレージバックエンドがあります。今日、1つのWebサーバーがNFSを介してファイルを書き込むと、数分後までファイルが他のマウントされたクライアントに表示されないという問題が発生します。また、冗長ではないため、「目に見えない」メンテナンスを実行することはできません。
私はGlusterFSソリューション(冗長性のために2つまたは3つの複製されたブリック/マシン)への移行を検討してきました。現在、Glusterの「背後」にあるストレージファイルシステムとしてXFSを使用すると、パフォーマンスの面で非常にうまく機能します。 Glusterにも上記の同期の問題はないようです。
ただし、バックエンドファイルシステムとして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で実行されており、テストがフリーズします。テストを中止しても、デッドロックは解消されず、唯一のオプションはハードリブートのようです。
私が試してみました:
アイデア? ZFSを削除して、他の何かを使用する必要がありますか?代替案?
よろしくオスカー
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では、tuned
とtuned-utils
をインストールし、tuned-adm profile virtual-guest
を使用してプロファイルをvirtual-guestに設定することをお勧めします。
これらを試して、問題が解決するかどうかを確認してください。
編集:
zfs set xattr=sa storage
を実行します。 理由は次のとおりです。 ボリュームをワイプしてやり直す必要がある場合があります(絶対にそうすることをお勧めします)。