因此,如果我使用 apache benchmark (ab) 进行一些基准测试,并且使用大量请求。那么有时在测试过程中我会收到此错误。
我甚至不知道这是什么意思。那么我该如何修复它呢?或者这只是服务器获得太多点击时会发生的情况?问题是,如果我运行 10,000 次点击,它都会完美运行。如果我再次运行它,它将达到 4000 次并出现错误:
apr_socket_recv: Connection reset by peer (104)
关于我的设置:我让 nginx 接收静态请求并处理发往 apache 的动态请求。所讨论的文件由 nginx 从缓存中提供,所以我猜这可能与 nginx 处理请求的方式有关?
有想法吗?
答案1
该错误意味着另一端(Web 服务器)在会话中间突然断开连接。查看 apache 或 nginx 错误日志,看看是否有任何可疑内容。
答案2
这意味着服务器负载过重,即所有线程都忙于处理请求。解决方案:增加 server.xml 文件中连接器的 maxThread 属性计数或增加 acceptCount 属性值。
acceptcount :当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。队列已满时收到的任何请求都将被拒绝。
答案3
除了这里的答案之外,我还阅读了很多其他的答案:
- 替换
localhost
为127.0.0.1
- 更新 apache 版本(我有
ApacheBench, Version 2.3 <$Revision: 1807734 $>
) - 添加
-r
(然后我得到apr_pollset_poll: The timeout specified has expired (70007)
)
他们都没有帮助。
发现问题
问题似乎与临时端口。我尝试将其设置为 50000 到 25000,因为这是端口范围。仍然没有成功。然后我意识到它与 TIME_WAIT 有关,这篇博文。我想我可以证实:
$ netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
1 CLOSE_WAIT
1 established)
1 Foreign
4 LISTEN
8 SYN_SENT
62 SYN_RECV
351 ESTABLISHED
13916 TIME_WAIT
我尝试过
我至今还没修复它 :-/
根据sudo sysctl -a | grep net.ipv4.tcp
,我有:
net.ipv4.tcp_tw_reuse = 0 # No luck setting only that to 1
net.ipv4.tcp_max_tw_buckets = 32768
net.ipv4.tcp_fin_timeout = 60 # Setting it to 5 didn't help either
答案4
我也遇到了同样的问题,我的服务器版本是:
Server Version: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9 PHP/5.6.5 mod_perl/2.0.9dev Perl/v5.16.3
我删除了不必要的模块,问题就消失了:
Server Version: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips
因此,mod_fcgid,mod_php或者mod_perl导致问题。如果您不使用,可以尝试禁用它们。
(附注:如果您正在使用 opcache,也请禁用 fast_shutdown。它也会导致问题:opcache.fast_shutdown=0)