环境 Centos 7.4
官网文档
http://nginx.org/en/docs/ngx_google_perftools_module.html
安装 gperftools library 及 相关的工具。
这里可以直接使用 yum 安装
$ yum install gperftools.x86_64 gperftools-libs.x86_64 gperftools-devel.x86_64
这里用到的是openresty(nginx,tengine都可)
编译
./configure --prefix=/usr/local/openresty/ --with-google_perftools_module --with-http_realip_module --with-luajit --with-http_gzip_static_module --with-http_stub_status_module
gmake
gmake install
平滑升级nginx
首先进入 nginx 的可执行文件的所在目录。
1. 让nginx把nginx.pid文件修改成nginx.pid.oldbin,随即启动nginx,实现不间断服务运行
kill -USR2 `cat /usr/local/openresty/nginx/logs/nginx.pid`
可以看到有两组nginx在运行
$ ps aux|grep nginx
root 9423 0.0 0.0 37256 1628 ? Ss 7月15 0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
nobody 9424 0.0 0.0 37664 2224 ? S 7月15 0:00 nginx: worker process
nobody 9426 0.0 0.0 37664 2224 ? S 7月15 0:00 nginx: worker process
root 29292 0.0 0.0 59908 4516 ? S 18:55 0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
nobody 29293 0.0 0.0 60328 2212 ? S 18:55 0:00 nginx: worker process
nobody 29294 0.0 0.0 60328 2220 ? S 18:55 0:00 nginx: worker process
2. 平滑停止旧的work进程
kill -WINCH `cat /usr/local/openresty/nginx/logs/nginx.pid.oldbin`
$ ps aux|grep nginx
root 9423 0.0 0.0 37256 1628 ? Ss 7月15 0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
root 29292 0.0 0.0 59908 4516 ? S 18:55 0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
nobody 29293 0.0 0.0 60328 2212 ? S 18:55 0:00 nginx: worker process
nobody 29294 0.0 0.0 60328 2220 ? S 18:55 0:00 nginx: worker process
3. 退出旧的Nginx master进程
# kill -QUIT `cat /usr/local/openresty/nginx/logs/nginx.pid.oldbin`
# ps aux|grep nginx
root 29292 0.0 0.0 59908 4516 ? S 18:55 0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
nobody 29293 0.0 0.0 60328 2212 ? S 18:55 0:00 nginx: worker process
nobody 29294 0.0 0.0 60328 2220 ? S 18:55 0:00 nginx: worker process
配置动态追踪我的nginx。在 nginx.conf 中的main 里添加
pid logs/nginx.pid;
google_perftools_profiles tmp/gperf;
reload nginx
可以在 /tmp/ 下发现很多以gperf开头的文件
压力测试一下。
wrk -t6 -c30000 -d30s http://127.0.0.1:4000
再次重载 nginx (reload nginx)
将pref文件导入成 svg 文件。
pprof --svg /usr/local/openresty/nginx/sbin/nginx gperf.61642 > nginx.svg