Утечка памяти Symfony и монолог и консоль

Я провел последние 2 часа, пытаясь найти утечку памяти.

  • Оптимизирована доктрина массовой обработки
  • Оптимизировал мой отрывок и все эти аннотации к доктрине
  • Оптимизирован SQL Logger
  • Сценарий все еще протекает
  • Решил закомментировать ведение журнала, потому что я ничего не мог сделать в любом случае

Получается что

  • Более 40 000 итераций без записи в журнал при каждом n, но с модулем 50, начало mem: 28 мб, end mem: 30 мб
  • Более 5 000 итераций с регистрацией при каждом n, без модуля, начало mem: 28 МБ, конец mem 38 МБ.

пример

 # this leaks
 # start mem: 28 mb end mem: 38mb, n = 5k
 foreach ($this->queryData->iterate() as $j => $data):
            declare(ticks = 1);
            self::$currentAd++;
            $this->em->detach($data[0]);
            $this->logger->info(LogUtility::getMemoryUsage() . " (" . self::$currentAd .")");
            if(self::$currentAd === 40000 ):
                break(2);
            endif;
  endforeach;

 # this doesn't leak
 # start mem: 28 mb end mem: 30mb, n = 40k
 foreach ($this->queryData->iterate() as $j => $data):
            declare(ticks = 1);
            self::$currentAd++;
            $this->em->detach($data[0]);
            if(self::$currentAd % 50 == 0):
                  $this->logger->info(LogUtility::getMemoryUsage() . " (" . self::$currentAd .")");
            endif;
            if(self::$currentAd === 40000 ):
                break(2);
            endif;
  endforeach;

мой монолог конфиг:

 handlers:
    test:
        type:   stream
        path:   "%kernel.logs_dir%/immobilier/test.log"
        level:  debug
        channels: test
  console:
        type:   console
        bubble: false
        verbosity_levels:
            VERBOSITY_VERBOSE: INFO
            VERBOSITY_VERY_VERBOSE: DEBUG
        channels: [test]

Любые предложения, чтобы исправить это?

2 ответа

Решение

Нашел решение. Я не могу сказать вам точные причины, почему такая утечка памяти происходит, однако в соответствии с этим; Добавление --no-debug Вариант с вашей командой решает проблему. Это на самом деле сделал, и это даже уменьшило память на 2 МБ. Ура!

В дополнение к ответу @delmalki вы можете проверить, есть ли у вас fingers_crossed обработчик и установите buffer_size:

monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: critical
            handler: grouped
            excluded_404s:
                - ^
            buffer_size: 30

Забавно, что когда я добавляю эту опцию, использование памяти фактически удваивается. Вызов мусора, похоже, тоже не решает эту проблему.

Другие вопросы по тегам