2016-11-15 130 views
0

我目前在使用PHP7.0-FPM时遇到了一些令人讨厌的opcache条目无效的问题。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使它们显示出真实的文件大小,并且使监控/故障排除变得困难。

在此先感谢。

回答

5

当涉及到显示相同消耗的不同脚本时:一个可能的原因是opcache需要分配内存以便在当前平台上获得最佳性能。

例如(没有这个代码是真实的):

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

memsizeof 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) 
} 

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