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