4

これまでのところ、node.js アプリは 1 つしかありませんでした。socket.io を実行しています。ユーザー数が増えると、ほぼ一日中 CPU 使用率が 100% に達するため、ユーザーを複数の node.js プロセスに分割することにしました。node.js アプリケーション ロジックを分割して、異なるサブドメインのユーザーをシャーディングできるようにしました。また、セッション コードを URL 経由でトークン パッシングに抽出したので、Cookie は重要ではありません。

8 コア マシンの少なくとも 4 コアを使用したいので、複数の node.js プロセスを実行し、それぞれがサブドメインでアプリを提供します。ポート 80 経由ですべての node.js にアクセスできるようにするために、HAProxy を使用することにしました。セットアップは次のようになります。

     domain.com -> haproxy -> node on 127.0.0.1:5000
sub1.domain.com -> haproxy -> node on 127.0.0.1:5001
sub2.domain.com -> haproxy -> node on 127.0.0.1:5002
sub3.domain.com -> haproxy -> node on 127.0.0.1:5003

すべてが機能するようになりましたが、アプリケーションの必要な部分 (socket.io を使用しない部分) が非常に遅くなります。これは Express.js を使用して記述されており、ページを直接 (HAProxy 経由ではなく) 開くと高速に動作します。また、socket.io への接続は XHR トランスポートで高速に動作しますが、Websocket トランスポートでは接続の確立に時間がかかります。接続が確立されると、正常に高速に動作します。

これまで HAProxy を使用したことがないため、おそらく何かを誤って構成したのでしょう。これが私のHAProxy構成です:

global
    maxconn 50000
    daemon

defaults
    mode http
    retries 1
    contimeout 8000
    clitimeout 120000
    srvtimeout 120000

frontend http-in
    bind *:80
    acl is_l1 hdr_end(host) -i sub1.domain.com
    acl is_l2 hdr_end(host) -i sub2.domain.com
    acl is_l3 hdr_end(host) -i sub3.domain.com
    acl is_l0 hdr_end(host) -i domain.com
    use_backend b1 if is_l1
    use_backend b2 if is_l2
    use_backend b3 if is_l3
    use_backend b0 if is_l0
    default_backend b0

backend b0
    balance source
    option forwardfor except 127.0.0.1  # stunnel already adds the header
    server s1 127.0.0.1:5000

backend b1
    balance source
    option forwardfor except 127.0.0.1  # stunnel already adds the header
    server s2 127.0.0.1:5001

backend b2
    balance source
    option forwardfor except 127.0.0.1  # stunnel already adds the header
    server s2 127.0.0.1:5002

backend b3
    balance source
    option forwardfor except 127.0.0.1  # stunnel already adds the header
    server s2 127.0.0.1:5003
4

1 に答える 1

3

私はそれを考え出した。ドキュメントでこれを見つけることができませんでしたが、グローバル maxconn 設定はフロントエンドには適用されません。フロントエンドにはデフォルトで 2000 の同時接続があり、それを超えるものはすべてキューに入れられました。私は socket.io 接続を長期間使用しているため、これが問題を引き起こしました。

解決策は、フロントエンド セクションで maxconn を明示的に設定することです。

于 2012-09-15T12:53:15.463 に答える