了解此错误:apr_socket_recv:对等方重置连接(104)

了解此错误:apr_socket_recv:对等方重置连接(104)

因此,如果我使用 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

除了这里的答案之外,我还阅读了很多其他的答案:

他们都没有帮助。

我考虑过换成wrk看到之后类似的斗争

发现问题

问题似乎与临时端口。我尝试将其设置为 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_fcgidmod_php或者mod_perl导致问题。如果您不使用,可以尝试禁用它们。

(附注:如果您正在使用 opcache,也请禁用 fast_shutdown。它也会导致问题:opcache.fast_shutdown=0)

相关内容