PHP 7 發布之初即帶來兩項極具吸引力的性能優化特性:HugePage(大頁內存) 與 PGO(Profile-Guided Optimization,配置文件引導優化)。兩者分別從運行時內存佈局與編譯期代碼生成兩個維度切入,實測可為 WordPress 等典型 PHP 應用帶來 2%~7% 的 QPS 提升。本文將手把手教你在 Ubuntu 環境下開啟這兩項特性,並附帶基準測試數據對比。
默認內存頁面為 4KB,虛擬地址到物理地址的轉換需查頁表,CPU 依靠 TLB(Translation Lookaside Buffer)緩存加速。頁面越小,頁表條目越多,TLB 命中率下降。HugePage 將頁面擴大至 2MB,可大幅減少頁表條目,降低 TLB Miss,從而提升指令獲取效率。
--enable-huge-code-pages,切勿加 --disable-huge-code-pages)opcache.huge_code_pages=1# 查看當前狀態 cat /proc/meminfo | grep Huge # 永久生效寫入 /etc/sysctl.conf,臨時生效執行: sudo sysctl vm.nr_hugepages=128 # 分配 128 個 2MB 頁 = 256MB # 再次確認 cat /proc/meminfo | grep Huge # 預期看到 HugePages_Total: 128, HugePages_Free: 128
zend_extension=opcache.so opcache.enable=1 opcache.huge_code_pages=1
# 啟動 php-fpm /home/huixinchen/local/php7/sbin/php-fpm # 檢查內存變化 cat /proc/meminfo | grep Huge # HugePages_Free 減少,HugePages_Rsvd 增加,說明 PHP TEXT 段已映射到 HugePage # 核對 text 段大小 size /home/huixinchen/local/php7/sbin/php-fpm # text 約 10MB,需 5 個 2MB 頁,與觀測到的 4~5 個頁吻合(尾部不足一頁不遷移)
已知副作用:啟用後 perf report/anno 會出現符號丟失(valgrind、gdb 不受影響),因 Perf 依賴 mmap 監聽,而 HugeTLB 僅支持 MAP_ANON,期待內核未來修復。
PGO 通過「訓練運行」收集熱點路徑、分支預測等 Profile 數據,再反饋給 GCC 進行二次編譯,生成針對特定負載優化的二進制。優化效果強綁定訓練場景,通用性較弱,但對固定業務(如 WordPress 首頁)極其有效。
# 1. 基線測試 ab -n 10000 -c 100 https://your-host/wordpress/ # 基線 QPS:1116.48 # 2. 下載 PHP 7 源碼並 ./configure(保持默認參數) # 3. 第一次編譯:生成帶插桩的二進制 make prof-gen # 4. 訓練運行:用 php-cgi 反覆跑目標頁面 100 遍 sapi/cgi/php-cgi -T 100 /path/to/wordpress/index.php >/dev/null # 5. 二次編譯:使用 Profile 數據優化 make prof-clean make prof-use && make install # 6. 驗證優化效果 ab -n 10000 -c 100 https://your-host/wordpress/ # 優化後 QPS:1191.78(提升 ~7%)
| 優化手段 | 適用場景 | 預期收益 | 實施成本 |
|---|---|---|---|
| HugePage | 所有長運行 PHP-FPM 進程 | 2%~3% QPS 提升 | 低(OS 配置 + php.ini 一行) |
| PGO | 固定業務入口(如 CMS 首頁、API 網關) | 額外 5%~10% QPS | 中(需訓練腳本 + 雙編譯流程) |
兩者可疊加使用,為高並發 PHP 服務榨取極致性能提供了低成本、高回報的路徑。建議先在預發環境驗證穩定性,再推廣至生產。