Opcache Status内存大小问题


Opcache Status Memory Size Issue

我目前在使用PHP7.0-FPM时遇到一些使一些麻烦的opcache条目无效的问题。

当我在opcache_get_status中查看时,一些文件正在被缓存,内存大小为680.00b。这些文件的大小通常在50kb左右,并且似乎被正确缓存,但是Opcache报告这些文件的数量恰好是680.00b。

Opcache设置:

; 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让它们以真实的文件大小显示,这使得监控/故障排除变得困难。

当不同的脚本显示相同的消耗时:一个可能的原因是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)
}

因此,您应该怀疑代码没有被正确缓存,除非这些文件包含类似的(单个语句,单个指令)代码。