1秒あたり10000のTCP接続を処理するシステムを設計していますが、どのような問題に遭遇しますか?


18

CentOSを実行している比較的新しい8コアボックスがあります。TCPを使用する統計サーバーを開発したいと思います。これは非常に単純で、TCP接続を受け入れ、カウンターをインクリメントし、接続を閉じます。キャッチは、少なくとも1秒に1万リクエストでこれを行う必要があるということです。CPU /メモリは問題ないだろうと思っていますが、この種のボリュームを許可するためにサーバーで設定する必要があるかもしれない人為的な制限(ハーフオープン接続など)の方が心配です。だから、これは可能ですか?どの設定に注意する必要がありますか?NICはそれを処理できませんか?


1
すべての着信接続に対してスレッドを生成しないようにしてください。スレッドがパフォーマンスを低下させます

1
ここに最終結果を報告するための+1 :)
agsamek

回答:


17

これは一般にc10k問題として知られてます。そのページには、あなたが遭遇する問題に関する多くの良い情報があります。


はい、良いリンク!
sybreon

1
c10kページに記載されている問題よりも多くの/異なる問題が発生することが予想されます。1秒あたり1万の接続を確立して閉じることは、1万の接続を開くこととは異なります。TIME_WAIT状態のままの接続は1つで、リスニングソケットのバックログ制限に達するのは別の接続になる可能性があります。そして、そのユースケースが、一般的な10kオープン接続のケースよりも多くのプロファイリング/最適化をカーネルコードで受けていなくても、私は驚かないでしょう。
cmeerw

2

あなたはそれをすることができるはずです(それはおそらく悪い考えですが)。

上の樹脂のappserv私はクアッドコア2.6GHzのXeonプロセッサ上〜5K REQ /秒を得ることができます。要求は、mysqlから1行を読み取り、非常に小さなxml応答を送信する単純なサーブレットを呼び出します。

テストは

ab -n 10000 -c 16 http://some/url/

試験結果:

Concurrency Level:      16
Time taken for tests:   1.904 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3190000 bytes
HTML transferred:       1850000 bytes
Requests per second:    5252.96 [#/sec] (mean)
Time per request:       3.046 [ms] (mean)
Time per request:       0.190 [ms] (mean, across all concurrent requests)
Transfer rate:          1636.42 [Kbytes/sec] received

しかし、各リクエストごとに新しいスレッドを生成することなく、単純なcプログラムを使用する方がはるかに優れていると思います。Greg Hewgillからのリンクはあなたにそれについて良いアイデアを与えるはずです。

長時間のテスト中であっても、接続に関する問題は発生しません[前述のハーフオープンソケット]。ギガビットイーサネットで接続された2つのLinuxボックス間でテストを実行します[ただし、帯域幅はボトルネックではありません]。


OPのようなすべての応答の後、接続は閉じられていますか?abはConnection:closeヘッダーを送信していますか?
ネイト

1
@ネイトそれはhttp 1.0です-すべての単一のhttpリクエストに対して単一の接続。
pQd


0

可能であれば、TCPではなくUDPを使用します。軽量である必要があるため、スケーラビリティが向上します。


同意する。UDPは、はるかに軽量になります
fpmurphy

1
UDPには送信者と配信の検証などの欠点があるため、運用でUDPを使用する前にそれらを検討する必要があります。
SaveTheRbtz

0

nicはそれを処理できるはずですが、1秒あたり1万個の新しいTCP接続を持つという設計には疑問があります。接続をすばやく作成/破棄する場合は、a)接続をより長く開いたままにするか、b)代わりにUDPを使用する必要があります。

時々クエリを実行する必要がある1Mのクライアントがいて、負荷が毎秒10kに達する場合、UDPがおそらくより良い選択です。

1秒ごとにクエリを実行する必要があるクライアントが1万個しかない場合、既存の接続を開いたままにして再利用できます。これは、OSにはるかに優しく、毎回新しいハンドシェイクを必要としないため、レイテンシも大幅に少なくなります。

毎秒1万件のリクエストがある場合、とにかくフロントエンドのロードバランサーがあると思うので、それもテストする必要があります。

(注意:これはStack Overflowに属していたと思います)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.