0

我正在尝试在 ubuntu 64 上的 ec2 c1.xlarge 机器上加载测试一个简单的 node.js 和 cyclone hello world 应用程序。它有 8 个内核。我使用 nginx 作为负载均衡器,主管为每个核心启动一个进程。当我在机器上运行以下命令时,对于 node.js,我的 qps 约为 6500。

 ab -n 5000 -c 25 http://127.0.0.1

当我从远程机器运行 ab 时,即使是在同一区域中的机器,qps 也会下降到大约 175 qps。如果我从我的开发机器上运行,情况会更糟。

那么,我错过了什么?是否有我必须调整的参数以允许来自远程机器的更多连接?我觉得我错过了什么。我必须在 sysctl 配置文件中调优吗?它是一台相当原始的机器,但在启动时,以下是我调整的 nobs。

sysctl -w fs.file-max=128000;
sysctl -w net.ipv4.tcp_keepalive_time=300;
sysctl -w net.core.somaxconn=250000;
sysctl -w net.ipv4.tcp_max_syn_backlog=2500;
sysctl -w net.core.netdev_max_backlog=30000;
sysctl -p
4

1 回答 1

3

延迟会减慢测试速度,从而降低吞吐量。几乎在每种情况下,远程请求都会比本地请求花费更长的时间,因此单个线程在远程运行时的吞吐量将低于在本地运行时,因此,当使用不会调整请求的 Ab 时,总吞吐量必须降低。

例如,您有 25 个线程。假设在本地提出您的请求需要 50 毫秒。对于一个线程,这给出:

1000(1 秒)/50 = 20 个请求/秒 - 这是一个线程可能的最大吞吐量。

超过 25 个线程,总计 25 * 20 = 500 req/s。

如果您采用该公式并将响应时间更改为 250 毫秒,则线程上的总最大吞吐量下降到 4 请求/秒,从而在 25 个线程每秒 80 个请求的情况下总体可能的最大值。

更进一步:如果你说你得到 6000 qps 和 25 个线程,那么逻辑上你的应用程序在本地调用时会在大约 4 毫秒内响应。如果您只能远程获得 175 qps,那是因为响应时间下降到大约 142 毫秒,所以在您的系统中,您有大约 138 毫秒的延迟——给予或接受——这就是问题所在。

于 2012-05-21T14:22:50.863 回答