解决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
用strace
命令观察繁忙的进程:strace -ttp pid
strace -ttp 22030
strace
命令会输出recvfrom
或sendto
函数的调用,这两函数的第一个参数就是读取或写入的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
命令找到繁忙进程里面具体的fd
的TCP
信息
lsof -nPp 22030 | grep 3023
输出如下:
php 22030 deploy 1905u IPv4 63304556 0t0 TCP xx.xx.xx.5:7272->xx.xx.xx.7:26499 (ESTABLISHED)
结论
- 根据TCP信息可知,我这个gateway进程在疯狂的往
xx.xx.xx.7:26499
发送数据。 - 按这个思路,可以解决任何进程阻塞的问题。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: