S3client方法使用不當(dāng)導(dǎo)致線程大量WAIT_CLOSE

背景

后端服務(wù)中有用到OSS的對象存儲服務(wù)校仑,完成文件上傳操作梢灭,其中有這樣一個場景:

問題定位

  1. 剛開始發(fā)現(xiàn)這個問題以為是線程池不夠用其掂,通過調(diào)整線程池大小缤底,發(fā)現(xiàn)服務(wù)能支持時間長點(diǎn)嗅定,但壓測一段時間發(fā)現(xiàn)還是會卡死自娩,線程被打滿。
  2. 后端又懷疑是不是使用@Asnyc線程嵌套導(dǎo)致的渠退,去掉改成同步忙迁,問題依然存在
  3. 然后就排查代碼看是不是那塊資源未釋放(查了好幾遍沒發(fā)現(xiàn)問題,該close的資源都close了)
  4. 后面有浮現(xiàn)了幾次后發(fā)現(xiàn)碎乃,每次上傳1000文件姊扔,就會有1000個線程 CLOSE_WAIT 就很奇怪,線程死活不關(guān)閉梅誓,然后就針對OSS相關(guān)代碼做排查恰梢,一行一行把oss相關(guān)注釋后佛南,發(fā)現(xiàn)getFileSize()去掉后,再沒有線程 CLOSE_WAIT 情況嵌言,就是這家伙惹的禍嗅回。。摧茴。绵载。定位完畢(而時間已經(jīng)是凌晨2點(diǎn)多了),欲哭無淚呀苛白。OSS還有這個坑娃豹。血的教訓(xùn)。
    /**
     * 獲取文件大小
     *
     * @param fileURL   文件的url(標(biāo)準(zhǔn)oss地址)
     */
    public Long getFileSize(String fileURL) {
        // 解析bucketName
        String bucketName = getBucketName(fileURL);
        // 解析objectName
        String objectName = getObjectName(bucketName, fileURL);
        return s3client.getObject(bucketName, bucketName).getObjectMetadata().getInstanceLength();
    }

問題就處在 s3client.getObject(bucketName, bucketName).getObjectMetadata().getInstanceLength(); 這行代碼丸氛。

oss SDK獲取文件大小培愁,應(yīng)該調(diào)用getMetaData方法,代碼里調(diào)用的getObject().getMetaData缓窜,相當(dāng)于下載文件但是僅獲取http頭定续,OSS服務(wù)側(cè)任務(wù)數(shù)據(jù)傳輸已完畢然后就斷開連接了,本地獲取到了文件流但是沒有讀取禾锤,此時就會導(dǎo)致CLOSE_WAIT私股,對應(yīng)的tcp連接recv-q隊列有值,send-q隊列大小為0恩掷,表示應(yīng)用已獲取了數(shù)據(jù)但是還沒來得及獲取遠(yuǎn)程就關(guān)閉了連接倡鲸,該連接不會再進(jìn)入CLOSED狀態(tài)张抄,非CLOSED狀態(tài)的連接不會被復(fù)用闽坡,連接一直不釋放進(jìn)而引發(fā)連接池打滿的情況

解決方案

    /**
     * 獲取文件大小
     *
     * @param fileURL   文件的url(標(biāo)準(zhǔn)oss地址)
     */
    public Long getFileSize(String fileURL) {
        // 解析bucketName
        String bucketName = getBucketName(fileURL);
        // 解析objectName
        String objectName = getObjectName(bucketName, fileURL);
        return s3client.getObjectMetadata(bucketName, objectName).getInstanceLength();
    }

感悟

后面再用三方sdk的時候,特別是這種使用到線程池先關(guān)的泊窘,一定要做好壓測逼争,針對用到的每一個方法多看看源碼和底層實(shí)現(xiàn)优床,做好資源回收,做好資源回收誓焦,做好資源回收5ǔā!杂伟!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末移层,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赫粥,更是在濱河造成了極大的恐慌观话,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅是,死亡現(xiàn)場離奇詭異匪燕,居然都是意外死亡蕾羊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門帽驯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龟再,“玉大人,你說我怎么就攤上這事尼变±眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵嫌术,是天一觀的道長哀澈。 經(jīng)常有香客問我,道長度气,這世上最難降的妖魔是什么割按? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮磷籍,結(jié)果婚禮上适荣,老公的妹妹穿的比我還像新娘。我一直安慰自己院领,他們只是感情好弛矛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著比然,像睡著了一般丈氓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上强法,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天万俗,我揣著相機(jī)與錄音,去河邊找鬼饮怯。 笑死该编,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的硕淑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼嘉赎,長吁一口氣:“原來是場噩夢啊……” “哼置媳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起公条,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拇囊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后靶橱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寥袭,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡路捧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了传黄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杰扫。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膘掰,靈堂內(nèi)的尸體忽然破棺而出章姓,到底是詐尸還是另有隱情,我是刑警寧澤识埋,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布凡伊,位于F島的核電站,受9級特大地震影響窒舟,放射性物質(zhì)發(fā)生泄漏系忙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一惠豺、第九天 我趴在偏房一處隱蔽的房頂上張望银还。 院中可真熱鬧,春花似錦耕腾、人聲如沸见剩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苍苞。三九已至,卻和暖如春狼纬,著一層夾襖步出監(jiān)牢的瞬間羹呵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工疗琉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冈欢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓盈简,卻偏偏與公主長得像凑耻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柠贤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容