2013年1月11日星期五

Squid 开启大内存导致进程内存溢出解决方法

Squid 内存溢出导致的 FATAL: xcalloc: Unable to allocate 1 blocks of 4112 bytes! 报错让我纠结了有几天,看官方FAQ 说此问题可能是由于内存不足或者是 ulimit �d 限制的原因,可是排查了一下都不是这样,后来终于在网上看到一位同学提到,此原因是因为在编译的时候开启了-enable-dlmalloc 参数,况且 squid 又开启了大内存(这里的这个大内存可以理解为 cache­_mem 设置的比较大,也可以理解为因为磁盘缓存文件数量多,导致的 index table 占用内存过大,因为我发现就算 cache­_mem 设置为 128m时,当 squid 进程占用的内存达到 1g 左右的时候也会出现类似的问题);而dlmallocsquid在某些系统本身malloc太烂的情况的代替方案,dlmalloc已经很老,且不支持2G以上内存。

 

看到网上都在建议使用 tcmalloc 做内存的优化管理,我也尝试了,但是还没有去对比,系统自带的 malloc 函数和 tcmalloc 的性能有多大的差异。

 

下面贴一下编译安装 tcmalloc 的过程

 

 

64位操作系统请先安装libunwind库,32位操作系统不要安装。libunwind库为基于64CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API

安装google-perftools,使用TCMalloc,与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高服务器在高并发情况下的性能,降低系统负载。由于google-perftools需要libunwind,到http://nongnu.askapache.com/libunwind/下载最新版本的libunwind,文件名为libunwind-0.99.tar.gz。到http://google-perftools.googlecode.com下载最新版本的google-perftools,文件名为google-perftools-1.5.tar.gz。进行安装:

 

安装libunwind-0.99.tar.gz

 

#tar -xzvf libunwind-0.99.tar.gz

 

#cd libunwind-0.99

 

#CFLAGS=-fPIC ./configure

 

#make CFLAGS=-fPIC

 

#make CFLAGS=-fPIC install

 

安装google-perftools-1.5.tar.gz

 

#tar -xzvf google-perftools-1.5.tar.gz

 

#cd google-perftools-1.5

 

#./configure

 

#make

 

#make install

 

运行如下命令:

 

#echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

 

#ldconfig

 

下载squid,运行如下命令:

 

#http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9.tar.gz

 

进行安装:

#tar -xzvf squid-2.7.STABLE9.tar.gz

 

#cd squid-2.7.STABLE9

 

#./configure --prefix=/usr/local/squid --sysconfdir=/etc/squid --enable-removal-policies=heap,lru --enable-linux-netfilter --enable-storeio=ufs,aufs --enable-kill-parent-hack --enable-epoll --disable-poll --disable-ident-lookups --disable-carp --enable-delay-pools --disable-wccp --disable-wccpv2 --enable-snmp --enable-cachemgr-hostname=squid --enable-cache-digests --with-pthreads --enable-gnuregex --with-aio

 

#cd src

 

#vi Makefile

 

找到如下地方:

 

squid_LDADD = \

-L../lib \

 

在下面增加一行,变成如下:

 

squid_LDADD = \

-L../lib \

-ltcmalloc \

 

找到如下地方:

 

LDADD = -L../lib -lmiscutil -lrt -lpthread -lm

 

修改为:LDADD = -L../lib -lmiscutil -lrt -lpthread -lm -ltcmalloc

 

#cd ..

 

#make

 

#make install

 

squid安装完毕进行配置。在进行配置的时候,对cache分区采用reiserfs格式进行格式化,在挂载的时候使用noatimenodiratime选项。

没有评论:

发表评论