现象级的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内存内存时候,控制最大缓存块即可。


分享到:


相關文章: