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

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

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

答案1

这通常被称为c10k问题。该页面包含大量有关您将遇到的问题的有用信息。

答案2

你应该能够做到[尽管那可能不是一个好主意]。

树脂appserv 我可以在四核 2.6ghz xeon 上获得~5k 请求/秒。请求调用简单的 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 机器之间运行 [ 尽管如您所见,带宽不是瓶颈 ]。

答案3

您可能感兴趣我遇到的 Linux 内核限制在负载测试 Apache 时。就我而言,内核产生了一些有用的错误消息,因此我的建议是编写程序,如果您似乎达到了极限,请注意内核日志。

答案4

你的网卡应该能够处理它,但我对每秒有 10k 个新的 TCP 连接的设计提出质疑;如果你正在快速创建/销毁连接,那么你应该 a) 让它们保持打开更长时间或 b) 改用 UDP。

如果有 1M 个客户端需要不时执行查询,但负载将达到每秒 10k,那么 UDP 可能是更好的选择。

如果您只有 10k 个客户端需要每秒执行一次查询,那么它们可以保持现有连接打开并重新使用它们。这对操作系统来说要友好得多,而且延迟也小得多,因为每次都不需要新的握手。

如果每秒有 10k 个请求,我想您有一个前端负载均衡器,因此您也需要对其进行测试。

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

相关内容