C++ - 複数のプロセスが同時に同じポートをリッスンしています。異なるアプリケーションが同じポートをリッスンできますか?
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-05-31 10:37:23
0
3
1112

nginx のモデルは、自分がマスターワーカーであることを認識しています

曾经蜡笔没有小新
曾经蜡笔没有小新

全員に返信(3)
黄舟

これは、同時に 1 つを再利用する複数のプロセスである必要がありますsocket

ただし、最新の linux では、複数の linux中,多个socket同时监听同一个端口也是可能的,在Nginx 1.9.1 が同じポートを同時にリッスンすることができます。この動作は Nginx 1.9.1 以降でもサポートされています。

linux 3.9 以降のカーネルは、同じポート上で複数の linux 3.9以上内核支持SO_REUSEPORT选项,即允许多个socket bind/listen在同一个端口上。这样,多个进程就可以各自申请socket监听同一个端口,当数据来时,内核做负载均衡,唤醒监听的其中一个进程处理,用法类似于setsockopt(listener, SOL_SOCKET, SO_REUSEPORT, &option, sizeof(option)) bind/listen を許可する

オプションをサポートしています。このようにして、複数のプロセスがそれぞれ同じポートをリッスンするように適用できます。データが到着すると、カーネルはロード バランシングを実行し、リッスンしているプロセスの 1 つを起動します。使用法は setsockopt(listener, SOL_SOCKET, SO_REUSEPORT,) と似ています。 &オプション、sizeof (オプション))

SO_REUSEPORT选项可以有效地解决epollThundering herd 問題の使用: 特定のテストについては、以下の例を参照してください: ThunderingHerdTest.cpp

オプションの説明については、「SO_REUSEPORT ソケット オプション」を参照してください。質問者の疑問については、記事内の次の文が答えとして使用できます。 SO_REUSEPORT

SO_REUSEPORT を使用してサーバーによって既にバインドされているポートが不要なプロセスによってハイジャックされるのを防ぐために、後でそのポートにバインドするすべてのサーバーは、最初のバインドを実行するために使用された実効ユーザー ID と一致する実効ユーザー ID を持っている必要があります。ソケット

つまり、プロセスが同じポートにバインドできるのは、プロセスが同じ
である場合のみです。

Nginxeffective user ID については、「NGINX 1.9.1 の SO_REUSEPORT による生産性の向上」を参照してください。

いいねを押す +0
Ty80

pid が最も小さいものがマスターとなるはずです。

いいねを押す +0
漂亮男人

単一のアプリケーションには同じポートをリッスンする複数のプロセスがあり、ソケットは共有されます

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート