問題タブ [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 - poll/epoll 互換タイマー
ご挨拶、
Linux poll/epoll API と組み合わせてタイマーを使用する方法があるかどうか疑問に思っていました。私はすでに epoll を使用しており、タイマーをキュー内の別の epoll イベントにすることができれば、既存のコードと非常にうまく統合できます。
考えられる方法は、おそらく、ファイルベースのタイマーです。
想像上の例として。このようなものはありますか?または、epoll API と統合できる他の方法はありますか?
-- マレンズ
python - Python epoll.registerスレッドセーフ?
別のスレッドからepoll.registerを安全に呼び出すことができるかどうか誰かが知っていますか?
これが私が想像していることです:
- スレッド1:epoll.poll()
- スレッド2:epoll.registerを使用して同じepollオブジェクトにfdを追加する
c - epoll_data_t の質問 (特に C データ型について)
ユニオンepoll_data_t
は次のようになります。
これはより一般的な C の質問ですが、アンダースコアなしの uint{32,64} ではなく、先頭の二重アンダースコア __uint{32,64} 型が使用されるのはなぜですか? アンダースコアバージョンを使用する理由/時期はよくわかりませんが、アンダースコアなしの uint32 は、外の世界に対して公に変更可能なユニオンで使用するのに適していると思いました。
linux - エポール・パフォーマンス
誰でも epoll_wait に関する質問に答えるのを手伝ってくれませんか。
約 100K のアクティブなソケットでサービスを提供するために、同じ fds セットで epoll_wait を呼び出す多くのスレッドを使用するのはやり過ぎですか? それとも、epoll_wait を実行するスレッドを 1 つだけ作成するだけで十分でしょうか?
たとえば、データを読み取る準備ができているソケットが 1 つしかない場合、epoll_wait からウェイクアップするスレッドの数は? つまり、2 つ以上のスレッドが epoll_wait からウェイクアップするが、結果のイベントに同じ fds があるという状況が発生する可能性はありますか?
多くのアクティブなクライアント (例: 50K+) で動作するサーバーでスレッドを整理する最良の方法は何ですか。私が考える最善の方法は、epoll_wait と i/o 操作を実行する1 つの I/O ワーカー スレッドです。+ I/O ワーカー スレッドから受信したデータを処理する多くのデータ処理スレッド(ゲーム ロジックなど、時間がかかる場合があります) と、I/O ワーカー スレッドがクライアントに送信する新しいデータを作成します。私はこのアプローチで正しいですか、またはこれを整理するための最良の方法を見つけるのを手伝ってくれる人はいますか?
前もってありがとう、バレンティン
events - TCL での C10K のようなイベントベースのサーバー開発の状況は?
TCL は素晴らしく単純なプログラミング言語ですが、それに値する信用や尊敬を得ていないようです。私は1995年に大学でそれを学び、すぐにそれを忘れて、最近再びそれを見つけました. 私は主に、TCP ベースのネットワーク サービスの開発と Web 開発のための TCL に関心があります。
TCL はネットワーク プログラミングを簡単にすると言われています。しかし、TCL は内部で select() を使用しているように見えますが、これは「Web スケール」を念頭に置いてうまくスケーリングできません ( C10K 問題を参照)。libevent、libev、raw epoll/kqueue のサポートを探しましたが、あまり見つかりません。
TCL で記述された「最新の」(より適切な用語がないため) イベントベースのネットワーク サービスを知っていますか? TCL ベースのサーバー開発に関する指針、ヒント、またはベスト プラクティスはありますか?
ありがとう!
posix - 「aioとepollをどのように併用するか」を再考する
での議論に続いて、単一のイベントループでAIOとepollをどのように一緒に使用しますか?。
実際、Linuxには2つの「aio」APIがあります。posIX aio(aio_ *ファミリーの関数)があります。これは、io_ *ファミリーであるRedHat(?)によって開発されたglibcとlibaioに含まれています。
1つ目は、aio_sigeventaiocbメンバーを介した通知要求の登録を許可します。これは、ppoll()/ pselect()イベントループと簡単に統合できます。POSIX aioをepoll()と統合する場合は、信号をダミーfd(パイプなど)のイベントに変換し、epollでリッスンする必要があります。その間、従来の方法またはppoll/で信号をキャッチします。選択する。最初の選択肢(通常のシグハンドラー)の安全性は、アプリケーションによって異なります。そして多分epollにありますが、私はその内部を完全には認識していません。私がepollベースのアプリを持っていて、POSIX aioサポートを追加したい場合、私は困惑していると安全に想定できますか?これが私の質問でした。
2番目のAIO実装であるlibaioは、実際にeventfd()で使用できます(ゼロであると予想されるaio_resfdメンバーまたはAIO結果を配信するeventfdを持つstruct iocb)。しかし、それは本によるものではありません。POSIX指定、つまり。
私は自分がすべてが明確な*BSDユーザーになることを夢見ています。AIOイベントに対するPOSIXAIOおよびkqueue()のサポートがあります。クリスタルクリア。他の多くのものと同じように。
c - epollを使用した複数のTCP接続に関するデータの処理
私は、すべてのピアが互いに通信するp2pソフトウェアのように機能するアプリケーションを持っています。通信はTCPになるので、複数の接続を処理できるようにepool(4)を使用できると思いました。各ピアは非常に頻繁にデータを送信するため、アプリケーションの存続期間中に使用される各ピアへの永続的な接続を確立すると思いました。
さて、処理方法がわからないことの1つは、接続が閉じられないため、データの受信を停止し、さらにパッケージをリッスンするために再度read()
呼び出すタイミングをどのように知ることができるかということです。epool_wait()
または、永続的なTCP接続を処理するためのより良い方法はありますか?
c - EPIPEはサーバーをブロックします
Linux上で実行されているCでシングルスレッドの非同期サーバーを作成しました。ソケットは非ブロッキングであり、ポーリングに関しては、epollを使用しています。ベンチマークは、サーバーが正常に動作し、Valgrindによると、メモリリークやその他の問題がないことを示しています。
唯一の問題は、write()コマンドが中断された場合(クライアントが接続を閉じたため)、サーバーでEPIPEが発生することです。パラメータ-bを指定してベンチマークユーティリティ「siege」を実行することにより、人為的に割り込みを実行しています。それはすべてが完全に機能する連続した多くの要求を実行します。ここで、CTRL-Cを押して、「包囲」を再開します。運が良ければ、クライアントのfdが無効であるため、サーバーが完全な応答を送信できないことがあります。予想どおり、errnoはEPIPEに設定されています。この状況を処理し、fdでclose()を実行してから、接続に関連するメモリを解放します。ここで問題となるのは、サーバーがブロックされ、正しく応答しなくなることです。straceの出力は次のとおりです。
(不思議に思うかもしれませんが、ログからprintf()を削除しました)
ご覧のとおり、クライアントは新しい接続を確立し、その結果、受け入れられます。次に、EPOLLキューに追加されます。epoll_wait()は、クライアントがデータを送信したことを通知します(EPOLLIN)。要求が解析され、応答が作成されます。ヘッダーの送信は正常に機能しますが、本文に関しては、write()の結果がEPIPEになります。どのクライアントからの着信接続もブロックするため、「包囲」のバグではありません。
select - select、epoll、または kqueue を使用して大きなファイルを提供する
Nginx は、複数のクライアントを処理するために epoll またはその他の多重化手法 (選択) を使用します。つまり、apache とは異なり、リクエストごとに新しいスレッドを生成しません。
selectを使用して、自分のテストプログラムで同じことを複製しようとしました。ノンブロッキング ソケットを作成し、select を使用してサービスを提供するクライアントを決定することで、複数のクライアントからの接続を受け入れることができました。私のプログラムは、単にデータをエコーバックするだけです。小さなデータ転送(クライアントごとに数バイト)では問題なく動作します。
この問題は、クライアントへの接続を介して大きなファイルを送信する必要があるときに発生します。ファイルの読み取りとソケットへの書き込みが完了するまで、すべてのクライアントにサービスを提供するスレッドが1つしかないため、他のクライアントのサービスを再開できません。
この問題に対する既知の解決策はありますか、それともそのようなリクエストごとにスレッドを作成するのが最善ですか?
c - 「緊急データ」とは何ですか?
epoll_ctl()のマニュアルページには、次のように書かれていEPOLLPRI
ます。
read(2) 操作で使用できる緊急データがあります。
「緊急データ」は正確にどのように定義され、誰がどのデータを優先するかを決定しますか?