PHP7效能優化筆記

BanTang發表於2021-09-15

此文章參考自:
https://zhuanlan.zhihu.com/p/138714082,https://www.cnblogs.com/jj0219/p/10476983.html,https://www.laruence.com/2015/10/02/3069.html

1. Opcache原理
PHP的正常執行流程如下

request請求(nginx,apache,cli等)–>Zend引擎讀取.php檔案–>掃描其詞典和表示式 –>解析檔案–>建立要執行的計算機程式碼(稱為Opcode)–>最後執行Opcode–> response 返回

每一次請求PHP指令碼都會執行一遍以上步驟,如果PHP原始碼沒有變化,那麼Opcode也不會變化,顯然沒有必要每次都重新生成Opcode,結合在Web中無所不在的快取機制,我們可以把Opcode快取下來,以後直接訪問快取的Opcode豈不是更快,啟用Opcode快取之後的流程圖如下所示:

Opcode cache 的目地是避免重複編譯,減少 CPU 和記憶體開銷。
2. Opcache配置
在php.ini下新增:

// 載入opcache(需確認已安裝opcache擴充)
zend_extension=opcache.so
// 開啟opcache
opcache.enable = 1
// OPcache共享記憶體儲存大小,單位MB
opcache.memory_consumption=1024 // 1G
// PHP使用了一種叫做字串駐留,預設是4MB
opcache.interned_strings_buffer=32
// 這個選項用於控制記憶體中最多可以快取多少個PHP檔案,這個選項必須得設定得足夠大,大於你的專案中的所有PHP檔案的總和
opcache.max_accelerated_files=80000
// 設定快取的過期時間(單位是秒),為0的話每次都要檢查
opcache.revalidate_freq=3
// 從字面上理解就是“允許更快速關閉”
opcache.fast_shutdown=1
// CLI環境下,PHP啟用OPcache
opcache.enable_cli=1

1. HugePage原理
通過啟用這個特性,PHP7會把自身的TEXT段(執行體)”挪“到Huagepage上,之前的測試,我們能穩定的在Wordpress上看到2%~3%的QPS提升。
關於Hugepage是啥,簡單的說下就是預設的記憶體是以4KB分頁的,而虛擬地址和記憶體地址是需要轉換的, 而這個轉換是要查表的,CPU為了加速這個查表過程都會內建TLB(Translation Lookaside Buffer), 顯而易見如果虛擬頁越小,表裡的條目數也就越多,而TLB大小是有限的,條目數越多TLB的Cache Miss也就會越高, 所以如果我們能啟用大記憶體頁就能間接降低這個TLB Cache Miss,至於詳細的介紹,Google一搜一大堆我就不贅述了,這裡主要說明下如何啟用這個新特性, 從而帶來明顯的效能提升。
2. HugePage配置

$ sudo sysctl vm.nr_hugepages=512 // 切勿越大越好,會長佔記憶體

分配512個預留的大頁記憶體:

$ cat /proc/meminfo  | grep Huge
AnonHugePages:    106496 kB
HugePages_Total:     512
HugePages_Free:      504
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB

然後在php.ini中加入:

opcache.huge_code_pages=1

1. Opcache file cache介紹
使用opcache把編譯後的php檔案儲存為檔案,實現php原始碼保護和指令碼加速, 會有很明顯的效能提升
2. Opcache file cache配置
在php.ini中加入:

opcache.file_cache=/tmp

這樣PHP就會在/tmp目錄下Cache一些Opcode的二進位制匯出檔案, 可以跨PHP生命週期存在.

配置後需重啟php-fpm

系統:centOs 7
php版本:7.4
nginx

優化前

cpu:95%-96%
記憶體:2G/16G
10分鐘4W併發
失敗率:24%

聚合報告
PHP7效能優化筆記

每秒處理事務
PHP7效能優化

優化後

cpu:20%-40%
記憶體:5.8G/16G(此處我HugePage設定2048)
10分鐘4W併發
失敗率:0%

聚合報告
PHP7效能優化筆記

每秒處理事務
PHP7效能優化

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章