最近在給使用yaf框架的專案封裝專用的php的docker環境,發現之前沒太注意問題,藉此分享下:
1.php的執行器:
關於執行器排程之前一直覺得預設是call(早前其中選項:call,switch,goto),在一些出版物裡也是這樣描述的,但在打算重新編譯php-fpm的映象前謹慎的看了下7.4的zend_vm_gen.php原始碼發現多出來一個“HYBRID”選項,而且預設的就是它。
關於“HYBRID”直接查了下在17年被提交到github原始碼上的,那時還未合併到主線。它的作用就是執行時對於分支的預測,處理方式和call差不多,只是對一些簡單的opcode標記為hot,直接使用goto方式訪問。(只有在GCC高於4.8.0且支援計算的goto和全域性暫存器變數的x86,x86_64和PPC64上才能啟用HYBRID VM,否則它將回退到CALL VM。 (將來可能會刪除對全域性暫存器變數的限制))。
對於GOTO選項,會有cpu效能開銷和執行程式優化問題,但執行是最快的不可否認,所以在稍後改到goto需要多做測試。
2.關於HugePage:
由於php在執行時執行體用HugePage(opcache.huge_code_pages=1)對於系統開銷要小些(對於linux的記憶體分頁不多說,網上一堆說明)這裡只說下對於docker:
在docker中是無法執行sysctl vm.nr_hugepages做HugePage分配的,它在使用時要依據宿主機的HugePage,此時在主機執行sudo sysctl vm.nr_hugepages=30,分配HugePage後,虛擬機器中的php在開啟.huge_code_pages下就會自動使用了。
由於打包優化還有點未完成,所以後續再補充
本作品採用《CC 協議》,轉載必須註明作者和本文連結