PHP Opcache 配置優化實戰

前言

起源:在很長的一段時間裏,咱們的web服務器在遇到大規模流量訪問的時候,很容易就把 CPU 負載飆到了 100%,致使響應速度過慢,用戶體驗卡頓,直到最近開啓了Opcahe後,咱們的QPS從200-300+,提高了1000+,響應速度也提升了不少,通過幾天的摸爬滾打,終於有了一些些小小的經驗,終於能夠分享一下了。php

在網上不少搜索Opcache配置優化的一些博客,很快就能得到一堆配置,可是是否真的適用於如今的項目規模和資源模式呢?對此下面將說明一些如何根據項目實際狀況去優化opcache配置。web

這是一段在網上推薦配置,下面咱們嘗試從實際出發來嘗試調優這個配置。緩存

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.save_comments=1
opcache.fast_shutdown=1

個人PHP實驗環境爲:PHP7.3,不一樣版本可能略有差別。服務器

配置調整 && 優化

opcache.enable

opcache.enable - 啓用操做碼緩存。若是禁用此選項,則不會優化和緩存代碼。框架

因此咱們須要設置爲開啓狀態,才能啓用到Opcache。函數

opcache.enable = 1

opcache.memory_consumption

opcache.memory_consumption - OPcache 的共享內存大小,以兆(M)爲單位。php-fpm

它的默認值爲64M,可是根據不一樣項目不一樣規模,都有不一樣的設置,咱們可使用 opcache_get_status 函數來查看Opcahce消耗了多少內存,是否根據須要增長內存,性能

opcache_get_status中提供內存消耗信息的是memory_usage,值以字節爲單位(byte)優化

"memory_usage": {
    "used_memory": 91647160,
    "free_memory": 440537232,
    "wasted_memory": 4686520,
    "current_wasted_percentage": 0.8729323744773865
},

咱們計算 memory_consumption 的公式爲: ( used_memory + free_memory + wasted_memory) / 1048576spa

那麼這個配置的結果爲: (91647160 + 440537232 + 4686520 ) / 1048576 = 512M

memory_consumption = 512M

interned_strings_buffer

interned_strings_buffer - 用來存儲預留字符串的內存大小,以兆字節爲單位。

PHP使用了一種叫作字符串駐留(string interning)的技術來改善性能。例如,若是你在代碼中使用了1000次字符串「aabbcccdd」,在PHP內部只會在第一次分配一個內存區域來儲存該字符串,剩下的999次將使用內存指針來引用該字符串。

默認狀況中,這個優化只會存在於單個PHP-FPM進程中,若是設置了這個選項,將會在全部 PHP-FPM 進程中共享。在比較大的項目中,這能夠很是有效地節約內存,提升應用的性能。

該選項默認值爲8MB,咱們能夠根據項目的規模和實際狀況來調整這個數值。

opcache.interned_strings_buffer=8

opcache.interned_strings_buffer=16

opcache.max_accelerated_files

opcache.max_accelerated_files - OPcache 哈希表中可存儲的腳本文件數量上限。 真實的取值是在質數集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個大於等於設置值的質數。 設置值取值範圍最小值是 200,最大值在 PHP 5.5.6 以前是 100000,PHP 5.5.6 及以後是 1000000。

配置要保存在內存中的文件數,咱們能夠經過如下命令在獲取整個項目中的php文件數。

find . -type f -print | grep php | wc -l

能夠根據項目的文件數,在上面的 質數集合中選取 >= 的第一個質數。

我本地項目的運行結果爲:

find . -type f -print | grep php | wc -l

18918

那麼配置則爲:

opcache.max_accelerated_files = 32531

opcache.validate_timestamps

opcache.validate_timestamps 啓用此選項後,PHP將根據您的opcache.revalidate_freq值檢查文件時間戳,來肯定是否須要從新生成PHP腳本編譯緩存。

在生產環境模式中,若是項目流量比較高,請求比較密集,建議關閉此選項,以此來得到最高性能。

opcache.validate_timestamps = 0

設置關閉後,每次部署代碼沒法即時得到更新,須要重啓php-fpm進程或者使用 kill -SIGUSR2 進行平滑重啓,方可生效最新代碼。

revalidate_freq

revalidate_freq - 檢查腳本時間戳是否有更新的週期,以秒爲單位。 設置爲 0 會致使針對每一個請求, OPcache 都會檢查腳本更新。若是 opcache.validate_timestamps 配置指令設置爲禁用,那麼此設置項將會被忽略。

在本地或開發環境開啓Opcache咱們能夠設置爲:

opcache.revalidate_freq = 0

小型流量服務端,能夠設置爲600s(10分鐘),檢查腳本更新

opcache.revalidate_freq = 600

大型及中型服務端建議設置 3600s 或 不作腳本更新檢查,或者定時在流量低峯期作檢查。

opcache.revalidate_freq = 3600

save_comments

save_comments - 若是禁用,腳本文件中的註釋內容將不會被包含到操做碼緩存文件, 這樣能夠有效減少優化後的文件體積。 禁用此配置指令可能會致使一些依賴註釋或註解的 應用或框架沒法正常工做, 好比: Doctrine, Zend Framework 2 以及 PHPUnit。

若是項目中沒有用到依賴註解等,能夠將這個選項關閉,否者應開啓。

fast_shutdown

fast_shutdown - 若是啓用,則會使用快速中止續發事件。 所謂快速中止續發事件是指依賴 Zend 引擎的內存管理模塊 一次釋放所有請求變量的內存,而不是依次釋放每個已分配的內存塊。

從 PHP 7.2.0 開始,此配置指令被移除。 快速中止的續發事件的處理已經集成到 PHP 中, 只要有可能,PHP 會自動處理這些續發事件。

這個字配置會加快 php-fpm worker 進程回收,以便爲下一個請求更快作好準備。

低於 PHP 7.2.0 須要手動開啓。

opcache.fast_shutdown=1

最終咱們優化調整後的位置以下,將它覆蓋到php.ini,重載php-fpm進程便可生效。

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=32531
opcache.validate_timestamps=0
opcache.save_comments=1
opcache.fast_shutdown=1

結尾

以上就是opcache部分配置優化策略,合理的使用OPcahce將會減小Web服務器的CPU使用率,可是會增長必定的內存使用率。若是使用獲得,這將會大大提升或服務端和PHP的吞吐量。

最後補上開啓OPcahe的優化後的效果圖。

image

相關文章
相關標籤/搜索