web-dev-qa-db-ja.com

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

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

18
Larry G

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

18
Greg Hewgill

あなたはそれを行うことができるはずです[それはおそらく悪い考えですが]。

on resin appserv私はクアッドコア2.6ghz xeonで〜5k req/secを得ることができます。リクエストは、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プログラムを使用する方がはるかに良いでしょう。グレッグ・ヒューギルからのリンクはそれについてあなたに良い考えを与えるでしょう。

長時間のテスト中でも、接続性の問題はありません[半分開いたソケットについて]。テストは、ギガビットイーサネットで接続された2つのLinuxボックス間で実行されます(ただし、帯域幅はボトルネックではありません)。

3
pQd

Apacheの負荷テスト中に Linuxカーネルの制限が当たる に興味があるかもしれません。私の場合、カーネルはいくつかの有用なエラーメッセージを生成したので、私のアドバイスはプログラムを作成することです。制限に達しているようであれば、カーネルログに注意してください。

1
Ben Williams

あなたのNICはそれを処理できるはずですが、1秒間に10kの新しいTCP=接続を作成する設計に疑問があります。接続をすばやく作成または破棄する場合は、次のいずれかを行う必要があります)それらをより長く開くか、b)代わりにUDPを使用します。

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

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

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

(注:これはスタックオーバーフローに属していると思います)

0
MarkR

TCPの代わりに、可能であればUDPを使用します。より軽量で、より適切にスケーリングできるはずです。