讓 PHP7 更快之 Hugepage 詳解
PHP7剛剛發布了RC4, 包含一些bug修復和一個我們最新的性能提升成果(NEWS), 那就是"HugePageFy PHP TEXT segment", 透過啟用這個特性,PHP7會把自身的TEXT段(執行體)」挪「到Huagepage上,之前的測試,我們能穩定的在Wordpress上看到2%~3%的QPS提升。
關於Hugepage是啥,簡單的說下就是預設的記憶體是以4KB分頁的,而虛擬位址和記憶體位址是需要轉換的, 而這個轉換是要查表的,CPU為了加速這個查表過程都會內建TLB(Translation Lookaside Buffer),顯而易見如果虛擬頁越小,表裡的條目數也就越多,而TLB大小是有限的,條目數越多TLB的Cache Miss也就會越高,所以如果我們能啟用大內存頁就能間接降低這個TLB Cache Miss,至於詳細的介紹,Google一搜一大堆我就不贅述了,這裡主要說明下如何啟用這個新特性, 從而帶來明顯的性能提升。
新的Kernel啟用Hugepage已經變得非常容易了,以我的開發虛擬機為例(Ubuntu Server 14.04,Kernel 3.13.0-45), 如果我們查看記憶體資訊:
$ cat /proc/meminfo | grep Huge AnonHugePages: 444416 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
可見一個Hugepage的size是2MB, 而目前並沒有啟用HugePages. 現在讓我們先編譯PHP RC4, 記得一定不要加: --disable-huge-code-pages (這個新特性是預設啟用的, 你加了這個就關了)
然後配置opcache, 從PHP5.5開始Opcache已經是預設啟用編譯的,但是是編譯動態函式庫的, 所以我們還是要在php.ini中設定載入下。
zend_extension=opcache.so
這個新特性是做在Opcache裡的,所以也要透過Opcache啟用這個特性(透過設定opcache.huge_code_pages=1), 具體的設定:
opcache.huge_code_pages=1
現在讓我們來設定OS, 分配一些Hugepages:
$ sudo sysctl vm.nr_hugepages=128 vm.nr_hugepages = 128
現在讓我們再次檢查記憶體資訊:
$ cat /proc/meminfo | grep Huge AnonHugePages: 444416 kB HugePages_Total: 128 HugePages_Free: 128 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
可以看到我們分配的128個Hugepages已經就緒了, 然後我們來啟動php-fpm:
$ /home/huixinchen/local/php7/sbin/php-fpm [01-Oct-2015 09:33:27] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root [01-Oct-2015 09:33:27] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
現在, 再次檢查記憶體資訊:
$ cat /proc/meminfo | grep Huge AnonHugePages: 411648 kB HugePages_Total: 128 HugePages_Free: 113 HugePages_Rsvd: 27 HugePages_Surp: 0 Hugepagesize: 2048 kB
說到這裡,如果Hugepages可用, 其實Opcache也會用Hugepages來儲存opcodes緩存, 所以為了驗證opcache.huge_code_pages確實生效, 我們不妨關閉opcache.huge_code_pages, 然後再啟動一次後看內存資訊:
$ cat /proc/meminfo | grep Huge AnonHugePages: 436224 kB HugePages_Total: 128 HugePages_Free: 117 HugePages_Rsvd: 27 HugePages_Surp: 0 Hugepagesize: 2048 kB
可見開啟了huge_code_pages以後, fpm啟動後多用了4個pages, 現在我們檢查下php-fpm的text大小:
$ size /home/huixinchen/local/php7/sbin/php-fpm text data bss dec hex filename 10114565 695200 131528 10941293 a6f36d /home/huixinchen/local/php7/sbin/php-fpm
可見text段有10114565個位元組大小,總共需要佔用4.8個左右的2M的pages, 考慮到對齊以後(尾部不足2M Page部分不挪動), 申請4個pages, 正好和我們看到的相符。
說明配置成功! Enjoy
但有言在先, 啟用此特性以後, 會造成一個問題就是你如果嘗試通過Perf report/anno 去profiling的時候, 會發現符號丟失(valgrind, gdb不受影響), 這個主要原因是Perf的設計採用監聽了mmap,然後記錄位址範圍, 做IP到符號的轉換, 但是目前HugeTLB只支援MAP_ANON, 所以導致Perf認為這部分位址沒有符號訊息,希望以後版本的Kernel可以修復這個限製吧..
推薦教學:《PHP7》
以上是讓 PHP7 更快之 Hugepage 詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
