我有一个运行 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)