环境
服务器每天接收 来自Mqtt的中转Http消息大约3500万条(腾讯限制只能发http了,其它收费较高)
使用 workerman 开启http服务 开启12个进程
将收到的数据插入到TDengine时序数据库,保存最新的一条数据至MySQL数据库。
内存一直在增长,怀疑内存泄漏,然后将onMessage所有代码删除,即一个空项目,也会造成内存的增长,直到超出memory_limit上限然后报 65280 错误后业务无法运行。
将进程改为48个进程后问题依旧,只是增长的速度慢了一点而已。时间长了之后还是一样的。
$http_worker = new Worker("http://0.0.0.0:8090");
$http_worker->count = 12;
$http_worker->name = 'BMS';
$http_worker->reusePort = true;
$http_worker->onWorkerStart = function ($worker) {
$this->output("Worker start");
// 实例化
try {
$this->tdengine = new Connection($this->tdengine_host, $this->tdengine_port, $this->tdengine_username, $this->tdengine_password, $this->tdengine_database);
// 连接
$this->tdengine->connect();
$this->output("TDengine connected, Version:" . \TDengine\CLIENT_VERSION);
$this->tdengineBMS = new TDengineBMS($this->tdengine);
} catch (TDengineException $e) {
$this->output("TDengine connect failed:" . $e->getMessage());
return;
}
// onMessage 方法内无代码。
$worker->onMessage = [$this, 'onMessage'];
};
Worker::runAll();
private function output(string $message): void
{
// 守护模式下不输出日志
if (!defined('DAEMON')) {
echo $message . PHP_EOL;
}
}
内存一直增长的原因不明,感谢版主大大解答疑惑。
重新没用thinkphp创建了一个test.php的项目,内存也增加。不知为何。
试下不用thinkphp,直接用workerman,空业务返回helloworld,看下内存是否是无限增长
回复大佬,也增加。
已在原帖中截了两张图,还麻烦大佬分析一下原因。感谢
发下测试代码
文本
https://www.workerman.net/doc/workerman/getting-started/simple-example.html 从这里复制的,经测试用workerman 4.2.1版本内存不会增长,而thinkphp-wokerman的是3.5.34的内存会一直增长
先说workerman
特意下载workerman 3.5.34 试了下,没有无限增长。
从你的截图看,只是到了8M左右,没有无限增长。
think-worker 没测试
think-worker 测试了下,确实存在内存泄露,可能是thinkphp官方哪里没弄好。
另外workerman快发布5.0了,3.0已经不维护了。
如果可以的话建议用webman,可以使用tp的组件,开发起来和tp差不多
感谢大佬,我单独把workerman升到了4.2.1版本,目前内存没有增长了,还是用的thinkphp,停留在了36M,有时候会跳到37M然后又会回到36M,这是之前从未有过的现象。问题已解决,十分感谢。
好的好的,十分感谢。
如果需要workman结合thinkphp运行的话这里倒是有一个TP的Workman扩展:
https://github.com/axguowen/think-webworker
特点:
1、深度兼容ThinkPHP,现有ThinkPHP业务代码几乎不用做任何更改即可使用
2、性能比传统php-fpm环境高10-20倍
3、支持ThinkPHP的Cookie使用
4、支持ThinkPHP的Session使用
5、支持ThinkPHP的多应用模式
6、支持ThinkPHP的多应用中间件
7、多应用模式支持配置应用入口文件
8、多应用模式支持配置应用目录以支持composer依赖包的应用
有兴趣的话可以试试。
webman一撸到底
好的,感谢各位。