解决workerman的gateway的崩溃问题 | php 技术论坛-金年会app官方网
现象: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 协议》,转载必须注明作者和本文链接
你应该发到php版块里
不懂就问,这个 1905 是从哪里拿到的?
这不是内存暴了吗? 注意用64位系统, 代码写标准点, 大内存对象要实时释放掉.