Zend OPcache Huge_code_pages:madvise(HUGEPAGE)失败

Zend OPcache Huge_code_pages:madvise(HUGEPAGE)失败

我在新安装的服务器上运行 PHP 命令行脚本时遇到此错误:

PHP 警告:Zend OPcache Huge_code_pages:madvise(HUGEPAGE)失败:参数无效

服务器运行 CentOS 7.3,PHP 7.1.4 来自雷米存储库

根据remi 论坛上的这个帖子, 和plesk.com 上的此主题huge_code_pages,解决办法是在php-opcache.ini中禁用:

opcache.huge_code_pages=0

然而,雷米这个问题应该只发生在 CentOS 6 上,而不是 CentOS 7 上。

在我huge_code_pages永久禁用之前,有没有办法让它发挥作用?

答案1

您正在使用的 OVH 内核,根据OVH 配置文件,不设定CONFIG_TRANSPARENT_HUGEPAGE=y。因此,您的内核不支持透明大页面,因此madvise(HUGEPAGE)会失败并出现无效参数错误。

如果您想使用透明大页面,则需要使用支持它们的内核 - 要么切换到 CentOS 7.3 内核,要么基于 OVH 构建您自己的内核。

我建议进行基准测试,看看透明大页面是否会在您的工作负载下带来任何性能优势。

附带说明一下,您需要确保内核得到升级——更新通常包含重要的安全修复程序。不安装它们(并重新启动)通常会使您的系统受到本地(有时甚至是远程)root 攻击。

答案2

接受的答案提到透明大页面和内核编译选项是不正确的。

PHP OPcache 与透明大页面无关,它与旧的有关,明确的大页机制。

因此,opcache.huge_code_pages=1仅通过在 OPCache 中启用大页面是不够的,必须在内核设置中进行一些更改,例如vm.nr_hugepages = 128/etc/sysctl.conf分配 256 MB 的显式大页面,只要您的大页面大小为 2MB)。

即使这可能还不够,具体取决于操作系统。在 CentOS 7 中,这些页面的安装方式如下:

hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)

这就足够了。在其他发行版中,您可能需要手动安装它们,请参阅这里了解详情。

有关 OPCache / Web 服务器上下文中的透明大页面与显式大页面的更多详细信息,请参阅这里

使用这个逻辑很容易分辨出哪个是什么:

  • 透明大页面实际上按照命名 - 透明。也就是说,您无需在应用程序一侧进行任何配置即可启用它们。它对所有应用程序都是无缝的。
  • 需要在特定应用程序内部和外部配置/启用显式大页面。这意味着应用程序本身有额外的代码/配置来支持它们,并且必须确保操作系统将启用这些大页面。这正是 OPCache 的情况,也是 OPCache 为其提供特殊指令的原因。

这是关于 OVH 内核中可能缺少的其他指令。从内核文档

Linux 内核需要使用 CONFIG_HUGETLBFS(位于“文件系统”下)和 CONFIG_HUGETLB_PAGE(选择 CONFIG_HUGETLBFS 时自动选择)配置选项进行构建。

相关内容