最近生产环境上出现了内存溢出的问题,由于项目中操作表格的地方超级多,所以一时半会没有办法定位到是哪出的代码引起的内存溢出。
[2023-02-02 12:16:22] lumen.ERROR: Symfony\Component\Debug\Exception\FatalErrorException: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 4096 bytes) in /data/api/deploy/api-739-20230116165840/vendor/phpoffice/phpexcel/Classes/PHPExcel/Worksheet.php:1219
观察服务器内存使用情况,某核某一进程,将cpu使用率达到100%, 内存使用将近2G左右。
使用ps_aux | grep 4752 查看进程, 进程中执行的是这个任务
/usr/local/php/bin/php /data/api/wwwroot/artisan queue:work --queue=default,more_long redis --sleep=3 --tries=3 --daemon
查询第一次出现这个报错的地方,发生时间点是在 2023-01-17 15:50:02
然后找这个时间点之前的调度任务,发现在这个时间点附近有一条耗时队列执行失败。
根据日志查询到这个时间,商品运营操作人员,导入excel 表格中格式有问题,没有去除空白字符
phpExcel 类在读取表格文件的时候,出现了内存溢出的情况。
最后在生产上将这个调度任务强制关闭,才将问题解决。