サーバーの非常に忙しいクラスターがあります。 16台のアプリサーバーは、各マシンのローカルSSDからアプリケーションを提供しますが、画像も処理し、CDNから提供されます。このため、アプリサーバーからnfsマウントする中央イメージサーバーがいくつかあります。
最近、イメージサーバーで問題が発生し、シャットダウンする必要がありました。大したことではありませんが、CDNは引き続き画像の大部分を提供するため、ダウンタイムに気付くことはありません。完全ではありません。
通常の操作を続行する代わりに、アプリサーバーの負荷が急上昇してクラッシュするか、応答しなくなりました。 1日掘り下げた後、問題をnfsマウントに絞り込みました。 nfsマウントへの読み取りまたは書き込みはありませんでしたが、マウントがダウンしているという単純な事実により、Apacheが完全にフリーズしていました。
大したことではありません。調査を行ったところ、nfsボリュームをハードマウントとしてマウントしていることがわかりました。ソフトマウントに切り替えて、intr
を使用し、両方の時間を設定する必要がありました。値とretr値。再試行回数を0に設定し、timeo=1
を設定します(10分の1秒なので、1は可能な限り低いと思います)。これらの設定が整ったら、イメージサーバーをシャットダウンして以前のクラッシュを再現し、何が起こったかを確認するのを待ちました。
結果はより良いものでしたが、システム全体がクラッシュしなかったという点でのみでしたが、サービスが非常に遅いためにダウンしていた可能性があります。 10分の1秒でも、これはnfsマウントがタイムアウトするには長すぎるようです。そのため、ロードバランサーでの接続のバックログが膨大になり、容量が1/10になる可能性があります。
結果を確認するために、16台のアプリサーバーのうち4台からnfsマウントをアンマウントしましたが、これら4台のサーバーへのリクエストレベルは完全に正常でした。
それで、nfsマウントのタイムアウトを低く設定する方法、またはエラー時にドライブをマウント解除して、ダウンしたサーバーがオンラインに戻った後に自動再マウントする方法はありますか?または、私が見落としている、システムに多くの複雑さを追加しない別のソリューションはありますか?
最初に行うことは、retrans
オプションを1(または0ですが、それが期待どおりに機能するかどうかはわかりません)に設定することです。これにより、実際にタイムアウトするまでの時間が短縮されます。