問題タブ [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.
c - エッジトリガーモードでのepolled、nonblockingソケットからのrecv
エッジトリガーモードのed、ノンブロッキングソケットの例recvを誰かに教えてもらえますか?epoll困ったのでお願いします。
c - イベント駆動型アプリケーションの IPC ソリューションの選択
私は現在、Linux での epoll および他のプラットフォームでの同等のテクノロジを中心に設計された、かなり大規模なシングルスレッドのイベントベースのアプリケーションに取り組んでいます。現在、2 つのインスタンスを通信させたい場合は、通常、同じマシン上で実行されているかどうかに関係なく、ソケットを介して行われます。パフォーマンス上の理由から、同じマシンの通信を高速化するために何らかの形の IPC を使用することを想定しています。ここで、どの IPC メカニズムを使用するかを決定する必要があります。
私にとって重要な要素は次のとおりです。
- 完全な再設計なしのイベント駆動型 -- IPC メカニズムが epoll にうまく適合しない場合、それは私にとって何ヶ月もの作業が失われることになります
- 高速 -- このメカニズムがソケットよりも高速でない場合、時間をかけて実装する価値はありません
- 柔軟で、実行中に (再) 構成可能 -- これにより、MPI などを排除できると思います。
- マルチスレッドは必要ありません。
すべてが同じパラダイムを使用している限り、プラットフォームごとに異なるメカニズムを使用したいと考えています。また、プラットフォーム固有のバインディングのために、C / C++ / Obj-C についても必要なだけ深く掘り下げたいと思っています。
なにか提案を?
ありがとう。
java - epoll がカーネルによって生成された瞬間と、Sun JVM がそれを読み取る瞬間との時間差を検出することは可能ですか?
つまり、時間 A = 電圧が NIC に到達します。時間 B = Java NIO パッケージのセレクターは、I/O 用のソケット チャネルを選択できます。
linux - Linux の匿名 i ノードとは何ですか?
「anonymous inode」でググってみたところ、epollに関係しているようなのですが…一体何なのでしょうか?
c - C:epollおよびマルチスレッド
専用のHTTPサーバーを作成する必要があります。このためにepollsycallを使用する予定ですが、複数のプロセッサ/コアを利用したいので、アーキテクチャソリューションを思い付くことができません。ATMの私の考えは次のとおりです。独自のepoll記述子を使用して複数のスレッドを作成し、メインスレッドは接続を受け入れ、それらをスレッドepollに分散します。しかし、もっと良い解決策はありますか?高負荷アーキテクチャで読むことができる本/記事/ガイドはどれですか?私はC10Kの記事しか見たことがありませんが、例へのリンクのほとんどは死んでいます:(そしてこの主題に関する詳細な本はまだありません:(。
回答ありがとうございます。
UPD:具体的に言ってください。資料と例が必要です(nginxは複雑すぎて、複数のシステムをサポートするには複数の抽象化レイヤーがあるため、例ではありません)。
sockets - epoll_wait() が 2 回閉じられたソケットを受け取る (read()/recv() は 0 を返す)
epoll を使用して http 接続をリッスンおよび処理するアプリケーションがあります。epoll_wait() は fd でクローズ イベントを「行」で 2 回受け取ることがあります。意味: epoll_wait() は read()/recv() が 0 を返す接続 fd を返す(socket) は、初回はクローズとして検出されます。2回目はクラッシュ。
この問題は、実際の使用ではめったに発生しません (サーバーごとに実際に約 500 ~ 1000 人のユーザーがいる 1 つのサイトを除く)。1秒あたり1000を超える同時接続でhttp siegeを使用して問題を再現できます。この場合、アプリケーションは (無効なポインタが原因で) 非常にランダムに、時には数秒後、通常は数十分後にセグメンテーション違反を起こします。1 秒あたりの接続数を減らして問題を再現できましたが、そのためにはアプリケーションを長時間、何日も、何週間も実行する必要があります。
すべての新しい accept() 接続 fd:s は非ブロッキングとして設定され、ワンショット、エッジ トリガーとして epoll に追加され、read() が使用可能になるのを待ちます。では、サーバーの負荷が高い場合、epoll はアプリケーションが close-event を取得できなかったと判断し、新しいイベントをキューに入れるのはなぜでしょうか?
epoll_wait() は独自のスレッドで実行され、別の場所で処理される fd イベントをキューに入れます。epoll から同じ fd にイベントが 2 回続けて発生するかどうかをチェックする単純なコードで、複数のクローズが着信していることに気付きました。それは起こり、両方が閉じるイベント(recv(..、MSG_PEEK)が私にこれを伝えました:))。
epoll fd が作成されます:
p>epoll_wait() は次のように実行されます:
p>新しい fd は、accept() の後に非ブロッキングとして設定されます:
新しい fd が epoll に追加されます (クライアントは malloc:ed 構造体ポインターです):
そして、fd からデータを受信して処理した後、(もちろん EPOLLONESHOT 以来) 再武装されます。最初は、エッジ トリガーとノンブロッキング io を使用していませんでしたが、テストしたところ、それらを使用してパフォーマンスが大幅に向上しました。ただし、この問題はそれらを追加する前に存在していました。ところで。shutdown(fd, SHUT_RDWR) は、他のスレッドで使用され、サーバーが http エラーなどのために fd を閉じる必要があるときに、epoll を介して適切な閉じるイベントをトリガーします (これが正しい方法であるかどうかは実際にはわかりません)。実行しますが、完全に機能しています)。
python - OSX で python select kqueue を使用して、外部アプリケーションによるファイル作成を監視します
通常、1 時間のオーディオ録音セッションを mp3 ファイルにトランスコードするには、20 分ほどかかります。
OSXアプリケーションgaragebandがそのmp3ファイルの書き込みを終了したときに、pythonスクリプトを使用して一連のpythonコードを実行したいと考えています。
外部アプリケーションがファイルへのデータの書き込みを完了し、そのファイルを閉じたことをPythonで検出する最良の方法は何ですか. kqueue と epoll について読みましたが、OS イベント検出のバックグラウンドがなく、良い例を見つけることができなかったので、ここで求めています。
私が現在使用しているコードは次のことを行い、よりエレガントなものを探しています。
linux - `epoll_wait`は、EPOLLINとEPOLLOUTの両方が追加されたときにトリガーされたイベントを示しますか?
で監視する記述子を追加するときに、フラグEPOLLINとフラグの両方を指定しているとします。'epoll'のマンページから、配列の一部として返される各構造がそのフィールドに正確に何を持っているかは不明です。引用:EPOLLOUTepoll_waitepoll_eventevents
イベントメンバーには、返されたイベントビットフィールドが含まれます。
「読み取り可能」ではなく「書き込み可能」を意味するイベントがトリガーされたかどうかを区別することが不可能であることを意味しますか?基本的にイベントマスクがあり、返された配列がファイル記述子で「発生した」イベントを正確に示すことを論理的に期待しますか?
c - epoll ファイル記述子操作
Linuxでepollに頭を悩ませようとしています。
通常の操作は次のようです。
私の質問は次のとおりです:epoll_fdが通常のファイル記述子のように見える場合、3 つの epoll 関数呼び出し以外に、それで実行できるファイル操作はありますか?
linux - EBADF while recv after epoll_wait
次の問題があります: 接続を受信する epoll コードがあります:
入力接続を受け取ったとき、すべてのバフデータを読み取ろうとしています:
関数内accept_request。しかし、デバッグ出力で次のようになることがあります。
これは、誰かが切断されたよりも先に接続され、再度接続しようとするとrecvが返されることを意味しますEBADF。私は何を間違えましたか?私を助けてください。
PS on EPOLLRDHUPi はファイル記述子を閉じるだけです。男は、閉じた fd をキューから単独で削除するepollので、大丈夫だと言います。epollepoll_wait