測試平臺:
os:CentOS release 5.2 x86_64 GNU/Linux
kernel:2.6.30
gcc-version:gcc version 4.1.2 20071124 Target: x86_64-redhat-linux
squid-version:squid-2.6.STABLE21
1,安裝tcmalloc所需的libunwind庫[32位系統(tǒng)無須安裝]
wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
tar zxvf libunwind-0.99-alpha.tar.gz
cd libunwind-0.99-alpha/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
2,安裝tcmalloc
wget http://google-perftools.googlecode.com/files/google-perftools-0.97.tar.gz
tar zxvf google-perftools-0.97.tar.gz
cd google-perftools-0.97/
./configure
make && make install
默認安裝時,libunwind與tcmalloc庫均安裝至/usr/local/lib
3,配置動態(tài)連接庫
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig
4,squid使用tcmalloc的方法:
4.1 重新編譯squid
4.1.1 configure
4.1.2 修改源碼路徑中的 vi src/Makefile 找到其中squid_LDADD = 在其-L../lib后添加 -ltcmalloc 保存退出
4.1.3 make
4.1.4 make install
4.1.5 啟動squid
4.1.6 編譯squid出現(xiàn)異常請參見常見問題
4.2 PRELOAD動態(tài)加載
[如果不想重新編譯現(xiàn)有的squid,可以使用此種方法,但是google官方并不推薦這樣讓squid調(diào)用tcmalloc]
4.2.1 找到squid啟動的腳本,一般也就是 RunAccel或 RunCache,再其首行位置添加
export LD_PRELOAD=/usr/local/lib/libtcmalloc.so[也就是上述默認安裝的路徑]
當然這個啟動腳本也可以自行編寫
4.2.2 啟動squid
4.2.3 動態(tài)加載出現(xiàn)異常請參見常見問題
5,命令查看tcmalloc是否起效:
如果上述步驟4沒有異常,那么可以通過如下方式檢查squid是否加載了tcmalloc
/usr/sbin/lsof -n | grep tcmalloc
如果發(fā)現(xiàn)以下信息,說明tcmalloc已經(jīng)起效:
[root@squid22 bin]# lsof -n |grep tcmalloc
squid 18663 root mem REG 8,2 1891502 164954 /opt/squid/libexec/libtcmalloc.so
squid 18665 squid mem REG 8,2 1891502 164954 /opt/squid/libexec/libtcmalloc.so
常見問題
編譯squid支持tcmalloc時出現(xiàn)編譯失?。?/span>
第一次:編譯選項如下:
Squid Cache: Version 2.6.STABLE21
configure options: '--prefix=/usr/local/squid' '--enable-dlmalloc' '--enable-useragent-log' '--enable-referer-log' '--enable-default-err-language=English' '--enable-err-languages=Simplify_Chinese English' '--enable-x-accelerator-vary' '--enable-epoll' '--enable-storeio=diskd,ufs,aufs,null,coss' '--enable-coss-aio-ops' '--enable-removal-policies=lru heap'
編譯成功,加載成功
squid 15385 root mem REG 104,2 1364576 527282 /usr/local/lib/libtcmalloc.so.0.0.0
squid 15388 nobody mem REG 104,2 1364576 527282 /usr/local/lib/libtcmalloc.so.0.0.0
第二次: 編譯選項如下:
Squid Cache: Version 2.6.STABLE21
configure options: '--prefix=/usr/local/squid' '--enable-dlmalloc' '--enable-useragent-log' '--enable-referer-log' '--enable-default-err-language=English' '--enable-err-languages=Simplify_Chinese English' '--enable-x-accelerator-vary' '--enable-epoll' '--enable-storeio=diskd,ufs,aufs,null,coss' '--enable-coss-aio-ops' '--enable-removal-policies=lru heap' '--enable-large-cache-files' '--with-aufs-threads=16' '--with-pthreads' '--with-aio' '--with-maxfd=32768' '--with-large-files'
出現(xiàn)編譯失敗。找到病因,因為增加了'--with-large-files'選項,因此編譯時出現(xiàn)
#############################################################################################################################################################
gcc -m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O3 -pipe -msse2 -mfpmath=sse,387 -mmmx -fomit-frame-pointer -D_REENTRANT -o squid access_log.o acl.o asn.o authenticate.o cache_cf.o CacheDigest.o cache_manager.o carp.o cbdata.o client_db.o client_side.o comm.o comm_epoll.o debug.o disk.o dns_internal.o errorpage.o event.o errormap.o external_acl.o fd.o filemap.o forward.o fqdncache.o ftp.o gopher.o helper.o http.o HttpStatusLine.o HttpHdrCc.o HttpHdrRange.o HttpHdrContRange.o HttpHeader.o HttpHeaderTools.o HttpBody.o HttpMsg.o HttpReply.o HttpRequest.o icmp.o icp_v2.o icp_v3.o ident.o internal.o ipc.o ipcache.o locrewrite.o logfile.o main.o mem.o MemPool.o MemBuf.o mime.o multicast.o neighbors.o net_db.o Packer.o pconn.o peer_digest.o peer_monitor.o peer_select.o peer_sourcehash.o peer_userhash.o redirect.o referer.o refresh.o send-announce.o snmp_core.o snmp_agent.o ssl.o stat.o StatHist.o String.o stmem.o store.o store_io.o store_client.o store_digest.o store_dir.o store_key_md5.o store_log.o store_rebuild.o store_swapin.o store_swapmete.o store_swapout.o tools.o unlinkd.o url.o urn.o useragent.o wais.o wccp.o wccp2.o whois.o repl_modules.o auth_modules.o store_modules.o globals.o string_arrays.o -L../lib -ltcmalloc repl/liblru.a repl/libheap.a fs/libdiskd.a fs/libufs.a fs/libaufs.a fs/libnull.a fs/libcoss.a auth/libbasic.a -lcrypt ../snmplib/libsnmp.a -L../lib -ldlmalloc -lmiscutil -lrt -lpthread -lm -lbsd -lnsl
/usr/bin/ld: skipping incompatible /usr/lib64/libtcmalloc.so when searching for -ltcmalloc
/usr/bin/ld: skipping incompatible /usr/lib64/libtcmalloc.a when searching for -ltcmalloc
/usr/bin/ld: skipping incompatible /usr/local/lib/libtcmalloc.so when searching for -ltcmalloc
/usr/bin/ld: skipping incompatible /usr/local/lib/libtcmalloc.a when searching for -ltcmalloc
/usr/bin/ld: cannot find -ltcmalloc
collect2: ld returned 1 exit status
#############################################################################################################################################################
第三次:去掉了with-large-files,增加常用的squid編譯選項如下:
Squid Cache: Version 2.6.STABLE21
configure options: '--prefix=/usr/local/squid' '--enable-dlmalloc' '--enable-useragent-log' '--enable-referer-log' '--enable-default-err-language=English' '--enable-err-languages=Simplify_Chinese English' '--enable-x-accelerator-vary' '--enable-epoll' '--enable-storeio=diskd,ufs,aufs,null,coss' '--enable-coss-aio-ops' '--enable-removal-policies=lru heap' '--enable-large-cache-files' '--with-aufs-threads=16' '--with-pthreads' '--with-aio' '--with-maxfd=32768' '--disable-wccp' '--disable-wccpv2' '--enable-snmp' '--disable-poll' '--enable-http-violations' 'CFLAGS=-O3 -pipe -msse2 -mfpmath=sse,387 -mmmx -fomit-frame-pointer'
編譯成功,加載成功
squid 18254 root mem REG 104,2 1364576 527282 /usr/local/lib/libtcmalloc.so.0.0.0
squid 18257 nobody mem REG 104,2 1364576 527282 /usr/local/lib/libtcmalloc.so.0.0.0
注意一點: 對于已經(jīng)使用with-large-files編譯成功的squid,也是不能通過LD_PRELOAD的方式加載tcmalloc的
這點也需要著重指出
以上總結(jié)及討論的常見問題均是在Deion: CentOS release 5.2 (Final) 內(nèi)核版本為Linux 39 2.6.30 #1 SMP Tue Jun 16 22:29:42 CST 2009 x86_64 x86_64 x86_64 GNU/Linux的64位主機上測試的。對于32位主機,是不存在上述問題的。32位主機上squid不論是不是編譯時啟用了--with-large-files,不論是編譯還是動態(tài)加載都可以使用tcmalloc。32測試主機的內(nèi)核為:2.6.18-92.el5xen GCC版本為:4.1.2 20071124 Target: i386-redhat-linux