NFS サーバーの再起動後に ls がハングする

NFS サーバーの再起動後に ls がハングする

サーバー A とサーバー B があります。B は NFS サーバーとして機能し、A は B からマウントします。

どちらもEC2上で実行されています。

時々、B をシャットダウンして新しいインスタンス (同一のインスタンス) を起動する必要があります。B が復旧した後、A にマウントされたディレクトリ内で何か (たとえば ls) を実行しようとすると、ハングしてしまいます。

マウントのステータスをチェックし、問題があれば再マウントする cron を設定しようとしています。

マウントのステータスを確認する方法はありますか?

答え1

フォークして、子プロセスをディレクトリに進ませ、その後子プロセスを終了させることができます。親プロセスにタイムアウトを設定して子プロセスの存在を監視させます。古いマウントがあると、子プロセスは終了できず、長時間そのまま残り続けるため、親プロセスでタイムアウトが発生します。親プロセスに子プロセスを kill -9 してアンマウントを試行させます。

ただし、発生する可能性のある問題は、壊れたマウント上のファイルを他のプロセスが使用している場合、まずそれらのプロセスを終了しないとマウント解除できないことです。lsof または fuser を使用すると、古いマウント上の利用できないリソースを使用しているプロセスがあるかどうかを (多くの場合) 検出できます。

ただし、任意のプロセスを自動的に強制終了することは避け、手動でさらに調査するための通知を自分自身に送信してください。

この問題が発生する可能性を減らすには、ボリュームが必要になるまで、またはサーバー上のリソースが要求されるまでボリュームをマウントせず、不要になったら自動的にアンマウントする自動マウント機能を検討することをお勧めします。

-- ちなみに、これをさらに検索しやすくするには、stale、stuck、nfs、mount という単語でタグ付けすることをお勧めします。この現象は、ec2 の使用に固有のものではありません。

答え2

NFS サーバーが再起動すると IP が変更され、マウントが機能しなくなることに気付きました。

NFS ホストの IP がマウント時に現在使用されている IP であるかどうかをチェックするスクリプトを作成しました。そうでない場合は、アンマウントして再マウントします。将来誰かの役に立つかもしれません。

#!/bin/bash

NFS_HOST=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 1)
NFS_HOST_PATH=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 2)

host $NFS_HOST

if [[ $? -ne 0 ]]; then
    echo "NFS host $NFS_HOST doesn't exist!"
    exit 2
fi

MOUNT_POINT=$(mount | grep $NFS_HOST | awk '{ print $3 }')

NFS_IP=$(host $NFS_HOST | awk '{ print $4 }')

mount | grep "$NFS_IP"

if [[ $? -ne 0 ]]; then
    umount -fl $MOUNT_POINT
    mount "$NFS_HOST:$NFS_HOST_PATH" $MOUNT_POINT
fi

関連情報