我在新安装的服务器上运行 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 时自动选择)配置选项进行构建。