thinkphp5 think-worker 使用定时器,4个进程同时执行一个晚上,内存暴涨!

运行10个小时,内存占用390M,并且4个报错也是内存溢出,如何能优化呢? 

微信图片_20190124091311.png


微信图片_20190124091314.png


微信图片_20190124091316.png

 
 
已邀请:

six

赞同来自:

定时器里的业务代码有内存泄漏,这个东西我觉得得自己找,把怀疑有内存泄漏的业务先注释掉跑着试下,慢慢就定位到了

边玩边玩

赞同来自:

☀️

边玩边玩

赞同来自:

我排查了下,业务逻辑没问题,就内容采集和入库,没其他多余的逻辑啊
 
这里查了下内存最多的10个进程

微信图片_20190124100803.png

 

six

赞同来自:

<?php
require_once __DIR__ . '/../Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
$w = new \Workerman\Worker();
$w->onWorkerStart=function(){
    $timer_id=Timer::add(0.001,function(){
       
    });
};
\Workerman\Worker::runAll();
 
每秒1000次运行,跑了几分钟,定时器运行了几十万次,进程内存占用情况一直是3116K,没有丝毫变化
USER               PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
wanghai 46204 6.2 0.0 4365440 3116 s004 S+ 12:11下午 0:10.35 php timer.php start

边玩边玩

赞同来自:

微信图片_20190124123050.png

运行2小时  32M

a7662199

赞同来自:

我这边也遇到这样的问题, 写一个socket服务端对接一个考勤机硬件,因为加了一个定时器,导致内存涨的很快,我目前的做法是每小时定时的reload, 还没有想到比较好的办法来解决这个问题, 
 

six

赞同来自:

奇怪,为啥我的没问题。
你们自己运行下下面的代码,看下进程占用内存有涨没。
 
<?php
require_once __DIR__ . '/../Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
$w = new \Workerman\Worker();
$w->onWorkerStart=function(){
    $timer_id=Timer::add(0.001,function(){
       
    });
};
\Workerman\Worker::runAll();

longhaishan - php程序员

赞同来自:

static $timer_count;
if(++$timer_count > 100) {
Worker::stopAll();
}
把这个代码放到定时任务的尾部,即可解决的你的问题。

要回复问题请先登录注册