Проблема размера памяти состояния Opcache

В настоящее время у меня возникают проблемы с аннулированием некоторых проблемных записей opcache при использовании PHP7.0-FPM.

Некоторые файлы кэшируются с размером памяти 680.00b, когда я просматриваю в opcache_get_status. Эти файлы обычно имеют размер около 50 КБ и, похоже, кэшируются правильно, но Opcache сообщает, что количество этих файлов составляет ровно 680,00 байт.

Настройки опкеша:

; configuration for php opcache module
; priority=10
zend_extension=opcache.so
opcache.memory_consumption=16384
opcache.max_accelerated_files=32531
opcache.validate_timestamps=0
opcache.revalidate_freq=600
opcache.max_file_size=0
opcache.fast_shutdown=1

Это необычная установка, когда сгенерированные файлы кэшируются, поэтому иногда возникают проблемы, и файлы заменяются/повторно кэшируются.

Есть ли какая-нибудь причина, по которой кто-нибудь может подумать, почему opcache показывает эти файлы как 680.00b? opcache_reset или opcache_invalidate не помогают. Я должен полностью заменить файлы и использовать opcache_reset, чтобы они отображались с их истинным размером, и это затрудняет мониторинг/устранение неполадок.

Заранее спасибо.


person Hungry    schedule 15.11.2016    source источник


Ответы (1)


Когда дело доходит до разных скриптов, показывающих одинаковое потребление: Одна из возможных причин заключается в том, что opcache должен выделять память, выровненную для лучшей производительности на текущей платформе.

Например (ни один из этих кодов не является реальным):

void *mem = zend_opcache_alloc(sizeof(void*));

mem будет sizeof void* + ZEND_MM_ALIGNMENT(sizeof void*, platform)

Таким образом, в конце области есть какое-то дополнение для обеспечения наилучшего выравнивания, это означает, что вы можете выделить (например) 8 байтов или 64 байта, и будет возвращен 128-байтовый блок (ни одно из этих чисел не является правильный).

Это может привести к тому, что разные скрипты будут иметь одинаковый размер по совпадению.

Когда дело доходит до того, почему некоторые скрипты используют очень мало памяти:

<?php
$a = 1;
?>

Выдает следующую статистику:

["/usr/src/php-src/test.php"]=>
array(6) {
  ["full_path"]=>
  string(25) "/usr/src/php-src/test.php"
  ["hits"]=>
  int(0)
  ["memory_consumption"]=>
  int(696)
  ["last_used"]=>
  string(24) "Wed Nov 16 05:47:26 2016"
  ["last_used_timestamp"]=>
  int(1479275246)
  ["timestamp"]=>
  int(1479275244)
}

Таким образом, вы должны подозревать, что код кэшируется неправильно, если только эти файлы не содержат аналогичный (один оператор, одна инструкция) код.

person Joe Watkins    schedule 16.11.2016