【问题标题】:Can opcache be forced to keep cached scripts in memory?可以强制 opcache 将缓存的脚本保存在内存中吗?
【发布时间】:2015-11-22 15:06:04
【问题描述】:

我们使用启用了 opcache 的 Apache 和 php-fpm 运行生产服务器。目前opcache已经配置了1024MB的可用内存上限。

但是,当我最近分析服务器和 opcache 时,我注意到 FPM/opache 使用的实际内存与操作系统实际使用的内存之间存在明显差异。

分析 opcache,它告诉我目前它使用了大约 850MB 的内存,缓存了大约 8000 个脚本。但是,htop 告诉我当前进程只使用了大约 600MB 的 RAM,其中 FPM 占用了大约 150MB。

我只能假设这意味着 opcache 将缓存的脚本存储在磁盘上而不是 RAM 上。但是,由于性能对我们很重要,而且我们有空闲的 RAM,有没有什么办法可以强制 opcache 将其所有缓存的脚本存储在 RAM 中?

【问题讨论】:

  • 您认为您的脚本需要超过 150MB 左右吗?
  • 我希望它们都保存在内存中。我们正在运行一个专用的分片,它有足够多的空闲内存。
  • Opcache 仅使用 ram 来缓存脚本 由于 opcache 将编译后的操作码存储在内存中,因此内存结果会因分析器而异。只需添加 - 您可以检查其他配置,例如禁用文件戳检查它会减少几毫秒。
  • 我已经禁用了时间戳检查和其他面向开发的设置,因为这是一个生产服务器。正如我在问题中提到的,opcache 根本不可能在内存中缓存,除非它或操作系统报告错误的内存使用情况。
  • 你是如何分析 opcache 的?

标签: php caching memory opcache


【解决方案1】:

Opcache 已经将所有编译后的代码(操作码)存储在内存中。

OPcache 通过存储预编译脚本来提高 PHP 性能 共享内存中的字节码,从而无需加载 PHP 并针对每个请求解析脚本。

http://php.net/manual/en/intro.opcache.php

这些数字是不同的,因为计算内存使用量、htop、top 使用系统 API 计算的方式不同,而 opcache_get_status 使用内部方法计算相同 - http://gcov.php.net/PHP_5_5/lcov_html/ext/opcache/zend_accelerator_module.c.gcov.php

这可能是因为语言级别的共享变量/内存优化。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2017-08-26
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多