我一直使用 apache benchmark 来大致了解我的服务器每秒可以处理多少个请求。我读到它很好用,而且似乎运行良好。
输入 node.js,它是完全基于事件的,因此它永远不会阻塞。如果我在一个简单的 hello world 服务器上运行 apache benchmark,它每秒可以处理 2500 个请求左右。
但是,如果我在 hello world 函数中设置超时,使其在 2 秒后响应,apache benchmark 会报告吞吐量大幅下降:大约 50/s。我正在使用 ab 运行 100 个并发连接。如果我增加并发性,它就会上升。这是有道理的,因为 apache benchmark 基本上是分批发送 100 个请求,每 2 秒返回一次。100 个请求/2 秒 = 50 个请求/秒
如果我将并发数增加到 400 或 500 左右,它就会开始崩溃。我不认为我达到了 node.js 的限制,我认为我的操作系统在打开文件描述符或套接字的数量上遇到了瓶颈。
有什么方法可以让我准确估计一下我的服务器可以处理多少请求吗?我想确保测试计算机不是导致问题的原因。
答案1
“它开始崩溃”中的“它”是什么意思?基准测试工具或服务器上的某个东西?您是否收到任何异常报告,直接从故障组件或输出到日志文件?
如果问题是ab
(基准测试程序)不喜欢那么多活动连接,请尝试同时运行多个实例。
如果是操作系统(或ab
操作系统之间的某些交互)施加了限制,请尝试将多个副本ab
分散在不同机器上。如果您没有多余的物理机器可以尝试,那么同一主机上的虚拟机可能会有效。
无论是哪种情况(服务器端或客户端),您对打开套接字数量限制等的猜测可能是正确的。
答案2
有些事情可能并不完全相关。
首先,由于您必须保持 500 个连接打开数秒,因此您可能已达到打开文件描述符的最大数量,该数量可能设置为 1024。检查日志文件,如果看到类似这样的错误too many open files
。尝试编辑/etc/security/limits.conf
并增加 apache 用户的文件描述符数量。
其次,在我看来,您的测试并不代表您预期的使用情况。您正在测试一个需要很长时间准备页面的系统(例如,需要进行复杂的数据库查询),并且客户端会耐心等待,而不是事件驱动的页面。我不了解 node.js,但我假设它会根据需要从服务器请求数据,分为几个小请求,每个请求对于服务器来说都是独立的。是否也有大型查询?它们是如何处理的?客户端等待它们还是轮询服务器以检查状态?
对于测试来说,ab
它的功能似乎相当有限。您可能想尝试其他实用程序。快速apt-cache search
提出了几个(我没有使用过它们),例如httperf
,hammerhead
也许其他拥有更多网络测试经验的人也会同意。
答案3
使用 IBM RATIONAL PERFORMANCE TESTER 测试服务器吞吐量,它将以图形和表格的形式向您提供结果,显示接收的字节数和发送的字节数