2016-11-15 132 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) 
} 

所以,你應該懷疑的代碼沒有被正確緩存,除非這些文件包含類似的(單語句,單指令)代碼。