如何解决OPcache 实习字符串缓冲区大小低于“opcache.interned_strings_buffer”
我认识到由 opcache_get_status()
报告的实习字符串缓冲区大小总是小于 opcache.interned_strings_buffer
的分配值,也由 opcache_get_configuration()
返回。使用以下小脚本进行比较:
<?PHP
$config = opcache_get_configuration();
$status = opcache_get_status(false);
echo '<pre>Assigned interned strings buffer: ' . (( $config['directives']['opcache.interned_strings_buffer'] * 1024**2 )) . PHP_EOL;
echo 'Reported interned strings buffer: ' . $status['interned_strings_usage']['buffer_size'];
我得到以下结果,逐步增加分配的配置值:
Assigned interned strings buffer: 4194304
Reported interned strings buffer: 3145304
Assigned interned strings buffer: 5242880
Reported interned strings buffer: 4193880
Assigned interned strings buffer: 7340032
Reported interned strings buffer: 6291032
Assigned interned strings buffer: 8388608
Reported interned strings buffer: 6291032
Assigned interned strings buffer: 12582912
Reported interned strings buffer: 10485336
Assigned interned strings buffer: 13631488
Reported interned strings buffer: 11533912
Assigned interned strings buffer: 14680064
Reported interned strings buffer: 12582488
Assigned interned strings buffer: 15728640
Reported interned strings buffer: 13631064
Assigned interned strings buffer: 16777216
Reported interned strings buffer: 12582488
Assigned interned strings buffer: 17825792
Reported interned strings buffer: 13631064
Assigned interned strings buffer: 18874368
Reported interned strings buffer: 14679640
Assigned interned strings buffer: 20971520
Reported interned strings buffer: 16776792
有趣的步骤是:
- 7 到 8 MiB,其中产生的缓冲区大小保持不变 6291032 字节
- 15 到 16 MiB,结果状态报告一个递减的值,因此 14 和 16 MiB 分配的缓冲区导致相同的 12582488 > 字节和 15 和 17 MiB 字节也与 13631064 字节匹配。
比较单个 MiB 步骤表明报告的大小按预期增加了 1 MiB,但是当达到 2 的幂时,内部逻辑似乎减少了生成的内部字符串缓冲区大小,以非常精确地匹配 75%分配的值。对于较大的值,这意味着较高的分配值可能会导致较小的缓冲区大小。
总的 OPcache 大小 btw 是 128 MiB,在这些测试期间有足够的可用空间,因此基本上排除了其影响。
我在 PHP7.3、PHP7.4 和 PHP8.0 上观察到这一点,这些构建由 Debian 存储库提供。我想这是所有 PHP OPcache 实现的预期行为,因为它遵循一些逻辑,但我找不到任何地方记录它,它可能会引起一些混乱,至少对我来说是这样。
最大加速文件的另一个不匹配在 PHP 文档中有解释(没有分配的值,但使用了一组质数的下一个更大的匹配),但对于内部字符串缓冲区,没有额外的解释: https://www.php.net/manual/opcache.configuration.php#ini.opcache.interned-strings-buffer
也许有人可以更好地解释这背后的逻辑和意图?如果是这样,我们可以扩展 PHP 文档以涵盖这种情况,或者要求不涉及否定(数字)的不同逻辑较高分配的 opcache.interned_strings_buffer
值的影响。
解决方法
我没有解释,但根据 zend_accel_init_shm(),给定的 interned_strings
将始终减少为“2 的幂”,大小至少为 8 MB。因此,hash_size
和后续的 nTableMask
对于 interned_strings
大小的
- 1..3
- 4..7
- 8..15
- 16..31
- 等等。
我不完全理解代码中的上下文,但仅仅因为上述我怀疑 interned_strings_buffer
应该设置为 8、16、32 MB 等值。但要小心: interned_strings_buffer
减去 memory_consumption
。 32 MB interned_strings_buffer
和 64 MB memory_consumption
从一开始就导致 50% 的 opcache 使用率。
无论如何,比来自 php.net 的 opcache.interned_strings_buffer: The amount of memory used to store interned strings,in megabytes. 更好的解释会很好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。