1、编译过程优化
- 减小编译后的文件大小:关闭debug模式
修改auto/cc/gcc ,注释掉
#debug
CFLAGS="$CFLAGS -g"
- 为特定的cpu指定cpu类型的编译
nginx编译默认编译参数是“-O”,优化可是用下面两个参数
--with-cc-opt='-O3'
--with-cpu-opt=CPU #指定cpu类型有效值包括:pentium pentiumpro pentium3 pentium4 athlon opteron amd64 sparc32 sparc64 ppc64
查看cpu类型:cat /proc/cpuinfo | grep 'model name'
2、利用TCMalloc(Thread-Caching-Malloc)优化nginx性能
要安装TCMalloc库,依赖libunwind和google-perftools库
- 安装libunwind
tar -zxvf libunwind-1.1.tar.gz
cd libunwind-1.1/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC insall
- 安装google-preftools
tar -zxvf gperftools-2.1.tar.gz
cd gperftools-2.1
./configure
make && make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
- 重新编译Nginx
./configure --prefix=/usr/local/nginx --with-google_perftools_module --with-http_stub_status_module
make
make install
- 为google-perftools增加线程目录
mkdir /tmp/tcmalloc
chmod 0777 /tmp/tcmalloc
- 配置nginx.conf,在pid行增加一下内容
#pid logs/nginx.pid
google_perftools_profiles /tmp/tcmalloc;
重启,完成加载。
验证方法:
lsof -n | grep tcmalloc
3、内核参数优化
net.ipv4.tcp_max_tw_buckets = 6000 #设置timewait时间默认18000
net.ipv4.ip_local_port_range = 1024 65000 #设置允许打开的端口范围
net.ipv4.tcp_tw_recycle = 1 #设置启用timewait快速回收
net.ipv4.tcp_tw_reuse = 1 #设置开启重用,允许将TIME_WAIT sockets重新用于新的连接
net.ipv4.tcp_syncookies = 1 #设置开启SYN cookies ,当出现SYN等待队列溢出,启用cookies进行处理
net.core.somaxconn = 262144 #调节系统同时发起的TCP连接数,默认是128,高并发请求下,默认值可能导致链接超时或者重传,因此需要结合并发请求数调节此值
net.core.netdev_max_backlog = 262144 #表示当网口接收数据包比内核处理速度快时,允许发送到队列的数据包最多数目
net.ipv4.tcp_max_orphans = 262144 #设置用于系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数目,孤立连接将立即被复位并输出警告信息。这个限制只是为了防止DDOS攻击。不能过分依赖这个值,大多数情况下,是增加这个值,而非减小这个值
net.ipv4.tcp_max_syn_backlog = 262133 #用于记录那些没有收到客户端确认信息的连接请求最大值。对于128m内存默认值是1024,对于更小的默认值是128.
net.ipv4.tcp_synack_retries = 1 #这个参数决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 1 #内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1 #决定了套接字保持在FIN-WAIT-2状态的时间,默认值是60。这个很重要,因为即使负载很小的web服务器,也可能因为出现大量的死套接字产生内存溢出的风险
net.ipv4.tcp_keepalive_time = 30 #表示当启用keepalive后,tcp发送keepalive的频度。默认是2(单位是小时)。
syctl -p