国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

PHP疑似內(nèi)存泄漏問題

z54123321

現(xiàn)在線上是用的Gateway,分布式架構(gòu),Register,Connect,Worker都分開容器部署,現(xiàn)在有個很奇怪的現(xiàn)象,關(guān)于worker進程的容器主機內(nèi)存會一直持續(xù)增長,連續(xù)跑3天 內(nèi)存使用多占了2個G,但是系統(tǒng)監(jiān)控和atop查看到 整個php的worker進程一直都是在 300-400M左右,總之都不會超過1G,但是我一旦重啟worker進程之后立馬可用內(nèi)存多出來2個G。。。。。,完全找不到頭緒,進程內(nèi)存占用比較少,沒有看到明顯增長,但是一旦重啟進程缺能釋放很多內(nèi)存空間出來

求大佬分析一下可能的原因

3872 2 0
2個回答

phpcreeper

walkor大大關(guān)于內(nèi)存泄漏的可能原因?qū)懙暮茉敿?xì),據(jù)此自查:
https://wenda.workerman.net/question/3307

  • z54123321 2020-03-20

    是這樣的,我進程里面確實有一些靜態(tài)數(shù)組數(shù)據(jù),但是監(jiān)控顯示所有的PHP進程累計到400多M的的時候不再增加了,也趨于相對穩(wěn)定,但是宿主機內(nèi)存一直在緩慢增加,當(dāng)我重啟或者關(guān)閉PHP進程容器的時候,立馬會騰出2個G,我所有PHP進程加起來也沒2個G內(nèi)存占用啊

  • marsColin 2020-03-20

    看一下你的業(yè)務(wù)代碼,這么多內(nèi)存肯定是業(yè)務(wù)代碼有問題

  • phpcreeper 2020-03-20

    @3938:
    1、既然有靜態(tài)數(shù)組,那么要注意必要條件下的及時釋放,否則就會有內(nèi)存泄漏,所以你這情況十有八九就是這個造成的,具體還得你自己排查確認(rèn);
    2、PHP進程累計到400多M不再增加? 這個400是看的top的哪個指標(biāo)? 另外什么又是宿主機內(nèi)存?
    3、至于重啟進程,那肯定會騰出空間,因為舊的進程已經(jīng)退出了,進程所占用的內(nèi)存會得到釋放,這個不難理解。

  • z54123321 2020-03-23

    atop所有php進程累計的RSIZE,我上面說 400M -> 2G 這個關(guān)鍵點是忽略了嗎?為什么所有PHP進程總共統(tǒng)計400M ,釋放后會騰出2G?靜態(tài)數(shù)組是固定的SET,沒有累加操作,而且只有那么幾個點,啟動時 每個BK進程12M,最后會到20M,容器或虛擬機部署的主機就叫宿主機啊

  • phpcreeper 2020-03-23

    我疏忽了你提及的容器二字;根據(jù)php進程報告截圖來看,只能看到負(fù)載略高,那應(yīng)該是Rabbit那幾個進程wait造成的阻塞引起的,busy也能說明這一點,不過看不出來是否這組進程里有使用定時器,這個上面鏈接里也有詳細(xì)的注意事項說明;然后沒用過atop; 另外對于top或htop監(jiān)控參數(shù)而言,如果特定容器內(nèi)所有PHP進程對應(yīng)的RES字段(應(yīng)該類似于atop的rsize吧)如果在足夠長的周期內(nèi)一直維持在300~400M左右,那理論上說明不存在內(nèi)存泄漏的問題;至于2G宿主機內(nèi)存的釋放是不是重啟worker進程容器后就判定一定是worker進程在吃內(nèi)存,這個難說需要你自己多個時間點檢測排查環(huán)境,畢竟中間有層容器,容器本身以及容器內(nèi)的其他服務(wù)進程對資源的消耗情況也不可忽略;建議你嘗試限制下worker進程所在的docker容器內(nèi)存上限,然后這樣便于集中觀測是不是worker進程在吃內(nèi)存,當(dāng)然了業(yè)務(wù)代碼層面還是需要再查查的,綜合排查吧。

z54123321


貼一張status,BK進程是核心的業(yè)務(wù)進程,里面就有我所說的靜態(tài)數(shù)組作為數(shù)據(jù)緩存點,這些數(shù)組都是直接set不存在一直累加

剩下的rabbit那個是消息隊列處理一些異步任務(wù),內(nèi)部沒有靜態(tài)變量,阻塞的原因rabbit需要wait判斷新的消息

這樣的容器還有好幾個,整體400M是包括了其他的這樣的worker業(yè)務(wù)容器還有connect容器

現(xiàn)在的問題是自己主機上查看或者云監(jiān)控上看著,這些容器內(nèi)存占用都比較穩(wěn)定,統(tǒng)計的結(jié)果加起來都不會超過500M(關(guān)注一下這里)

但是運行幾天后整個主機的內(nèi)存一直在慢慢消耗,沒有釋放

一旦我去重啟這些worker進程的容器或者說直接采用reload的方式去控制重啟進程,都會釋放出大量的內(nèi)存(2G+)
400M->2G
這些內(nèi)存究竟是從哪來的?

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??