php-fpm內存泄漏問題排查


生產環境內存泄漏問題排查,以下是排查思路
 
生產環境上有嚴重的內存溢出問題(紅色框所示,正常值應為是 20M 左右)
同時系統有 Core Dump 文件產生
排查過程中還發現一個現象,如果關閉 OPcache ,則 RES值 恢復正常
 

生產環境的 core-php-fpm-7-502-502-29964-1563021407 文件,

從文件名中可知 php-fpm 進程有異常產生,

core文件是二進制格式,需要專門的工具進行分析。

yum -y install gdb 安裝分析工具
 

 用工具分析后,得知粗略的報錯信息。

Google 搜索了一下,基本上都是這個意思。
那么問題來,生產環境上,app_debug 是關閉的,模板是使用靜態緩存的,opcache 也是啟用的,為什么還會有這種情況呢?
初步懷疑,有可能是緩存文件失效了,先在測試環境驗證下
 
查一下 【Server模塊】的Runtime目錄
 發現Runtime目錄下只有一個文件,訪問不同頁面的時候,這個文件會不斷變化。
(也就是說,此模塊下緩存文件實際上是無效的)
 
 再查一下 【Marketing模塊】的Runtime目錄(說明緩存文件有效)
 
結合以上兩圖,說明了三件事:
1、緩存文件有生成
2、緩存文件不斷被刪除,又不斷重新生成
3、一個模塊正常,一個模塊異常,說明問題應該在 BaseController.class.php 文件中
 

 比對兩個模塊的 BaseController.class.php 基類文件,發現多出了白色箭頭處的代碼

 
這段代碼,“看起來挺正常”,
斷點調試 dump( C('not_first') ) ,
發現每一次執行,得到的結果都是 null
難道是生產環境的配置文件沒加載?
 
驗證我的猜想 。
 
綜合以上排查結果得知,生產環境內存泄漏主要由以下問題導致的:
1、用戶每次訪問頁面,都會導致整個Runtime目錄被清空
2、緩存不斷的被創建,又不斷的被刪除
3、Opcache緩存了PHP解析文件,但該文件很快就失效了,下一次讀取緩存的解析文件時,文件不存在,
導致了 【Program terminated with signal 7, Bus error. in lex_scan】 文件的產生,系統同時生成大量的 core文件
 
解決方法,就這么簡單
 
效果還是很好的,回復到正常值了
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM