我运行2台服务器,1台web(nginx / php),1台数据库(mysql)。
Nginx每秒大约有1500个活动进程,而mysql状态平均显示大约15个当前选项连接。
今天我开始运行:netstat -npt | awk '{print $5}' | grep -v "ffff\|127\.0\.0\.1" | awk -F ':' '{print $1}' | sort -n | uniq -c | sort -n
这表明从我的网络服务器到我的数据库服务器IP有超过7000个活动连接。这似乎有点极端。我不使用PHP中的持久连接来连接到Mysql。
我也试过使用mysql_close(),但这似乎没什么区别。
在webserver上,netstat显示了超过7000个与数据库服务器的连接
在数据库服务器上,netstat仅显示300个与Web服务器的连接
知道为什么会有这么多开放的连接?
答案 0 :(得分:1)
尝试仅检查已建立的连接:
netstat -npt | grep ESTABLISHED | awk ...
答案 1 :(得分:0)
这些连接的状态是什么?我假设它是TIME_WAIT。当您有1500 req / s时,您将打开和关闭1500个TCP连接。关闭连接需要一些时间(协议中指定了一些超时,因此即使在localhost上,关闭也不是即时的 - 更多信息请here)。
没有任何问题 - 7000个连接并不多(但是接下来提到的持久连接会稍快一些)。您的Web服务器和数据库服务器之间最多可以有65536个连接。另请注意,这不是您打开的连接的总限制,因为通常认为。此限制不是根据您的IP地址,而是每个IP对(每对src-ip和dst-ip之间可以有65536个连接)。
使用nginx时,我假设您在Fast-CGI模式下使用PHP。所以对于那些1500 req / s,你应该有一些PHP进程等待处理它们(我的一台服务器上也有大约2000-5000 req / s,并且有50-250个PHP进程)。对于如此多的连接数和相对较少的PHP进程,最好使用持久连接。每个PHP进程都将与数据库建立一个永久连接。因此,您将拥有大约100个与MySQL的连接,但它们将保持打开状态,因此无需进行3路TCP握手&关闭每个网络请求。