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を実行します。レミーストア

~によるとレミーフォーラムに登場したイーグルplesk.comのこのトピックhuge_code_pages、解決策はphp-opcache.iniでこれを無効にすることです:

opcache.huge_code_pages=0

しかしレミは説明するこの問題は、CentOS 7ではなくCentOS 6でのみ発生します。

huge_code_pages永久に無効にする前に動作させる方法はありますか?

答え1

使用しているOVHカーネルは次のとおりです。OVH構成ファイル、設定されていませんCONFIG_TRANSPARENT_HUGEPAGE=y。したがって、カーネルは透過的なhugepageをサポートしていないため、madvise(HUGEPAGE)無効なパラメータエラーが原因で失敗します。

透明なhugepageを使用するには、それをサポートするカーネルを使用する必要があります。 CentOS 7.3カーネルに切り替えるか、OVHに基づいて直接ビルドしてください。

透明なhugepageがワークロードに応じてパフォーマンス上の利点をもたらすことができるかどうかをベンチマークすることをお勧めします。

参考までに、カーネルが更新されていることを確認する必要があります。アップデートには重要なセキュリティ修正が含まれることがよくあります。インストールせずに再起動すると、システムがローカル(時にはリモート)のルート攻撃にさらされることがよくあります。

答え2

許容される回答には、透明なhugepagesと無効なカーネルコンパイルオプションが含まれています。

PHP OPcacheは透明なhugepagesとは何の関係もなく、古いページに関連しています。明らかに巨大なページメカニズム。

したがって、opcache.huge_code_pages=1OPCacheでhugepageを有効にするだけでは不十分であり、カーネル設定をいくつか変更する必要がありますvm.nr_hugepages = 128(たとえば/etc/sysctl.conf、hugepageサイズが2MBの場合は256MBの明示的なhugepage割り当て)。

オペレーティングシステムによっては、これだけでは十分ではないかもしれません。 CentOS 7では、これらのページは次のようにインストールされます。

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

十分です。他のディストリビューションでは手動でインストールする必要があります。ここもっと学ぶ。

OPCache / Webサーバーの文脈で、透明な巨大ページと明示的な巨大ページの詳細については、以下を参照してください。ここ

このロジックを使用すると、何が何であるかを簡単に知ることができます。

  • 透明なhugepageは実際に名前が付いたように透明です。つまり、これを有効にするためにアプリケーション側で構成を実行する必要はありません。すべてのアプリケーションにシームレスに適用されます。
  • 明示的なhugepageは、特定のアプリケーションの内部と外部の両方で構成/アクティブ化する必要があります。これは、アプリケーション自体にそれをサポートするための追加のコード/構成があり、オペレーティングシステムがこれらの巨大なページをアクティブにすることを確認する必要があることを意味します。これが OPCache の場合であり、OPCache がこれに関する特別なガイドラインを提供する理由です。

これは、OVHカーネルに欠けている可能性がある他のガイドラインに関するものです。カーネルから文書:

Linuxカーネルは、CONFIG_HUGETLBFS(ファイルシステムの下にあります)とCONFIG_HUGETLB_PAGE(CONFIG_HUGETLBFSを選択した場合は自動的に選択されます)設定オプションを使用して構築する必要があります。

関連情報