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