PHP 優化 – 啟用 HugePage (php7.4-fpm & php8.0-fpm)

啟用 Linux 系統的 HugePage(大型暫存分頁機制)可讓 PHP 的 Text 段落和記憶體中的分頁都改用 HugePage 來儲存,來減少 TLB(Translation Lookaside Buffer)遺失而提高效能。原本系統記憶體多以 4KB 來分頁,但啟用 HugePage 後則改以 2MB 來分頁。CPU 存取記憶體時,得查表才能得知虛擬定址和記憶體定址間的轉換,CPU 會透過 TLB 暫存來加速查表。若分頁單位越小,分頁筆數就越多,查表時就會得建立越多 TLB ,容易造成暫存資料的遺失而得重查,啟用了大型 HugePage 分頁設定就能減少 TLB 數量而降低遺失的問題。

若以小小站規模,透過sudo sysctl vm.nr_hugepages= 256 指令,來分配 256 個預留的大型暫存分頁(共 512MB)),然後在php.ini設定檔中加入 opcache.huge_code_pages=1的敘述就能啟用。

啟用 hugepages

sudo sysctl -w vm.nr_hugepages=256 && echo 'vm.nr_hugepages=256' | sudo tee -a /etc/sysctl.conf > /dev/null

編輯 php.ini 啟用功能

opcache.file_cache="/dev/shm"
opcache.huge_code_pages=1

觀察 hugepages 動態

ubuntu@host:~$ grep Huge /proc/meminfo
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:     256
HugePages_Free:      231
HugePages_Rsvd:       25
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:          524288 kB

php 使用的記憶體

ubuntu@host:~# size /usr/bin/php7.4
   text    data     bss     dec     hex filename
4061631  573374  119376 4754381  488bcd /usr/bin/php7.4