問題タブ [epoll]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - ボトルネックの問題を伴う epoll アーキテクチャの問題
私はネットワークプログラミング(tcp)に取り組んでおり、このコードを持っています。epoll を使用するのはこれが初めてなので、この設計が正しいかどうかはわかりません。また、スレッド プール (5 つの子スレッド) を使用しており、epoll からデータを読み取るたびに、それをスレッド プールのキューに入れます。問題は、読み取り関数でボトルネックの問題が見られることです。
read 関数では、ObserveSocket を呼び出します。
ソケットを監視し、一定時間信号がない場合は 0 を返してソケットを閉じます。予期しないユーザーの切断またはデータの破損を検出するには、このコードが必要だと思いました (クライアントは 100 バイトを送信しましたが、サーバーは 90 バイトを受信し、サーバーは最後の 10 バイトが到着しないのを待ちます)。
ボトルネックの問題とこれに関するアーキテクチャの問題を解決する方法を教えていただければ幸いです。
また、epoll を使用して例外処理を詳細に説明している優れたチュートリアルも探します。
前もって感謝します。
編集
recv() 関数内では read 関数を呼び出すだけで、読み取る前に ObserveSocket を呼び出します
linux - epoll()を使用した短い読み取りの処理
クライアントが100バイトのデータを送信したが、どういうわけかサーバーは90バイトしか受信しなかったとしましょう。このケースをどのように処理しますか?サーバーがwhileループ内で「読み取り」関数を呼び出して、受信したデータの合計をチェックすると、サーバーはパックの最後の10バイトを永久に待機します。
また、データ転送の途中でクライアントが切断される可能性があります。この場合、サーバーは到着しないすべてのデータを受信するまで永久に待機します。
私はtcpを使用していますが、実際のネットワーク環境では、この状況が発生する可能性があります。前もって感謝します...
linux - epoll()は、O(1)でその役割を果たしますか?
ウィキペディアは言う
O(n)で動作する古いシステムコールとは異なり、epollはO(1)で動作します[2])。
http://en.wikipedia.org/wiki/Epoll
ただし、Linux-2.6.38のfs / eventpoll.cのソースコードは、O(logN)を持つ検索用のRBツリーで実装されているようです。
実際、epoll()の複雑さはO(1)であると言っているmanページは見当たりませんでした。なぜそれはO(1)として知られているのですか?
epoll - エッジトリガーepollを使用して、送信をループする必要がありますか?
私はepollを使用してメディアサーバーを作成しています。fdsはすべて非ブロッキングに設定されており、エッジトリガーイベントを使用しています。EPOLLINの場合、EAGAINが返されるまでfdの読み取りをループする必要があることを知っています。しかし、書くことはどうですか?
書き込みたいときは、データをキューに入れ、fdにEPOLLOUT | EPOLLIN|EPOLLETを設定します。EPOLLOUTイベントが発生すると、キューに入れられたバッファー全体を1回のショットで書き込みます。
n> 0 && n <buf_lenの場合、EPOLLOUTをリセットして戻ります。sendをループする意味がわかりません(epollのmanページが暗示していると思います)。sendは、可能な限りすべてを取り込んだことを示しているようで、すぐに呼び出された場合はEAGAINを返します。
ここでシステムコールを排除することが最も効率的なルートですか?
linux - epollタイムアウトを実装するにはどうすればよいですか?
私はepollを使ったネットワークプログラミングに取り組んでいます。うまく機能しているようです。タイムアウト機能を追加したいので、クライアントが長期間何も送信しなかった場合、クライアントを切断するだけです。
どうすればよいですか?epoll_waitでタイムアウトを設定できることは知っていますが、これは個々のソケット用ではありません...
前もって感謝します...
c++ - C++のスケーラブルなサーバーフレームワーク
何万ものクライアントを同時に処理することを目的としたサーバーアプリケーションをC++で作成しようとしています。WindowsとLinuxで実行する必要があります。私はフレームワークとライブラリを探していて、Boost Asioに出くわしました。これは、非常に成熟していて広く使用されている代替手段のようです。主に何百万ものテンプレートが原因で、ストランド/スレッドプールに頭を巻くのに苦労しています。私のバックグラウンドは主にCであるため、Boostが一般的にいっぱいになっているように見えるテンプレートの混乱にはあまり慣れていません。ストランドやバインドなどを使用してスレッド化/同期化の側面を処理するBoostAsioの周りに比較的薄いラッパーを開発する人を見つけようとしましたが、私の予算内でそれを実行できる人をまだ見つけることができませんでした(2または300米ドル)。
Boost Asio(たとえば、WindowsのIOCPやLinuxのepollなど)と同様に拡張可能な他のライブラリ、またはより小さなフリーランスの仕事を探している熟練したBoost開発者を見つけることができるソースをお勧めしますか?
助けてくれてありがとう。
敬具、
フィリップ・ベネフォール
multithreading - 一方のスレッドで epoll_ctl を実行し、他方のスレッドが epoll_wait の途中にある
epollを使用したLinuxサーバープログラミングは初めてです。Thread_Accept と Thread_epoll の 2 つのスレッドがあります。前者はブロック受け入れループで、新しい接続が来ると、epoll_ctl() で新しい fd を追加します。後者は大きな epoll_wait() ループです。
ここで私の質問は次のとおりです。 Thread_epoll が epoll_wait の途中で epoll_ctl() を実行する Thread_Accept の場合はどうなりますか? 副作用はありますか?
前もって感謝します。
よろしく、マーティン
c - epoll_waitはEINTRが原因で失敗しますが、これを修正するにはどうすればよいですか?
EINTRが原因でepoll_waitが失敗します。私のgdbトレースはこれを示しています:
この文字列「開始タイマーのepoll_waitエラー:測定は実行期間全体にわたって行われます」は、私がstderrに出力します。
epoll_waitが機能するように、このEINTRを修正する方法を理解できません。このEINTRがGDBトレースによってどのように生成されるかについて何か考えはありますか?
c++ - このブロックの問題を解決するにはどうすればよいですか?
このコードがあり、送信機能が時々動かなくなります。非ブロッキング I/O を使用していると指摘する人もいます。私は epoll を使用しているので、デザイン全体をノンブロッキング モードに変更するのは少し難しいと思います。送信機能のブロックを防ぐ方法はありますか?
前もって感謝します..
c - epoll はスレッドセーフですか?
epoll には 2 つの関数があります。
- epoll_ctl
- epoll_wait
同じ epoll_fd を使用する場合、
それらはスレッドセーフですか?
あるスレッドが epoll_wait を呼び出し、他のスレッドが同時に epoll_ctl を呼び出すとどうなりますか?