解决workerman的gateway的崩溃问题

现象:gateway进程崩溃

pid:5855 Worker[10] process terminated with ERROR: E_ERROR "Allowed memory size of 134217728 bytes exhausted (tried to allocate 233472 bytes) in /xxx/vendor/workerman/workerman/Connection/TcpConnection.php on line 401"

解决思路:

先把gateway进程的内存限制加大

ini_set('memory_limit', '2048M');

用workerman自带的status命令观察哪个进程busy,找到对应的进程pid

解决workerman的gateway的崩溃问题

strace命令观察繁忙的进程:strace -ttp pid

strace -ttp 22030

strace命令会输出recvfromsendto函数的调用,这两函数的第一个参数就是读取或写入的fd

19:06:34.564427 sendto(3023, "\201~\1\337{\"cmd\":12,\"code\":0,\"data\":\"["..., 483, 0, NULL, 0) = 483

lsof -nPp pid | grep fd命令找到繁忙进程里面具体的fdTCP信息

lsof -nPp 22030 | grep 3023

输出如下:

php     22030 deploy 1905u     IPv4           63304556       0t0      TCP xx.xx.xx.5:7272->xx.xx.xx.7:26499 (ESTABLISHED)

结论

  1. 根据TCP信息可知,我这个gateway进程在疯狂的往xx.xx.xx.7:26499发送数据。
  2. 按这个思路,可以解决任何进程阻塞的问题。
本作品采用《CC 协议》,转载必须注明作者和本文链接
梦想星辰大海
讨论数量: 6

你应该发到php版块里

4个月前 评论
梦想星辰大海 (楼主) 4个月前

不懂就问,这个 1905 是从哪里拿到的?

lsof -nPp 22030 | grep 1905
4个月前 评论
lovewei 4个月前
梦想星辰大海 (楼主) 4个月前

这不是内存暴了吗? 注意用64位系统, 代码写标准点, 大内存对象要实时释放掉.

4个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!