環(huán)境
服務(wù)器每天接收 來自Mqtt的中轉(zhuǎn)Http消息大約3500萬條(騰訊限制只能發(fā)http了,其它收費較高)
使用 workerman 開啟http服務(wù) 開啟12個進程
將收到的數(shù)據(jù)插入到TDengine時序數(shù)據(jù)庫,保存最新的一條數(shù)據(jù)至MySQL數(shù)據(jù)庫。
內(nèi)存一直在增長,懷疑內(nèi)存泄漏,然后將onMessage所有代碼刪除,即一個空項目,也會造成內(nèi)存的增長,直到超出memory_limit上限然后報 65280 錯誤后業(yè)務(wù)無法運行。
將進程改為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 方法內(nèi)無代碼。
$worker->onMessage = [$this, 'onMessage'];
};
Worker::runAll();
private function output(string $message): void
{
// 守護模式下不輸出日志
if (!defined('DAEMON')) {
echo $message . PHP_EOL;
}
}
內(nèi)存一直增長的原因不明,感謝版主大大解答疑惑。
重新沒用thinkphp創(chuàng)建了一個test.php的項目,內(nèi)存也增加。不知為何。
試下不用thinkphp,直接用workerman,空業(yè)務(wù)返回helloworld,看下內(nèi)存是否是無限增長
http://m.wtbis.cn/doc/workerman/getting-started/simple-example.html 從這里復(fù)制的,經(jīng)測試用workerman 4.2.1版本內(nèi)存不會增長,而thinkphp-wokerman的是3.5.34的內(nèi)存會一直增長
先說workerman
特意下載workerman 3.5.34 試了下,沒有無限增長。
從你的截圖看,只是到了8M左右,沒有無限增長。
think-worker 沒測試
think-worker 測試了下,確實存在內(nèi)存泄露,可能是thinkphp官方哪里沒弄好。
另外workerman快發(fā)布5.0了,3.0已經(jīng)不維護了。
如果可以的話建議用webman,可以使用tp的組件,開發(fā)起來和tp差不多
感謝大佬,我單獨把workerman升到了4.2.1版本,目前內(nèi)存沒有增長了,還是用的thinkphp,停留在了36M,有時候會跳到37M然后又會回到36M,這是之前從未有過的現(xiàn)象。問題已解決,十分感謝。
如果需要workman結(jié)合thinkphp運行的話這里倒是有一個TP的Workman擴展:
https://github.com/axguowen/think-webworker
特點:
1、深度兼容ThinkPHP,現(xiàn)有ThinkPHP業(yè)務(wù)代碼幾乎不用做任何更改即可使用
2、性能比傳統(tǒng)php-fpm環(huán)境高10-20倍
3、支持ThinkPHP的Cookie使用
4、支持ThinkPHP的Session使用
5、支持ThinkPHP的多應(yīng)用模式
6、支持ThinkPHP的多應(yīng)用中間件
7、多應(yīng)用模式支持配置應(yīng)用入口文件
8、多應(yīng)用模式支持配置應(yīng)用目錄以支持composer依賴包的應(yīng)用
有興趣的話可以試試。