來(lái)源:捕風(fēng) 發(fā)布時(shí)間:2018-12-08 14:56:57 閱讀量:1046
分析這個(gè)問(wèn)題的過(guò)程還是挺曲折,如果不想看繁瑣的分析過(guò)程,請(qǐng)直接跳到結(jié)論
我們小組的成員請(qǐng)耐心看一下過(guò)程,積累一下經(jīng)驗(yàn),到用戶(hù)現(xiàn)場(chǎng)是能學(xué)習(xí)很多東西的,以后你們要爭(zhēng)取到用戶(hù)現(xiàn)場(chǎng),呵呵
---------------------------------------------------------------------------------------------------------------------------------------------------------
周一下午到移動(dòng)時(shí)發(fā)現(xiàn)服務(wù)器的情況是這樣的
1.ESServer內(nèi)存達(dá)到差不多200M,且以緩慢的速度不斷上升,ESServer進(jìn)程一直占用CPU約6%-10%
2.服務(wù)器生成了一堆大小為0KB的DUMP
3.有大量因沒(méi)有管理網(wǎng)段的客戶(hù)端不斷地每隔一分鐘取策略
4.日志只有很少
---------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------
在現(xiàn)場(chǎng)解決了兩個(gè)問(wèn)題
1.配置管理網(wǎng)段,讓客戶(hù)端不再取策略,并且重啟ESServer,CPU占用率降了不少,平均1%-2%(且不是一直占用),內(nèi)存沒(méi)有發(fā)現(xiàn)上升(不排除是以更慢的速度上升,要等后面觀(guān)察)
2.日志太少的原因是因?yàn)镮NI配置的日志文件只有10M,且只有一個(gè)備份,后將參數(shù)改為了1G(有一個(gè)奇怪的現(xiàn)象是,服務(wù)器的日志已經(jīng)成功寫(xiě)入文件,但文件的修改時(shí)間一直不變)
---------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------
在重啟ESServer服務(wù)器時(shí),很“有幸”地遇到一個(gè)崩毀,生成了55M的dump,趕緊拿回來(lái)分析
1.經(jīng)過(guò)一番分析,發(fā)現(xiàn)崩毀是某個(gè)鎖在已經(jīng)被刪除的情況下還繼續(xù)使用導(dǎo)致
2.分析了代碼,這個(gè)鎖在服務(wù)器停止前都不會(huì)被刪除的,而這次崩毀剛好又是在我停止服務(wù)器時(shí)發(fā)生的
3.寫(xiě)個(gè)模擬這種情況的測(cè)試程序,肯定也能這樣崩毀,但畢竟這個(gè)程序不是服務(wù)器,只能作出推斷,是多線(xiàn)程造成的問(wèn)題,當(dāng)停止服務(wù)器時(shí),對(duì)象已經(jīng)銷(xiāo)毀,但還有線(xiàn)程剛好在用這個(gè)鎖,這是一個(gè)很偶然的情況(T_T)
到這里,發(fā)現(xiàn)這個(gè)崩毀竟和之前的周期性崩毀沒(méi)多大關(guān)系……(我崩毀了……),因?yàn)椋?/p>
1.上面的崩毀是在一個(gè)很偶然的情況下發(fā)生的,很難周期性發(fā)生
2.上面的崩毀生成了55M的dump,周期性崩毀只生成了0KB的dump
---------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------
問(wèn)題還是沒(méi)有找到,但既然懷疑這部分代碼有多線(xiàn)程問(wèn)題,就從這里出發(fā)查找:
1.發(fā)現(xiàn)代碼里面這部分用得最多的就是日志模塊,聯(lián)系到那天國(guó)富跟我說(shuō)他將日志參數(shù)從info改為debug時(shí)可能可以加快問(wèn)題的發(fā)生,我就在服務(wù)器專(zhuān)門(mén)開(kāi)兩條線(xiàn)程不斷地寫(xiě)日志,發(fā)現(xiàn)下面了問(wèn)題
2.大量的日志寫(xiě)入,導(dǎo)致待寫(xiě)入日志的隊(duì)列內(nèi)存不斷升高(因?yàn)閷?xiě)入文件的速度和寫(xiě)入內(nèi)存的速度不是一個(gè)等級(jí)導(dǎo)致的),導(dǎo)致最后因空間不夠,list在pushback的時(shí)候發(fā)生崩毀(為何stl會(huì)實(shí)現(xiàn)成這樣還得深究)
3.以服務(wù)啟動(dòng)時(shí),在崩毀的時(shí)候竟然生成了一個(gè)0KB的dump,“大喜”,因?yàn)檫@和移動(dòng)的現(xiàn)象很類(lèi)似(內(nèi)存高,0KB的dump)
---------------------------------------------------------------------------------------------------------------------------------------------------------
其實(shí)以前天珣的代碼編寫(xiě)者估計(jì)也想到這個(gè)問(wèn)題,他限制了隊(duì)列的最大長(zhǎng)度是1024,但為什么還會(huì)出現(xiàn)這個(gè)問(wèn)題呢,原來(lái)又是多線(xiàn)程和判斷不嚴(yán)謹(jǐn)?shù)膯?wèn)題,且看下面分析
1.在進(jìn)入隊(duì)列前,會(huì)先鎖定然后判斷隊(duì)列是否已經(jīng)滿(mǎn)了,但這個(gè)鎖在IsFull()后就解鎖了,就存在如果同時(shí)有多線(xiàn)程PUT的時(shí)候,大家都做完IsFull()這個(gè)函數(shù)后再做doPut(),而判斷隊(duì)列是否滿(mǎn)又竟然只用了“==”,就造成了隊(duì)列大于1024,隊(duì)列還會(huì)繼續(xù)增加的情況。
2.最簡(jiǎn)單的修改方法就是將“==”改為“<=”,雖然沒(méi)有改變多線(xiàn)程問(wèn)題的本質(zhì),但足以很好地修復(fù)這問(wèn)題
---------------------------------------------------------------------------------------------------------------------------------------------------------
結(jié)論:
1.這個(gè)問(wèn)題估計(jì)是一直都存著的,只是需要條件觸犯。在移動(dòng),大量客戶(hù)端重復(fù)取策略,日志文件增長(zhǎng)得很快(開(kāi)了DEBUG更快),內(nèi)存CPU很高,且和我這里重現(xiàn)的現(xiàn)象很類(lèi)似,所以現(xiàn)階段只能推斷是這個(gè)原因造成的。但不明白的是,建行也出現(xiàn)過(guò)大量客戶(hù)端重復(fù)取策略,卻沒(méi)有這種崩毀。
2.現(xiàn)在配了管理網(wǎng)段,客戶(hù)端不再重復(fù)取策略,日志改為info,增加比較慢,問(wèn)題應(yīng)該會(huì)有所緩和,國(guó)富可先不跟移動(dòng)說(shuō),再觀(guān)察那邊服務(wù)器情況一段時(shí)間。要修復(fù)的話(huà)只需按上面說(shuō)的修復(fù)即可。
看來(lái)多線(xiàn)程的確是一個(gè)博大精深的問(wèn)題,我由此擔(dān)憂(yōu)6694客戶(hù)端這么多線(xiàn)程會(huì)不會(huì)埋著什么雷呢?
一切只是推斷,需要時(shí)間驗(yàn)證,以上權(quán)當(dāng)學(xué)習(xí)總結(jié)
---------------------
在線(xiàn)
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線(xiàn)溝通:
客服
熱線(xiàn)
7*24小時(shí)客服服務(wù)熱線(xiàn)
關(guān)注
微信
關(guān)注官方微信