運行10個小時,內(nèi)存占用390M,并且4個報錯也是內(nèi)存溢出,如何能優(yōu)化呢??
[attach]1686[/attach]
[attach]1685[/attach]
[attach]1684[/attach]
?
?
我排查了下,業(yè)務(wù)邏輯沒問題,就內(nèi)容采集和入庫,沒其他多余的邏輯啊
?
這里查了下內(nèi)存最多的10個進程
[attach]1688[/attach]
?
<?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次運行,跑了幾分鐘,定時器運行了幾十萬次,進程內(nèi)存占用情況一直是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
奇怪,為啥我的沒問題。
你們自己運行下下面的代碼,看下進程占用內(nèi)存有漲沒。
<?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();
那可能有2個地方導(dǎo)致的,一個是你說的那個存客戶端連接的全局?jǐn)?shù)據(jù),一個是定時器部分。
那個存客戶端連接的全局?jǐn)?shù)據(jù)定時打印下里面的連接數(shù)看下是不是無限增長,如果是可能就是這里導(dǎo)致的。定時器部分有可能是數(shù)據(jù)庫類有問題,每次新建一個mysql連接去獲取,用完連接也沒關(guān)閉,導(dǎo)致開了很多mysql連接占用了很多內(nèi)存。
static $timer_count;
if(++$timer_count > 100) {
Worker::stopAll();
}
把這個代碼放到定時任務(wù)的尾部,即可解決的你的問題。