easy-swoole / orm

31 stars 27 forks source link

第二次出现内存耗尽 #135

Closed 729343861 closed 4 years ago

729343861 commented 4 years ago

报错信息: Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 20480 bytes) in /www/wwwroot/lottery/vendor/nikic/php-parser/lib/PhpParser/Lexer.php on line 91 [2020-05-14 02:45:11 $8210.0] WARNING swManager_check_exit_status: worker#18[pid=8231] abnormal exit, status=255, signal=0

不知道是什么原因导致的

xuanyanwow commented 4 years ago
  1. 要确认哪个组件出现内存泄露,需要最小复现,并不能以报错提示的行为准 如下脚本
    
    <?php 
    ini_set('memory_limit', "1kb");

$arr = []; $i = 32000;

while($i>0){ $arr[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; $i--; } echo memory_get_usage(), '
';

$t = 10000; $tA = [];

while($t>0){ $tA[] = "VBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"; $t--; }

var_dump(count($arr)); var_dump(count($tA));



会提示$tA[]这一行分配内存溢出,但是脚本内存的大部分内存并不是它占用的,只是刚好在分配它的时候溢出了,才报错,你刚刚提交的第一个issue  orm 属性问题,并不会储存很多信息,这里出现溢出的几率非常小,

猜测是你自己写的代码或者其他非es组件使用泄露,如你这个issue中使用的 PhpParser 是否有可能出现溢出,请自行检测

如果要证明orm组件有溢出,麻烦开一个新的项目,单独使用orm 进行测试、复现、提交复现步骤。
kiss291323003 commented 4 years ago

这个很明显是你投递异步任务的时候出现的报错,应该是你们的代码有内存泄漏,或者是没有做php内存限制,和orm无关。

729343861 commented 4 years ago
  1. 要确认哪个组件出现内存泄露,需要最小复现,并不能以报错提示的行为准 如下脚本
<?php 
ini_set('memory_limit', "1kb");

$arr = [];
$i = 32000;

while($i>0){
    $arr[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    $i--; 
}
echo memory_get_usage(), '<br />';  

$t = 10000;
$tA = [];

while($t>0){
    $tA[] = "VBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
    $t--; 
}

var_dump(count($arr));
var_dump(count($tA));

会提示$tA[]这一行分配内存溢出,但是脚本内存的大部分内存并不是它占用的,只是刚好在分配它的时候溢出了,才报错,你刚刚提交的第一个issue orm 属性问题,并不会储存很多信息,这里出现溢出的几率非常小,

猜测是你自己写的代码或者其他非es组件使用泄露,如你这个issue中使用的 PhpParser 是否有可能出现溢出,请自行检测

如果要证明orm组件有溢出,麻烦开一个新的项目,单独使用orm 进行测试、复现、提交复现步骤。

观察了一下,是有一个自定义进程所消耗的内存逐渐增大,这个自定义进程写了一个1s定时器,里面有个50次for循环。每次循环里面使用了go()协程,go()协程处理耗时大概在10秒的样子。会不会是这种情况导致内存没有被及时释放而内存泄露,那么该如何来优化这个进程的代码呢

xuanyanwow commented 4 years ago

1.如果50个for循环不能在1s消费完成,那么任务数量将会堆积越来越多,协程数堆积,内存增长 2.使用了全局静态变量等储存数据,导致任务完成后数据也没有回收,内存增长 其他问题,这些与orm组件无关,将会关闭该issue,自定义进程内存优化问题可以在交流群与群友讨论或者自行解决,也可以考虑加入es官方vip交流群。