windows-由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

今日在php上做了个log,是记录php->pdo链接远程数据库的问题。

日志显示,突然在某个时间段会突然出现:

[2015-12-09 18:58:34.349]SQLSTATE[HY000] [2002] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。: Query ->
[2015-12-09 18:58:34.355]SQLSTATE[HY000] [2002] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。: Query ->
[2015-12-09 18:58:34.360]SQLSTATE[HY000] [2002] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。: Query ->
[2015-12-09 18:58:34.525]SQLSTATE[HY000] [2002] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。: Query ->
[2015-12-09 18:58:35.075]SQLSTATE[HY000] [2002] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。: Query ->
[2015-12-09 18:58:36.612]SQLSTATE[HY000] [2002] 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。: Query ->

php是跑在win2008 r2的腾讯云,数据库也是用腾讯云的5.5.24-CDB-2.0.0-log。

起初怀疑是数据库可能在云备份。但发现那个时间段没有备份记录,于是查到了一遍关于win端口使用问题。

于是乎我也 NETSTAT -ano。cmd列表是满满的

TCP    10.131.218.158:14529   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14530   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14531   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14532   10.66.126.46:3306      TIME_WAIT
TCP    10.131.218.158:14533   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14534   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14535   10.66.126.46:3306      TIME_WAIT
TCP    10.131.218.158:14536   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14538   10.66.126.46:3306      TIME_WAIT
TCP    10.131.218.158:14539   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14540   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14541   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14542   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14543   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14544   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14545   10.66.126.46:3306      TIME_WAIT
TCP    10.131.218.158:14546   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14547   10.66.126.46:3306      TIME_WAIT
TCP    10.131.218.158:14548   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14549   10.66.126.46:3306      TIME_WAIT
TCP    10.131.218.158:14550   10.66.154.36:9101      TIME_WAIT
TCP    10.131.218.158:14551   10.66.126.46:3306      TIME_WAIT

这种tcp端口占着又不注销。我又回去看一下我的pdo是否长链接。

$this->pconnect = FLASE;

无解了。只能照着另一个文章操作一下,但愿不会再出问题。

以Administrator用户登录Windows操作系统。
修改TCP回收时间。
在Windows开始菜单中,单击“运行”。
在“运行”对话框中,输入“regedit”后按“Enter”打开注册表编辑器。
在“注册表编辑器”中打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters”路径。
在“编辑”菜单中,选择“新建 > DWORD (32-位)值”,输入名称“TcpTimedWaitDelay”。
右键单击TcpTimedWaitDelay,选择“修改”。
在“编辑 DWORD(32位)值”对话框的“基数”区域中,选择十进制值为“30”,并“确定”。
关闭注册表编辑器。
修改端口范围。
在Windows开始菜单中,单击“运行”。
输入“cmd”并按“Enter”打开命令执行窗口。
执行如下命令修改端口范围。
netsh int ipv4 set dynamicportrange tcp startport=5000 numberofports=60000
重启操作系统。

收集到另一个信息

大规模Windows环境下,采用Nginx反向代理服务后,操作系统会产生较多TIME_WAIT的TCP(Transmission Control Protocol)连接,操作系统默认TIME_WAIT的TCP连接回收时间是4分钟,TCP默认动态端口范围为开始端口49152,结束端口65535。这样会使回收TCP过慢导致系统吞吐量下降,甚至出现502访问失败问题。如何修改操作系统内核参数来缩短TIME_WAIT状态TCP连接回收时间和添加TCP动态端口范围,保证在大并发场景下操作系统的端口资源可用?


你可能感兴趣的:(windows-由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作)