我使用 httperf 进行性能测试,同时启动了很多个 httperf 线程,但是运行一段时间后出现了如下错误:
“httperf:无法连接到 SSL 服务器(错误=-1,原因=5)”
这是怎么发生的?
我的代码:
#!/bin/bash
for ((i=0;i<30;i++)); do
./bin/httperf --server 192.168.2.1 --port=443 --uri / --ssl --ssl-no-reuse --timeout 10000 --rate 1000 --num-conns 50000000 &
sleep 1
done
服务器是nginx-1.2.4,不知道是不是服务器导致的问题。
答案1
理论上,单个客户端与单个 Web 服务器建立的会话数存在上限。您可能已经达到此限制。
标识 TCP 连接的是
源 IP
源端口
目标 IP
目的端口
在此测试中,1、3 和 4 是静态的。剩下的是源端口,其最大端口数为 65535。并非所有端口都用于传出连接。根据您的客户端操作系统,此数字被限制在较短的范围内(即 65535-1024)。
要查看是否已用尽可能的会话数量,请在服务器上执行以下操作:
netstat -na | grep source-ip | grep ":443" | wc -l
您必须调查客户端对源端口数量的限制以确定最大值。
答案2
如果我正确理解了错误消息,它会显示 SSL_connect 的状态。在这种情况下,原因 5 意味着 SSL_ERROR_SYSCALL(请参阅 OpenSSL 中的 ssl/ssl.h),并且可以通过“查看错误堆栈/返回值/errno”获取有关错误的更多详细信息。不幸的是,httperf 没有提供更详细的信息,因此只能猜测:可能是因为 nginx 关闭了连接,所以它得到了 ECONNRESET 或 EPIPE。也许您可以在 nginx 本身的错误日志中找到更多信息。