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