Timer执行任务时间问题

0

// 使用定时器 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)。
 
所以提出这个疑问。
 

已邀请:

walkor

赞同来自: jackyzhuo

 
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

赞同来自:

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

要回复问题请先登录注册