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

我有一个运行CentOS的相对较新的8核心盒子。 我想开发一个使用TCP的统计服务器。 它非常简单,它接受TCP连接,增加计数器并closures连接。 问题在于它需要每秒处理至less10K个请求。 我怀疑CPU /内存不会是一个问题,但我更关心人工限制(如半开连接),我可能需要在我的服务器上configuration,以允许这种types的音量。 那么,这可能吗? 我应该注意哪些设置? 我的网卡不能处理吗?

这通常被称为c10k问题。 该页面有很多关于您遇到的问题的很好的信息。

你应该可以做到这一点[虽然这可能是个坏主意]。

在树脂 appserv我可以得到约5k频率/秒四核2.6ghz至强。 请求调用从mysql读取1行的简单servlet并发送非常小的xml响应。

testing完成了

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的链接应该给你一个好主意。

即使在长时间的testing中,我也不会遇到任何连接问题[提到半开的sockets]; 在两个通过千兆以太网连接的linux盒子之间进行testing[虽然你看到带宽不是瓶颈]。

您可能对加载testingApache时遇到的Linux内核限制感兴趣。 在我的情况下,内核产生了一些有用的错误消息,所以我的build议是编写你的程序,如果你似乎正在达到一个极限,请注意内核日志。

如果可能的话,我会使用UDP而不是TCP。 它应该更轻量化,因此规模更好。

你的nic应该能够处理它,但是我质疑每秒有10k个新的TCP连接的devise; 如果你正在快速创build/销毁连接,那么你应该a)保持打开时间更长,或者b)使用UDP。

如果你有1M的客户端需要不时的查询,但是每秒的负载将达到10k,UDP可能是一个更好的select。

如果您只有10k个客户端需要每秒钟进行一次查询,他们可以将现有的连接打开并重新使用。 这对于操作系统来说会更友善,而且每次都不需要新的握手,所以产生的延迟要less很多。

在每秒钟有10k个请求的情况下,我认为你有一个前端负载平衡器,所以你也需要testing一下。

(注:我认为这属于Stack Overflow)