php常駐程式記憶體洩露的簡單解決

erlanp發表於2020-10-20

php原本設計是用了一次就丟了的,這樣用基本沒有記憶體洩露的問題,就是每次要重新構建速度會慢。

php常駐的情況記憶體洩露發生的概率就很高了

php主流常駐框架是解決方案也是用了就丟,但不是立刻就丟:
1·roadrunner
.rr.json的配置檔案

{
  "http": {
    "address": "127.0.2.1:80",
    "workers": {
      "command": "php psr-worker.php",
      "pool": {
        "numWorkers": 4,
        "maxJobs":  4800
      }
    }
  }
}

maxJobs 4800表示接受4800個請求後,重新啟新的服務代替舊的服務,舊的服務佔用的記憶體放掉就沒有問題了。

經過效能測試,相比沒有重啟設定,效能只損失了十分之一,完全可以接受。

2·workerman 手冊裡有講
max_request屬性,主要用於解決php業務程式碼bug引起的記憶體洩露問題

3·swoole 手冊裡也有講 max_request
https://wiki.swoole.com/wiki/diff/?id=300&version=1&compare=current

處理訊息佇列的消費者也是常駐的,php命令列程式的解決方案也是重啟。
命令列程式會一直迴圈處理佇列的資訊,我們可以讓程式執行一分鐘後結束,然後用定時任務每分鐘重啟它,用Linux-crontab或者gocron都可以,就是和佇列的長連線總是要重聯。
 

java的話據說幾個月才會一次,據阿里巴巴開發手冊記載:
【推薦】給 JVM 環境引數設定-XX:+HeapDumpOnOutOfMemoryError 引數,讓 JVM 碰到 OOM
場景時輸出 dump 資訊。
說明:OOM 的發生是有概率的,甚至相隔數月才出現一例,出錯時的堆內資訊對解決問題非常有幫助。
我覺得java也可以用一個月左右主動重啟一次的方法來解決記憶體洩露的問題


python的記憶體洩漏問題
如果對python的一些特性不熟,就容易寫出有記憶體洩漏的程式碼比如

def a(hey = [], b = 1);
    hey.append(b)
    return hey

a()
a(b=2)

 

python沒有static靜態變數, 但hey因為是陣列, 就可以理解成靜態變數
一直如上面呼叫的話,陣列會巨大無比,直到程式崩了。

如果python能顯式的宣告static變數的話,就會相對容易的發現這樣的程式碼bug。

相關文章