我正在设计一个每秒处理10000个TCP连接的系统,我会遇到什么问题?


18

我有一个运行CentOS的相对较新的8核盒子。我想开发一个使用TCP的统计服务器。这非常简单,它接受TCP连接,增加计数器并关闭连接。问题是它至少需要每秒执行至少10k次请求。我怀疑CPU /内存不会有问题,但是我更担心人为限制(例如半开连接),我可能需要在服务器上对其进行配置以允许这种数量的存储量。那么,这可能吗?我应该注意哪些设置?我的NIC无法处理吗?


1
确保不要为每个传入的连接都产生线程,这会降低性能

1
+1表示在这里报告您的最终结果:)
agsamek

Answers:


17

这通常称为c10k问题。该页面上有很多有关您将遇到的问题的详细信息。


是的,很好的联系!
sybreon

1
我希望看到比c10k页面上提到的问题更多/不同的问题。每秒建立和关闭1万个连接不同于建立1万个开放连接。处于TIME_WAIT状态的连接将是一个,达到监听套接字的积压限制的连接可能是另一个。如果用例在内核代码中没有比更常见的10k开放式连接情况得到更多的性能分析/优化,我也不会感到惊讶。
cmeerw

2

您应该能够做到[尽管这可能不是个好主意]。

树脂 appserv上,我可以在2.6GHz的四核至强处理器上获得〜5k req / sec。请求调用简单的servlet,该servlet从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的链接应该给您一个很好的主意。

即使在长时间的测试中,我也没有任何连接问题[提到半开式插座];该测试在通过千兆以太网连接的两个linux盒之间运行[尽管您看到带宽不是瓶颈]。


是否像OP一样在每次响应后关闭连接?Ab是否发送Connection:close标头?
Nate 2012年

1
@Nate这是http 1.0-每个单个http请求的单个连接。
2012年


0

如果可能,我会使用UDP而不是TCP。它应该更轻巧,因此扩展性更好。


我同意。UDP将更加轻量级
fpmurphy

1
UDP有其缺点,例如发送方和传递验证,因此在生产中使用UDP之前应先考虑它们。
SaveTheRbtz

0

您的网卡应该能够处理它,但是我对每秒10k个新TCP连接的设计提出了质疑。如果要快速创建/销毁连接,则应a)保持打开时间更长或b)改用UDP。

如果您有100万个客户端需要不时进行查询,但是负载达到每秒10k,则UDP可能是一个更好的选择。

如果您只有1万个需要每秒查询的客户端,则它们可以保持现有连接打开并重用它们。这对于OS来说将更为友好,并且所产生的延迟也要少得多,因为它不需要每次都进行新的握手。

在您每秒有1万个请求的情况下,我想您还是有一个前端负载均衡器,因此您也需要对其进行测试。

(注:我认为这属于堆栈溢出)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.