最近爲了應對雙十一期間高流量的衝擊,小編經過壓力測試去查找服務器性能瓶頸,發現100併發時,QPS
並非很高,但CPU和內存消耗特別高,尤爲是CPU消耗都100%了,而咱們的容器和服務器配置都差很少升級到頂級了,這不是如此好的服務器該發揮的效果,因而小編進行了一次全面排查:php
Opcache是什麼?laravel
Opcache是一種經過將解析的PHP腳本預編譯的字節碼(Operate Code)存放在共享內存中來避免每次加載和解析PHP腳本的開銷,解析器能夠直接從共享內存讀取已經緩存的字節碼(Operate Code),從而大大提升PHP的執行效率。
什麼是Operate Code?redis
當解釋器完成對腳本代碼的分析後,便將它們生成能夠直接運行的中間代碼,也稱爲操做碼(Operate Code,opcode)。Opcode cache的目地是避免重複編譯,減小CPU和內存開銷。若是動態內容的性能瓶頸不在於CPU和內存,而在於I/O操做,好比數據庫查詢帶來的磁盤I/O開銷,那麼opcode cache的性能提高是很是有限的。可是既然opcode cache能帶來CPU和內存開銷的下降,這總歸是好事。現代操做碼緩存器(Optimizer+,APC2.0+,其餘)使用共享內存進行存儲,而且能夠直接從中執行文件,而不用在執行前「反序列化」代碼。這將帶來顯着的性能加速,一般特別是高流量和高併發量時下降了總體服務器的內存消耗,並且不多有缺點。
爲何要使用Opcode緩存?數據庫
這得從PHP代碼的生命週期提及,請求PHP腳本時,會通過五個步驟,以下圖所示:
Zend引擎必須從文件系統讀取文件、掃描其詞典和表達式、解析文件、建立要執行的計算機代碼(稱爲Opcode),最後執行Opcode。每一次請求PHP腳本都會執行一遍以上步驟,若是PHP源代碼沒有變化,那麼Opcode也不會變化,顯然沒有必要每次都重行生成Opcode,結合在Web中無所不在的緩存機制,咱們能夠把Opcode緩存下來,之後直接訪問緩存的Opcode豈不是更快,啓用Opcode緩存以後的流程圖以下所示:
所以使用了Operate Code緩存以後,PHP代碼會直接獲取opcode後直接執行,中間的三個步驟會省略掉所以會大幅提升PHP代碼執行效率
安裝緩存
當你的PHP版本低於7.0時,你能夠去http://pecl.php.net/package/ZendOpcache 根據本身的PHP版 本下載相應的opcache版本。好比PHP5.5:http://pecl.php.net/get/zendopcache-7.0.5.tgz tar -zxvf zendopcache-7.0.5.tgz cd zendopcache-7.0.5 phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make install 這是會在php的擴展文件夾內生成opcache.so PHP7.0以後自帶opcache.so無需安裝
使用服務器
在php.ini加入zend_extension=opcache.so; 注意:這裏是zend_extension不是extension,關於zend_extension和extension的區別能夠去查閱 相關資料
配置併發
關於opcache的詳細參數配置小編沒怎麼研究,針對比較核心的參數以下: opcache擴展位置 zend_extension=opcache.so 啓用opcache opcache.enable=1 使用共享內存大小 opcache.memory_consumption=200 字符串緩存大小 opcache.interned_strings_buffer=8 最大緩存文件數量 opcache.max_accelerated_files=8000 出現異常,當即釋放所有內存 opcache.fast_shutdown=1 最大容許佔用內存百分比,超過此限制會重啓進程 opcache.max_wasted_percentage=20 若是置爲1,則將當前路徑加入到文件key中,以免可能產生的同文件名的文件key衝突 opcache.use_cwd=1 文件檢測週期 revalidate_freq=3600 啓用文件緩存時間戳 opcache.validate_timestamps=1