ネットワークのハングが発生すると、マウントされたNFSディレクトリでバイナリの実行が失敗しますか?

ネットワークのハングが発生すると、マウントされたNFSディレクトリでバイナリの実行が失敗しますか?

そのため、NFSサーバーとして機能するLinuxボックスがあります。エクスポートするフォルダには多くのプログラムがインストールされます。

別のLinuxボックスからエクスポートされたNFSフォルダ内のプログラムをかなり長い間実行しましたが、すぐに終了しません。

ご存じのとおり、ネットワークに緊急メンテナンス作業を行う必要があり、一定期間ネットワークがダウンする予定でした。

実行中のプログラムがどうなるか知りたいです。

私が理解しているのは、プログラムが怠惰な方法でRAMにロードされることです。したがって、最良のシナリオでは、プログラムがすでにRAMにロードされているループの一部であるいくつかのコードを実行していると仮定すると、ネットワークの中断中に実行可能ファイルにまったくアクセスする必要はなく、プログラムは正常に実行され続けます。 、何もなかったと思いますか?

ただし、プログラムが実行可能ファイルの他の部分をRAMにロードする必要があり、ネットワークが現在ダウンしていることが判明した場合。しばらくの間「停止」してネットワークが再起動した場合、通常の実行を再開しますか?

私はこのロードプロセスが最終的にNFSクライアントライブラリによって処理されるいくつかのio関連システムコールを呼び出すことになると思います。ネットワークがハングアップすると、NFSクライアントライブラリはネットワークハングアップ中に再試行し、ネットワークが復元された場合は成功を返します。したがって、システムの観点から見ると、これは長い時間がかかるシステムコールのようです。

私の推論、特にローディングプロセスの部分は不明です。実行可能ファイルの一部をRAMにロードすると、オペレーティングシステムはio関連のシステムコールを呼び出しますか?それとも、システムコールをバイパスし、より低いレベルのメソッドで実行してから失敗し、私のプログラムの実行が失敗した場合に停止することができますか?

また、推論を実行するときにNFSキャッシュ戦略を考慮する必要がありますか?

ありがとうございます〜!

答え1

あなたの理解は正確ではありませんが、近いです。プログラムは実際に遅延ロードされています。ページページごと。 (これらのいくつかは実際に使用する前にロードすることができますが、これはパフォーマンスとメモリのバランスであり、信頼できるものではありません。)

ロードを担当するシステム部分はカーネル自体です。ページは、遅くともプログラムがデータにアクセスしたり機械命令にジャンプするために対応するメモリブロックを必要とするときにロードされます。動作方法は、プロセッサのすべてのメモリアクセスが通過することです。メモリ管理ユニット;CPUは、要求されたアクセスを含むページがプロセスのMMUテーブルにマップされている場合にのみメモリにアクセスします。ページがマップされていない場合、これはトリガーされます。カーネルでコードスニペットを実行し、トラップの原因を分析し、物理メモリページを割り当て、必要なページコンテンツをロードし、制御をプログラムに戻してアクセスを再度実行します。

プログラムがメモリページを変更すると、その内容が次の場所に配置されることがあります。交換その後、再読み込みします。メモリページがファイル(実行可能かどうかにかかわらず)から直接提供されると、その内容はそのファイルからロードされます。これらの操作はすべてカーネル内で発生するため、システムコールを経ることはありませんが、ファイルにアクセスするシステムコールと同じ低レベルアクセスを実行します。

その結果、実行中の実行可能ファイルが保存されたファイルシステムにアクセスできなくなると、プロセスは中断されます。残ります邪魔されない睡眠ファイルシステムが要求を満たすまで。

実行可能ファイルがNFS上にあり、NFSファイルシステムがこのオプションを使用してマウントされている場合、実行可能hardファイルは永久に待つか、サーバーが応答するのを待ちます(最初に来ます)。このオプションを使用してNFSファイルシステムをマウントすると、タイムアウトsoft後にNFS要求が失敗し、これはプロセスへの信号に変換されます(SIGSEGVまたはsegfaultと見なされます)。

答え2

プログラムは、NFS共有内のファイルにアクセスしようとしなくても機能し続けます。 NFS共有フォルダからファイルを読み書きする必要がない場合は問題ありません。

関連情報