現象級的glibc2.0版本下內存佔用高問題

一、環境背景

現象級的glibc2.0版本下內存佔用高問題

  • 業務生成memcached操作日誌文件1,文件2 ...... 文件N(每天約5000萬文件)。
  • Thread 0讀取操作日誌文件,malloc內存,插入內存隊列緩存。
  • Thread 1,Thread 2,Thread 3,Thread 4從內存隊列讀取內容進行操作。

二、現象過程

  • 經過幾個月運行,集群中有機器內存耗盡,只能重啟。
  • 查看集群其他機器,部分進程內存佔用100多G。
  • 測試環境定位過程在發現,進程重啟時候,內存快速上升達到20G,再也不釋放。
  • 使用memcheck,valgrind檢查沒有任何內存洩漏。
  • 內部內存申請釋放均正常。

三、問題解決

  • 減少thread的數量開始測試,在測試的時候偶然發現一個很奇怪的現象。那就是如果進程創建了一個線程並且在該線程內分配1k內存,整個進程虛擬內存立馬增加64M,然後再分配,內存就不增加了,主要原因是多線程內存分配,每個線程都保留自己的線程池,這樣就無需進行鎖等待。參考(http://goog-perftools.sourceforge.net/doc/tcmalloc.html)。
  • 在瞬間業務量很大情況下,Thread 0處理文件並沒有進行內存申請最大控制,導致申請內存過大(Thread 1,Thread 2,Thread 3,Thread 4處理相對較慢),這些內存被線程的內存池緩存(也沒有類似tcmalloc的回收機制),所以導致內存一直佔用,最後內存耗盡。
  • 解決辦法,Thread 0內存內存時候,控制最大緩存塊即可。


分享到:


相關文章: