http-client 異步客戶端,運行一段時間后、 報錯內(nèi)存溢出
這里寫具體的系統(tǒng)環(huán)境相關(guān)信息
webman 版本
php 版本
http-client 版本
curl 擴展版本
看報錯應該是返回的數(shù)據(jù)太大了,有很多并發(fā)請求的話,會占用很大內(nèi)存。
還有不要重復創(chuàng)建Client實例,把asyncHttpClient保存到類的靜態(tài)屬性,然后復用它。
new Client時設(shè)置下max_conn_per_addr,默認128改成例如32減少并發(fā)。
參考手冊 http://wtbis.cn/doc/workerman/components/workerman-http-client.html#Optinons%20%E9%80%89%E9%A1%B9
發(fā)現(xiàn)有大量的 Connection closed;
這個是撥號失敗的時候觸發(fā), 還是由于閑置鏈接久了。 三方服務端關(guān)閉了, 但是php這邊保持的連接池沒關(guān)閉導致呢
http-client里連接閑置15秒默認就自動關(guān)閉了,基本不會出現(xiàn)連接閑置久了的問題。
Connection closed 感覺是帶寬或網(wǎng)路出現(xiàn)瓶頸,接受數(shù)據(jù)大量丟包導致連接斷開。
兩小時總共請求 2,742,229次,每秒380個請求。
根據(jù)你之前的報錯看一個請求有1MB+,假設(shè)每個請求響應大小為500KB,粗略估算大概占用帶寬1.4Gb/S,你們看下服務器是否支持這么大的帶寬。
我感覺還是 撥號失敗的問題, 測試環(huán)境是在國內(nèi), 訪問這個facebook 接口,全是 connectd closed; 我在國內(nèi)測試服上用 wget 測試 , 的確是 訪問不了 。
好的, 感謝大佬。 我抓包看下;
針對最開始的 oom問題。 我理解是
由于用了異步請求。 當前請求 調(diào)用facebook 還未處理完成, 當前php進程就會處理別的客戶端鏈接,
假設(shè)facebook 訪問需要10s,
也就是說 在這10s內(nèi)。 當前php進程占用內(nèi)存 等于 每個請求(比如1M) * 并發(fā)數(shù) 、(因為調(diào)用facebook還被掛起,也就是函數(shù)生命周期還沒完, 不會銷毀函數(shù)調(diào)用棧 臨時變量等占用的內(nèi)存)
所以會導致當前php進程oom, 是這樣吧