|
|
昨晚遇到神奇問(wèn)題,網(wǎng)關(guān)做壓力測(cè)試,在CPU很高的時(shí)候會(huì)崩潰,看堆棧,都是崩潰在_heap_alloc這個(gè)函數(shù)里面,百思不得其解,以為是內(nèi)存碎片導(dǎo)致的,寫了一段檢測(cè)代碼,可的捕獲到內(nèi)存碎片嚴(yán)重,new 幾個(gè)字節(jié)都會(huì)失敗,特別是在cpu高的時(shí)候,以為是我大量使用std::string 和map之類容器問(wèn)題,以為找到了原因,然后就是各種折騰,折騰了一晚上沒(méi)解決。今天早上睡了個(gè)飽覺(jué),過(guò)來(lái)再想出了一下,感覺(jué)不應(yīng)該是內(nèi)存碎片的問(wèn)題。如果是內(nèi)存碎片,不應(yīng)該在堆分配時(shí)拋訪問(wèn)越界異常,然后使用分解方法,把一個(gè)個(gè)模塊拆下來(lái)單獨(dú)測(cè),搞了一上午,終于找到原因了,原來(lái)在寫日志模塊里面,有一個(gè)多線程寫環(huán)型隊(duì)列加鎖有問(wèn)題,沒(méi)鎖成。就這樣導(dǎo)致了多線程同時(shí)操作queue,導(dǎo)致堆被破壞,在_heap_alloc時(shí),可有是內(nèi)部進(jìn)行了資源回收整理,然后就崩潰了。改了二行代碼,把bug修復(fù)了,中午吃飯時(shí)就讓壓力在跑,跑了幾百萬(wàn),啥事都沒(méi)了。
后來(lái)總結(jié)了一下,這種神奇問(wèn)題基本都是自已的事情,想在操作系統(tǒng)上找理由是不行的。
|
|