read(2)へのコール中にENOBUFS
またはENOMEM
を受信した場合、カーネルがリソースを解放し、将来のコールが成功する可能性はありますか?または、エラーを致命的なものとして扱い、ティアダウンプロセスを開始しますか?read(2)の呼び出し時にENOBUFS/ENOMEMが発生したときはどうしますか?
答えて
私は少し迷って、再試行の可能性があるかどうかを確認します。
ENOMEMを読んだら読むと、カーネルが深刻な問題になっていることを意味します。はい、再試行が可能かもしれませんが、そうでない可能性もあります。そうでない場合は、再試行するまでどれくらい待つのが適切ですか?直ちに再試行すると、100%CPUバウンドループを行っている別のプロセスを追加しないようにするにはどうすればよいですか?
個人的には、私がエラーを処理する方法を知っている読者からこのようなエラーが出た場合、私はいつものようにエラーを処理します。私が積極的に読書が成功する必要がある状況であれば、私はプログラムに失敗するでしょう。このプログラムがミッションクリティカルな場合は、それを再起動するウォッチドッグの中で実行する必要があります。
カーネルがENOMEMを返すと、OOMキラーが誰かにSIGKILLを送るという過失ではないことに注意してください。体験は、誰かがあなたのプロセスになる可能性が高いことを示しています。これは、ただ終了するもう一つの理由です。プロセスを監視しているウォッチドッグでその終了を処理します(ただし、OOMキラーがトリガーされた場合、ウォッチドッグはSIGKILLを取得する可能性があります)。
ENOBUFSの状況はあまり変わりません。 「どのくらいの時間を遅延させるか」と無限ループの問題は依然として存在します。 OOMキラーはそのような考慮事項の下ではあまりありませんが、ウォッチドッグに頼っても正しい経路、IMHOです。
ここでのコアの問題は、特定のケースがないことです。read(2)
はのいずれかのエラーを返します。これらのエラーが発生する状況が発生した場合、ドライバがEIO
を返すのとまったく同じです。
このように、OPが特定のユースケースを知っていなければ、彼のコードは処理するために作成されていますが、これらのエラーは本当に同じように処理する必要があります。
最後にOOMキラーに関する1つではありません。人々は時々、それをシステム全体をぶら下げないようにするものと考えています。それは事実ではありません。 OOMキラーランダムにがプロセスを殺します。プロセスのページが増えるほど、それが殺される可能性が高くなることは事実です。しかし、私はその事実に頼ることは絶対に勧めません。
物理メモリが枯渇し、OOMキラーがメモリをほとんど使用していないプロセスを犠牲にし、主な犯人になるまでに時間がかかるケースがあります。私は、メモリが枯渇したことがカーネルのアドレス空間にあり、ユーザ空間のプロセスが完全にランダムであったというケースを見てきました。
私が上記のように、OOMキラーはあなたのウォッチドッグプロセスを殺して、あなたのメインホーガーを走らせるかもしれません。コードパスを修正するためにそれに頼らないでください。
'ENOBUFS'についてはどうですか?あなたの答えは、質問に対するコメントと相反すると思われる。私は可能な限り信頼できるアプリケーションを作成しています。プレッシャーがかかっているので終了したくないので、それが絶対に唯一の行動であれば終了したいと思っています。私はネットワークサービスを書いています。待っていてもそれほど問題ではありません。あなたが言及しているように、私はむしろ、私のプロセスが存在するかどうかの権限であると思われるので、実際に物事を引き裂くために 'SIGKILL'が待っています。 – dcow
@dcow、あなたは実際にそれらのエラーを取得しましたか? "read"のmanページはそれらを可能なリターンコードとしてリストしていないので、特定のFSドライバまたはカスタムキャラクタデバイスのためだけにそれらを取得すると思います。 –
@dcow、あなたのフォローしている質問を詳述するための編集された答え。 –
- 1. SOAPメソッドを呼び出すときにエラーが発生しました:メッセージのデシリアライズエラーが発生しました
- 2. 角2は、イベントが発生したときに関数/メソッドを呼び出す
- 3. サービスインタフェースでGetTypeを呼び出すと、呼び出しが発生しますか?
- 4. ecsエラー:「...を呼び出したときにエラー(ClusterNotFoundException)が発生しました」
- 5. イベントが発生したときにインスタンスメソッドを呼び出す
- 6. obj-cのクラスメソッドを呼び出すときにエラーが発生しました
- 7. PLS-00306カーソルの呼び出し時にエラーが発生しました
- 8. POSTでAngular 2とLaravel 5.3 API呼び出しエラーが発生しました
- 9. invokeMethodの呼び出し中にエラーが発生しました
- 10. 時にはスローUncaught Error:Android上のNPObjectでメソッドを呼び出すときにエラーが発生しました。
- 11. コンソールアプリケーションからWPFフォームを呼び出そうとしたときにエラーが発生しました
- 12. jdbcを呼び出すときにbluemix pysparkエラーが発生しました
- 13. PySideでslotを呼び出すときにエラーが発生しました
- 14. RedemptionでRdoMail.Send()を呼び出すときにREGDB_E_CLASSNOTREGエラーが発生しました
- 15. AttachVolumeオペレーションを呼び出すときにエラー(VolumeInUse)が発生しました
- 16. CMISサービスを呼び出すときにエラーが発生しました
- 17. performSegue関数を呼び出すときにエラーが発生しました
- 18. swiftのfirebaseから子を呼び出すときに不正な命令エラーが発生しました2
- 19. Py4JJavaError:z:org.apache.spark.api.python.PythonRDD.collectAndServeを呼び出す際にエラーが発生しました
- 20. WebAPIを呼び出そうとしたときにNode.jsの「Undefined:1」エラーが発生しました
- 21. List [Record]を渡してメソッドを呼び出すときにScalaコンパイル時エラーが発生しました
- 22. RegisterProfileの呼び出し時にorg.freedesktop.DBus.Error.UnknownMethodエラーが発生する
- 23. ストアドプロシージャの呼び出し時にSystem.Data.SqlClient.SqlExceptionが発生する
- 24. Follow関数の呼び出し時にInvalidOrMissingInputExceptionが発生する
- 25. エラーが発生するCreateListFromArrayLikeは、.apply()を使用しようとしたときに呼び出されます。
- 26. 2クラスを呼び出すときにエラーが発生する
- 27. asp.netのユーザーコントロールページからajax呼び出しを行うときに "SyntaxError:JSON.parse:unexpected character"エラーが発生しました
- 28. CURL:http urlを呼び出そうとしたときに不正な要求が発生しました
- 29. Javaでクラスを呼び出そうとしたときにエラーが発生しました
- 30. PHPでSOAP関数を呼び出そうとしたときにエラーが発生しました
公式に推奨されている動作は何か分かりませんが、プログラミングではこの問題を突き抜けて、ENOBUFSエラーが一時的であることがわかりました。つまり、私がread()を再度呼び出すと、それは成功するでしょう。 YMMV。 –