問題タブ [preforking]
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.
locking - (Apacheプリフォークに基づいて)複数のプロセス間でソケットを共有するaccept()
私はApacheのMPMプリフォークサーバーでモデル化されたいくつかのPythonコードに取り組んでいます。私はネットワークプログラマーというよりもアプリケーションプログラマーであり、スティーブンスを読んでから10年が経ちました。そのため、コードの理解に慣れようとしています。
Sander Temmeによる、Apacheのプリフォークコードがどのように機能するかについての簡単な説明を見つけました。
通常rootとして実行される親プロセスは、ソケット(通常はポート80または443)にバインドします。ソケットのオープンファイル記述子を継承する子を生成し、uidとgidを非特権ユーザーとグループに変更します。子は、リスナーファイル記述子のポーリングセットを作成し(複数のリスナーがある場合)、その上でのアクティビティを監視します。アクティビティが見つかった場合、子はアクティブなソケットでaccept()を呼び出し、接続を処理します。それが完了すると、ポーリングセット(またはリスナーファイル記述子)の監視に戻ります。
複数の子がアクティブであり、それらはすべて同じソケットファイル記述子を継承しているため、同じポーリングセットを監視します。ミューテックスを受け入れると、実際にポーリングセットを監視できるのは1人の子だけになり、アクティブなソケットが見つかると、ミューテックスのロックが解除され、次の子がポーリングセットの監視を開始できるようになります。リスナーが1つしかない場合、そのaccept mutexは使用されず、すべての子がaccept()でハングします。
これは私が見ているコードの動作とほぼ同じですが、いくつかのことを理解していません。
1)「子供」と「リスナー」の違いは何ですか?私が見ているコードには、それぞれの子がリスナーであると思いましたが、Temmeの説明では、「単一のリスナー」と「子」が存在する可能性があります。子供にはいつ複数のリスナーがいますか?
2)(1に関連)これはプロセスごとのミューテックスですか、それともシステムミューテックスですか?さらに言えば、なぜミューテックスがあるのですか?accept(2)は、すべてのリスナーにわたって独自のミューテックスを実行しませんか?私の調査によると、ミューテックスが必要であり、ミューテックスはシステム全体に存在する必要があります。(群れ、セマフォなど)
Temmeは続けて次のように述べています。
子供は、最後にリクエストを処理したときに共有メモリ領域(スコアボード)に記録します。MaxSpareServersを満たすために、アイドル状態の子が親プロセスによって強制終了される場合があります。アイドル状態の子が少なすぎる場合、親はMinSpareServersを満たすために子を生成します。
3)この実装(できればPython)に適したリファレンスコードはありますか?PerlのNet::Server :: Preforkを見つけました。これは、スコアボードに共有メモリの代わりにパイプを使用します。ランダル・シュワルツの記事を見つけました。これは、プリフォークのみを実行し、スコアボードは実行しません。
Perl Cookbookのpre-forkの例には、selectに関するロックはありません。また、Chris SiebenmannのPythonの例では、Apacheに基づいていますが、共有メモリではなくスコアボードにペアのソケットを使用し、コントロールにソケットを使用しています。与えられた子を'a'cceptに制御します。これは、Apacheの説明とはまったく一致しません。
c - c の FastCGI フォーク
私は現在高負荷プロジェクトを開発しています。C/FastCGI/nginx の組み合わせを使用する必要があります。
問題は、FastCGI アプリケーションをスレッド/プロセスで実行する必要があることです。
私はそれを行う2つの方法を知っています:
1) プログラムをコンパイルし、spawn-fcgiを使用してプロセスをフォークします。(これは使えません)
2) を実行FCGX_Init()
し、10 個のプロセスに pre-fork する BEFOREwhile (FCGX_Accept_r(&request) >= 0)
3) pthreads AFTER を実行するwhile (FCGX_Accept_r(&request) >= 0)
だから、私の質問は: whis は fastcgi アプリケーションを実行する最速の方法です。この後、fastcgiアプリケーションを事前にフォークできますか:
10 個のプロセスが単一のソケットをリッスンできますか? N 個のプロセスを実行している場合、スレッドを使用する必要がありますか? これで十分ですか?
sockets - FastCGI / SCGI プリフォーク
私は (楽しみと教育目的で) Web サーバー ゲートウェイを実装しようとしてきましたが、フォーク前のモデルに関して FastCGI/SCGI の背後にあるコア アーキテクチャについていくつか質問があります。
FastCGI/SCGI 実装は、フォーク前のシナリオで通信をどのように処理しますか? 私の知る限り、ゲートウェイには FastCGI サーバーに接続するためのソケットが 1 つしかありません。通常、ゲートウェイからの接続を受け入れ、事前にフォークされたワーカーの 1 つに作業を渡す親プロセスがあります。
子がフォークされた後に接続が確立されるため、子にこれらのソケットを使用してゲートウェイと通信させるにはどうすればよいでしょうか?
php - apache/php モジュールのソケットの問題
Debian Lenny 32 ビットで Apache2.2 サーバー + PHP 5.2 を実行しています。「単純な」php モジュール拡張機能を C で作成しました。この拡張機能は 1 つのことを行っています: ソケットを介して小さな「エコー サーバー」を呼び出し、結果を待ちます (両側で「A」を送受信)。
prefork-mpm モデルに入って、ソケットをグローバル var PHP 構造に設定しました。したがって、グローバルに拡張ソースは次のように聞こえます。
mymodule.h で
mymodule.c で
完璧ですね... Apache が新しいプロセスを fork するたびに、新しい接続 (sa==0) を作成します私はそれについて確信しています)ソケットを作成せずにサーバーにデータを送信します。ある種の「ソケットプール」のように振る舞うだけです
しかし、ここで問題が発生します...
理由は不明ですが、Apache が開いているソケットを再利用しようとすると、send() コマンドで send_recv() がハングします。確かに、ソケットはブロッキング モードになっていますが、なぜこのような動作になるのでしょうか?
(ちなみに、同じコードを (もちろん PHP コードなしで) 複数の send_recv を持つ実行可能ファイルに実行すると、すべてが完全に機能します!)
Apache がソケットをロックしているようです !??
何か案が ?
ruby - Ruby readpartial と read_nonblock が EOFError をスローしない
私はユニコーンのラインに沿って単純なプレフォークサーバーを理解し、再作成しようとしています。このサーバーでは、開始時にサーバーが 4 つのプロセスをフォークし、すべてが制御ソケットで (受け入れるために) 待機します。
制御ソケット@control_socket
は 9799 にバインドし、接続の受け入れを待機する 4 つのワーカーを生成します。各ワーカーで行われる作業は次のとおりです。
私は、ステータス コード 200 の文字列と text/html の Content-Type を返す、非常に単純なラック アプリを使用しました。
私が直面している問題は、サーバーが着信要求を読み取るときに (「http://localhost:9799 」の URL をヒットすることによって)またはgets
のようなものの代わりにa を使用して正常に動作することです。非ブロッキング読み取りを使用すると、EOFError がスローされることはないようです。これは、私の理解によれば、状態を受信しないことを意味します。read
read_partial
read_nonblock
EOF
これにより、読み取りloop
が完了しません。この作業を行うコード スニペットを次に示します。
ただし、またはgets
の代わりに単純なものを使用する場合、またはをに置き換える場合、コードは完全に機能します。read
read_nonblock
IO.select([@client])
break
これは、コードが機能して応答を返す場合です。read_nonblock を使用する理由は、unicorn がnon_blocking 読み取りを実装するkggioライブラリを使用して同等のものを使用するためです。
次にコード全体を貼り付けます。
「read_partial」または「read_nonblock」または「read」で読み取りが失敗する理由を誰かが説明してくれませんか。これについて何か助けていただければ幸いです。
ありがとう。
php - Apache モジュール mpm_worker + php の問題
ubuntu マシンで php と apache を使用しており、マルチスレッドの概念を試しています。Apache にはデフォルトの「prefork」モジュールが付属しています。また、mpm_worker モジュールを有効にすると、Php が動作しなくなります。
Apache で mpm_worker が有効になっている場合、php を機能させるために他のモジュールを有効にする必要がありますか?
ありがとうございました..
apache - Apacheのプリフォークとワーカーモジュール、何が使用されていますか?
私のApacheが使用しているMPMを特定するのに問題がありますが、次の出力に基づいて誰でもわかりますか?
私の推測では、Prefork が使用されているのでしょうか。
[root@rp1a ~]# 猫 /etc/sysconfig/httpd
[root@rp1a ~]# tail /etc/httpd/conf.d/rp-base.conf
[root@rp1a ~]# apachectl -V
[root@rp1a ~]# /usr/sbin/httpd -V
[root@rp1a ~]# apachectl -l
[root@rp1a ~]# httpd -l
[root@rp1a ~]# httpd.worker -l
[root@rp1a ~]# ps -C httpd.worker -F
[root@rp1a ~]# ps -C httpd -F | 頭
php - PHP の Ruby IO に相当
PHPIO.select
で、のようなことをする方法を探しています。IO.pipe
何時間もグーグルで検索しても、良い結果は得られませんでした。基本的に、プリフォーム サーバー モデルのマスター プロセスと子の間の IPC には、ファイル記述子のペアが必要です。