laravel 定时任务占用内存过多

laravel 中有四五个定时任务,最近在执行时候发现网站卡顿,错误日志中出现没有可用内存的提示。

因为服务器是作为开发来使用的,1 核 1G 的阿里云,当时的情况就像下图这样;

clipboard.png
然后我执行了ps aux --sort -rss,查看相关的情况,以下是部分截图:

clipboard.png

clipboard.png

发现其中有很多列都有重复,而且还有很多的时间都很靠前,于是我就 kill 了一两个重复的,
然后:

clipboard.png
可用内存变多了。
我有些疑惑:

  1. 这里的项为什么会重复,为什么老早的还在,是常驻内存的?
  2. 这样直接 kill 掉会不会出现意外情况?

Linux 不熟悉,只会点简单命令,还要靠搜索,想请各位大佬给个明晰的指教,菜鸟拜谢

阅读 4.8k
2 个回答

可以在 handle() 方法里加上 \DB::connection()->disableQueryLog(); 来关闭查询日志。
这个日志在查询数据库时会一直累加,记录在 $queryLog 这个数组里,会导致内存占用越来越高。

public function handle()
{
    // 关闭查询日志
    \DB::connection()->disableQueryLog();

    // other code
}

  • 做个实验,在 QueryLog 开启的情况下,进行循环查询,会发现 \DB::getQueryLog() 数组后边会不断追加查询记录,而应用内存占用也会因此越来越高。
public function handle()
{
    // 开启查询日志
    \DB::connection()->enableQueryLog();

    for ($n = 1; $n <= 100; $n++) {
        User::where('fan', '>', 1000000)->get();
        print_r(\DB::getQueryLog());
        $this->info('第' . $n . '次循环,占用内存' . round(memory_get_usage() / 1024) . 'K');
    }
}
  • 在 QueryLog 关闭的情况下,进行循环查询,会发现 \DB::getQueryLog() 数组会一直是空的,而应用内存占用会基本保持不变。
public function handle()
{
    // 关闭查询日志
    \DB::connection()->disableQueryLog();

    for ($n = 1; $n <= 100; $n++) {
        User::where('fan', '>', 1000000)->get();
        print_r(\DB::getQueryLog());
        $this->info('第' . $n . '次循环,占用内存' . round(memory_get_usage() / 1024) . 'K');
    }
}

仔细查看一下任务代码,估计是内存泄漏了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题