鍍金池/ 問(wèn)答/Linux/ php守護(hù)進(jìn)程占用內(nèi)存很高,如何排查問(wèn)題出在哪?

php守護(hù)進(jìn)程占用內(nèi)存很高,如何排查問(wèn)題出在哪?

問(wèn)題描述

用PHP程序?qū)懥艘粋€(gè)守護(hù)進(jìn)程,占用內(nèi)存特別高(%MEM:80%),且不釋放。

我只能定位到這個(gè)進(jìn)程的PID,但是我無(wú)法定位到是程序的哪塊代碼引起的,如何才能查到問(wèn)題出在哪呢?

前提條件不變:
- 即用PHP程序運(yùn)行的守護(hù)進(jìn)程。
- 我已在程序中手動(dòng)釋放了內(nèi)存。
回答
編輯回答
好難瘦

代碼塊不多的話,多用 memory_get_usage 打印當(dāng)前內(nèi)存占用。
php守護(hù)進(jìn)程一般都會(huì)出現(xiàn)泄漏問(wèn)題,很多情況下是擴(kuò)展導(dǎo)致的。
所以生產(chǎn)環(huán)境建議每執(zhí)行一條任務(wù),計(jì)數(shù)器+1,當(dāng)超過(guò)一定量,比如100,退出進(jìn)程,保證業(yè)務(wù)邏輯完整執(zhí)行(自己退出就會(huì)完整執(zhí)行,被系統(tǒng)干掉就可能沒(méi)執(zhí)行完)
然后使用nodejs的pm2進(jìn)程?;?/p>

pm2配置文件例子:

{
  "name": "顯示名稱",
  "script": "cli.php",
  "exec_interpreter": "php",
  "exec_mode": "fork",
2017年8月3日 16:42
編輯回答
哚蕾咪

如果不嫌麻煩的話,可以試試我的php-stacktrace,不需擴(kuò)展,不需要重啟進(jìn)程,只要一個(gè)PID,就可以讀取PHP進(jìn)程的內(nèi)存,解析出調(diào)用堆棧信息,從而知道PHP進(jìn)程在干啥了。

間隔幾十ms調(diào)用一次,把結(jié)果保存起來(lái),就是個(gè)采樣profiler:)

看錯(cuò)題目,原來(lái)是內(nèi)存問(wèn)題,可以直接生用gdb dump內(nèi)存然后慢慢查。

2017年9月28日 07:13