【转】利用TCMalloc优化Nginx的性能
From: http://www.linuxidc.com/Linux/2013-04/83197.html
TCMalloc的全称是 Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Malloc相比,TCMalloc库在内存 分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低了系统的负载。下面简单介绍如何为Nginx添加TCMalloc 库支持
要安装TCMalloc库,需要安装libunwind 和 gperftools两个软件包,libunwind库为基于64为CPU何操作系统的程序提供了基本函数调用链和函数调用寄存器功能,32位操作系统部需要安装。
1.安装libunwind库
可以从LinuxIDC.com的FTP下载libunwind-1.1.tar.gz
libunwind-1.1.tar.gz下载地址:
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2013年资料/4月/21日/利用TCMalloc优化Nginx的性能
------------------------------------------------------------------------------
安装过程如下:
tar -xvf libunwind-1.1.tar.gz
cd libunwind-1.1
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
fPIC告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
2.安装gperftools 可以从 这里 下载2.0版本
tar -xvf gperftools-2.0.tar.gz
cd gperftools-2.0
./configure
make && make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
支持gperftools安装完成
(by chng: because the only thing we need to do is adding the /lib/ path into configuration, without downloading the src (since GFW you know that...), just yum/apt-get/zypper install google-perftools (and maybe libgoogle-perftools-dev) is OK. )
3.重新编译Nginx.
./configure --prefix=/usr/local/nginx \ 指定nginx的安装目录
--with-http_stub_status_module \ 启用nginx的status功能,可以监控nginx当前状态
--with-http_gzip_static_module \ 支持在线实时压缩输出数据流
--with-google_perftools_module \ 支持TCMalloc对Nginx性能的优化
make && make install
到这里Nginx安装完成。
4.为gperftools添加线程目录
创建一个线程目录,这里讲文件放在/tmp/tcmalloc下。操作如下:
mkdir /tmp/tcmalloc
chmod 0777 /tmp/tcmalloc
5.修改nginx主配置文件,在pid这行的下面添加如下代码:
#pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc;
接着重启nginx即可完成gperftools的加载。
6.验证运行状态
为了验证gperft
#pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc;
(by chng:pay attention that it is '_' instead of '-'.
see src/misc/ngx_google_perftools_module.c line 30-40:
1 static ngx_command_t ngx_google_perftools_commands[] = { 2 3 { ngx_string("google_perftools_profiles"), 4 NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, 5 ngx_conf_set_str_slot, 6 0, 7 offsetof(ngx_google_perftools_conf_t, profiles), 8 NULL }, 9 10 ngx_null_command 11 };
)
接着重启nginx即可完成gperftools的加载。
ools已经正常加载,可以通过如下命令查看:
lsof -n | grep tcmalloc
nginx 2395 nobody 9w REG 8,8 0 1599440 /tmp/tcmalloc.2395
nginx 2396 nobody 11w REG 8,8 0 1599443 /tmp/tcmalloc.2396
nginx 2397 nobody 13w REG 8,8 0 1599441 /tmp/tcmalloc.2397
nginx 2398 nobody 15w REG 8,8 0 1599442 /tmp/tcmalloc.2398
由于在Nginx配置文件中设置worker_processes的值为4 ,因此开启了4个Nginx线程,每个线程都会有一行记录。每个线程文件后面的数字值就是启动Nginx的pid值。
至此,利用TCMalloc优化Nginx的操作完成。
下面还有对Nginx内核参数的优化。也来给大家分享下。见 http://www.linuxidc.com/Linux/2013-04/83198.htm