文件上傳完內(nèi)存沒有得到釋放, 導(dǎo)致一致累計(jì), 最后崩潰自動(dòng)重啟
報(bào)錯(cuò)時(shí)的泄漏點(diǎn)(位置有點(diǎn)飄忽不定,這附近的代碼都有概率報(bào)錯(cuò)):
https://github.com/walkor/Workerman/blob/6614873e22d88f7eb761c39afcaf8301b4084283/Protocols/Http.php#L551
嘗試了手動(dòng)釋放掉$_cache
并沒能解決問題
附件為strace
信息
內(nèi)存報(bào)錯(cuò)不一定是內(nèi)存泄漏吧,可能上傳的文件過大超過內(nèi)存限制。還有可能是同一個(gè)進(jìn)程同時(shí)在接收幾個(gè)用戶上傳的文件,所有文件加一起導(dǎo)致內(nèi)存超過限制。
上傳完文件,運(yùn)行 php start.php status 看下內(nèi)存釋放沒。
找到一個(gè)曲線救國的方法: https://github.com/walkor/Workerman/issues/401#issuecomment-462043161
稍微優(yōu)化了一下重啟策略
Timer::add(5, function() use ($worker){
$memoryUsage = memory_get_usage(true);
if (count($worker->connections) !== 0 && $memoryUsage < $this->memoryUsageLimit[1]) {
return;
}
if ($memoryUsage > $this->memoryUsageLimit[0] || static::$requestCount > 10000) {
static::$requestCount = 0;
// Restart current process.
Worker::stopAll();
}
});
還有一點(diǎn)要注意: 最好是和前端溝通一下請求時(shí)在header中設(shè)置Connection: close
, 或者服務(wù)端調(diào)用close()
不保持鏈接, 增加觸發(fā)的概率