Timer执行任务时间问题

jackyzhuo

// 使用定时器 0.01 秒执行一次 Task::fun()
// 已知 Task::fun() 需要 0.1 秒 才执行完毕
// 那该定时器是否会造成进程占用内存越来越大?
Timer::add(0.01, );
 补充:
LOG中没有任何报错信息,进程也正常运行,只是最近有两次内存占用超过80%,重启后就好了。所以正在查找原因。
 
程序原本用了while(true) {} 死循环来进行队列消费者操作,看了官方文档后,里面有说不能用死循环,会造成进程状态无法上报,无法正常stop, restart进程。所以修改成 Timer::add 的形式来实现。运行过程发现内存占用特别大,用 php server.php status 查看是正常的,但是 ps -aux 可以查看到 Workerman server.php 的内存占用85%以上了(服务器内存32GB)。
 
所以提出这个疑问。
 

3452 2 0
2个回答

walkor

 
workerman的定时器本身没有内存泄漏。
 
我猜测是Task::fun()方法里占用了大量内存。你可以这样测试,开一个进程不载入任何其它代码,只有一个定时器Timer::add(0.01, function(){usleep(100000);});,运行一段时间看下是否有占用大内存的情况,如果没有内存超大占用则有可能是业务代码问题。
 
反过来再写一个test.php,不载入workerman框架的东西,只循环运行你的Task::fun()方法,类似
while(1) {
    usleep(1000);
    Task::fun()
}
看下这个进程占用的内存是否越来越大。
 
还有下次有问题最好保留截图并粘贴出来。一般php默认内存限制是128M,不会到达占用上G的情况。

  • jackyzhuo 2019-03-25

    业务代码应该没有问题,因为业务代码已经运行了很久。之前没有过这种情况,但是之前因为用while死循环,所以无法正常restart,需要kill掉进程。近期改成Timer,0.01秒进行一次队列pop。然后出现了该问题2次,但是每次重新重启后就正常了。

jackyzhuo

[attach]1860[/attach]
谢谢你的回答,这是当时的截图。
你所说的测试方法我这边测试过,都没有问题,所以才有疑惑在这里提出。
服务器设置PHP的内存限制是128M,但是服务器PHP的内存占用莫名特别高。暂时还没找到原因,再次谢谢你的回答。
 

  • walkor 2019-03-25

    如果php默认内存限制128M没有改过,实际占用内存远超限制,感觉像是某个扩展有内存泄漏php无法检测到,所以内存越来越大。

  • jackyzhuo 2019-03-29

    明白,谢谢你的回答。

年代过于久远,无法发表回答
🔝