我的 PHP OPcache 内存使用率达到 100%
General info
Zend OPcache 7.0.4-dev
PHP 5.5.23-1+deb.sury.org~trusty+2
Server Software nginx/1.6.2
这是我的缓存设置:
zend_extension=opcache.so
opcache.memory_consumption=1024
opcache.max_accelerated_files=50000
opcache.revalidate_freq=180
opcache.consistency_checks=0
关于缓存命中的更多信息:
total memory: 1024.000MB
used memory: 1010.398MB
free memory: 35.086KB
wasted memory: 13.568MB (1.32%)
number of cached files: 10,724
number of hits: 9,576,431
number of misses: 21,450
blacklist misses: 0
number of cached keys: 12,971
max cached keys: 65,407
我是否应该担心内存使用率达到 100% ?有人能用通俗易懂的语言解释一下 OPcache 的内存使用情况吗?
该服务器有 8GB Ram(Linode)
答案1
有人可以用外行人能理解的语言解释一下 OPcache 内存使用情况吗?
ldennison 以及各位评论者可能已经/大部分回答了这部分内容。
另一篇精彩的文章可以在这里找到:http://www.sitepoint.com/understanding-opcache/
请允许我总结一下:
OPcache 允许您预先分配一定量的内存。您已将其设置为 1024,即 1GB。这是在告诉您的系统:“缓存最多 1GB 的已编译 php 脚本,这样计算机就不必在每次运行时将其从人类可读的 PHP 代码转换为计算机可以理解的 1 和 0。” 每次第一次运行此类脚本时,其预编译版本都会添加到此缓存库中。它在第一次运行时尚未进入缓存,因此这是一次缓存未命中。如果再次请求它,并且已经/仍在缓存中,它将从缓存中获取,从而节省一个“昂贵”的计算阶段。这构成了一次缓存命中。
内存使用率仅表示 1GB 内存中有多少被使用。您会看到使用率为 100%。这意味着您缓存了 1GB 的 php 脚本,并准备从此缓存中提供服务。缓存已满,因此要么无法添加新脚本,要么会删除不受欢迎的缓存项,具体取决于设置/引擎。
我是否应该担心内存使用率达到 100%?
不。
如果您的缓存命中率较低,即它反复在缓存中查找文件但找不到(例如,因为文件不适合缓存),那么您应该“担心”。但是您的缓存命中率很高,即几乎每次它需要缓存中的某个文件时,它都能找到。这意味着您的 1024 MB 缓存大小(占服务器总 RAM 的 1/8)非常好。
将缓存大小加倍可能不会显著改变缓存命中率。增加 100 MB 可能足以将命中率从 96% 提高到 98%。
因此,您看到的“问题”(100% 内存使用率)看起来不像是真正的问题。是的,它已满,但并没有错过太多有价值的东西。在这种规模下,它可以满足 96% 的需求。这是一个很棒的统计数据。
这样看看...
如果图书馆已经挤满了人,无法再容纳更多的书籍,但它已经拥有世界上 96% 的书籍,是否值得扩建?扩建是否会增加图书馆访客的满意度?每 100 名访客中已有 96 名找到了他们想要的书籍。
答案2
您的 opcache 内存限制(目前设置为 1024MB/1GB)应该足够大,以覆盖 Opcache 缓存的所有 PHP 文件的大小。1GB 对于一组 PHP 文件来说太大了,所以这可能不是问题,但您至少应该从那里开始。您附加的屏幕截图上的“文件使用情况”按钮可能会为您提供每个缓存文件的内存使用情况报告。
对您发布的数字进行一些快速计算,1024MB / 10,724 个文件 ~= 平均每个文件 98kb。我想这是可能的,具体取决于您托管的内容。这是包含大量不同 PHP 文件的共享服务器吗?
您可以opcache.max_file_size
在缓存配置中设置排除任何大型 PHP 文件进行缓存。例如,opcache.max_file_size = 102400
将排除任何超过 100KB 的 PHP 文件进行缓存。该配置设置的值以字节为单位。
简单来说,Opcache 会获取一个 PHP 文件并将其加载到内存中。然后,当某个新点(可能是由其他用户)请求 PHP 文件时,它会从内存而不是磁盘中提取。这既节省了磁盘 I/O 时间,也节省了编译 PHP 文件的时间,因为它以编译格式存储(因此有操作码命名)。您当前的设置允许最多缓存 50,000 个文件,内存使用量为 1GB。