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