【发布时间】:2022-08-10 04:46:13
【问题描述】:
从前几天开始,某个时间段流量很大。
时间为22:00、23:00、00:00。
服务器慢了大约 10 分钟或响应错误太多连接。
首先,我们可以在 DB 上看到接近 1500 thread_connected,因此将 max_connection 从 1500 增加到 3000。
然后我们在 Nginx 错误日志中发现了Uncaught PDOException: SQLSTATE[HY000] [2002] Cannot assign requested address 错误,所以用谷歌搜索并设置net.ipv4.tcp_tw_reuse = 1 以重用 TIME_WAIT 套接字。
之后,我们可以看到另一个错误消息connect() to unix:/var/run/php/php7.1-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream。
那时服务器仍然很慢或响应 502 Bad Gateway,而不是来自 DB 的太多连接。Thread_connected 超过 2000,DB 服务器的 CPU 使用率接近 100%。
谷歌搜索该消息并调整内核设置,如下所示,但没有运气。
net.core.somaxconn = 2048 # from 128
net.core.netdev_max_backlog= 30000 # from 1000
net.ipv4.tcp_max_syn_backlog = 2048 # from 512
我们的服务器由 2 个 Web 服务器和 1 个 DB 服务器组成。
并通过 TCP 套接字进行通信。
规格如下。
Web server 1,2
4vCore 16GB Ram
Nginx, PHP7.1, PHP7.1-fpm
DB server
16vCore 32GB Ram
MariaDB 10.0.38
无法获得要调整什么以及调整多少的证据(来自某些公式)。 可以提供更多信息,告诉我应该需要什么。 欢迎任何进一步发展的想法。
-
超过连接限制通常是慢查询、使用临时文件等瓶颈的指标。因此,在更改配置值之前,第一步应该是搜索瓶颈。还要考虑更新您的服务器(3 年前 10.0 eoled)
-
@GeorgRichter 感谢您的评论。我知道这个版本几乎已经过时了,但我们的头脑不想这样做。 :( 瓶颈,是的,可能有很多低效的查询正在使用,我们正在修复并将逐步修复。但在这种情况下,我只想知道为什么 php-fpm 仍然因缺少套接字而生病。或者我是缺少一些因素?
-
API 请求应在几毫秒内处理,因此不会堆积 3K 实时连接。重要的是要解决原因,而不是结果。如果服务器不能处理 1500 个连接,那么它也不会处理 3000 个。
-
@GeorgRichter API 请求通常很好并且在几毫秒内完成。 thread_created 一般保持在 200 以下,高峰时上升 500~700 左右。他们很快就平静了下来。然而,随着socket问题的出现,连接数迅速增加到2000,效果持续了大约5~10分钟。我认为插座外是原因并找到解决它的解决方案。
-
随着一些设置的改变,昨晚很平静。我们会密切关注以确保它得到彻底解决。