問題タブ [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.
sockets - マルチスレッド アプリケーションでのソケット読み取りがゼロ バイトまたは EINTR (104) を返す
しばらくの間、C コーダーをしています - 初心者でも専門家でもありません。今、私は PPC Linux 上の C で特定のデーモン化されたアプリケーションを持っています。PHP の socket_connect をクライアントとして使用して、このサービスにローカルで接続します。サーバーは、Unix ソケット経由で接続を多重化するために epoll を使用します。ユーザーが送信した文字列は、strstr() を使用して特定の文字/単語について解析され、見つかった場合は、4 つの結合可能なスレッドを異なる Web サイトに同時に生成します。ソケット、接続、書き込み、読み取りを使用して、各スレッドのポート 80 で TCP 経由で前述の Web サーバーと対話します。すべての接続と書き込みは成功したようです。ただし、Web サーバー ソケットへの読み取りは失敗します。(A) 3 つのスレッドすべてがハングしたように見え、1 つのスレッドだけが -1 を返し、errno が 104 に設定されます。応答するスレッドには 10 分ほどかかります。 104(EINTRですか?)、これは、ネットワーク コンテキストでは、「接続がピアによってリセットされた」ことを示唆しています。または (B) 3 つのスレッドから 0 バイトで、4 つのスレッドのうち 1 つだけが実際にデータを返します。ソケットは読み取り/書き込みスレッドセーフではありませんか? 私は、strtok_r、gethostbyname_r などのスレッドセーフ (および再入可能) libc 関数を使用しています。
*シングルスレッドのスタンドアロン(他のすべてが等しい)を実行すると、すべてが完全に正しく機能しますが、もちろん直列では並列ではないため、上記のWebホストが実際に接続をリセットしているとは思えません。
2 番目の問題もあります (おっと)、epoll された Unix ソケットに接続しているクライアントに書き戻すことができません。デーモン アプリケーションがハングし、CPU を 100% 以上占有します。それでも、クライアント側には何も書き込まれません。これが発生するたびに、クライアント(非常に典型的なPHPソケットアプリケーション)が接続を閉じていないことを確認してください-エラーも検出されませんでした。何か案は?
Valgrind、GDB、または多くのロギングを使用しても、何が問題なのかわかりません。親切にできるところを手伝ってください。
apache - 「epoll」は、Tornadoweb(または Nginx) が非常に高速である本質的な理由ですか?
TornadowebとNginxは現在人気のある Web サーバーであり、多くのベンチマークでは、特定の状況下で Apache よりも優れたパフォーマンスを発揮することが示されています。だから私の質問は:
「epoll」は、それらを非常に高速にする最も重要な理由ですか? 優れたソケット サーバーを書きたい場合、そこから何を学べるでしょうか。
linux - ソケットから読み取る前に2EPOLLINを返すEPOLLETモードのEpoll
epollのマンページには、EPOLLET(エッジトリガー)に登録されたfdは、読み取りが行われていない場合、EPOLLINに2回通知するべきではないと記載されています。
したがって、EPOLLINの後、epoll_waitが新しいデータで新しいEPOLLINを返すことができるようになる前に、バッファーを空にする必要があります。
ただし、手付かずのfdsに対して重複したEPOLLINイベントが表示されるため、このアプローチで問題が発生しています。
これはstrace出力です。0x200はEPOLLRDHUPであり、私のglibcヘッダーではまだ定義されていませんが、カーネルで定義されています。
したがって、fd番号9を追加した後、ファイル記述子を受け取る前に2つの連続したEPOLLINイベントを受信します。システムコールトレースは、読み取る前にfdを削除する方法を示していますが、イベントごとに1回だけ発生するはずです。
したがって、マンページを正しく読んでいないか、ここで何かが機能しています。
linux - ファイルハンドルに書き込める量を決定します。ある FH から別の FH へのデータのコピー
指定されたバイト数をファイルハンドル (実際にはソケット) に書き込むことができるかどうかを判断するにはどうすればよいですか? (あるいは、他のファイルハンドルから読み取ったデータを「未読」にする方法は?)
私は次のようなものが欲しい:
両方のファイルハンドル (r_handle と w_handle) が epoll_wait から準備完了ステータスを受け取りました。
「書き込み債務」バッファを使用せずに、r_handle からのすべてのデータを w_handle にコピーしたいと考えています。
一般に、あるファイルハンドルから別のファイルハンドルにデータを簡単かつ確実にコピーするにはどうすればよいでしょうか?
linux - epollとのクライアント接続
epoll ypthreadsを使用してLinux用のC++でアプリケーション(クライアント/サーバー)をプログラミングしていますがconnect()、ループが実行されている場合に記述子リストに新しい接続をアタッチするための呼び出しを処理する方法がわかりませんepoll_wait()(エッジトリガー) 、どうすればよいですか?...ダミーのファイル記述子を使用してイベントと待機のスケープをトリガーできますか?または単純な呼び出しでconnect()イベントを発生させることができますか?? ...
私の悪い英語でごめんなさい...
linux - epollを使用したノンブロッキングTCP接続
私の Linux アプリケーションは、ノンブロッキング TCP 接続システムコールを実行しepoll_waitてから、スリーウェイ ハンドシェイクの完了を検出するために使用しています。&イベントのepoll_wait両方が同じソケット記述子に設定された状態で返されることがあります。POLLOUTPOLLERR
TCP レベルで何が起こっているのかを理解したいと思います。オンデマンドで再現することはできません。私の推測ではepoll_wait、イベント ループ内への 2 つの呼び出しの間に SYN+ACK/ACK/FIN シーケンスがありましたが、これも再現できません。
c - epoll_wait: maxevents
maxeventsパラメータについて少し混乱しています。最大 10k の接続を処理できるサーバーを書きたいとしましょう。その場合、 maxeventsを 10000と定義しますか、それとも何らかの理由で低くする必要がありますか?
c++ - Epoll を使用しない Linux で Asio をブーストする
私は、boost::asio が select 実装の代わりにデフォルトで epoll セットアップを使用するという印象を受けましたが、いくつかのテストを実行した後、私のセットアップは select を使用しているようです。
OS: RHEL 4
カーネル:2.6
GCC:3.4.6
どのリアクター ヘッダーが使用されているかを確認するための小さなテスト プログラムを作成しましたが、epoll リアクターではなく選択リアクターを使用しているようです。
私は何が間違っているのでしょうか?
c - epoll:「リスナー」FDの識別
「リスナー」ファイル記述子と「クライアント」ファイル記述子をどのように区別できますか?
マンページの例で見たものは次のとおりです。
「しかし、私がアクセスできない場合はどうなりlistenerますか?
これが漠然とした質問である場合は申し訳ありません。言い方がよくわかりません。
linux - Linux 2.6.x の aio に関する最新情報はどこで入手できますか?
最近、高性能な Web サーバーの書き方を学んでいます。epoll は aio よりも速いという RedHat の実験があります。Linuxカーネルのaioがpthreadで実装されているため、誰かがそれを言います。これを証明する最新情報を見つけるのは難しいです。また、Linux で epoll が現在 aio よりも優れているかどうかもわかりません。Linux 2.6.x での aio に関する最新情報はどこで入手できるか知りたいです。ありがとう!