一. 系统层面调优
1. 调整进程打开的最大文件数量
在/etc/security/limits.conf 最后增加:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
或者在/etc/profile中增加:
ulimit -SHn 65535
-H 代表硬限制, -S 代表软限制。
2. 修改TCP最大连接数
echo 100000 > /proc/sys/net/core/somaxconn
3.TCP 链接立即回收与回用
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
4.优化内核配置
在/etc/sysctl.conf中加入:
# 系统中每一个端口最大的监听队列的长度
net.core.somaxconn = 16384
# TCP数据接收缓冲默认大小
net.core.rmem_default = 256960
# TCP数据发送缓冲默认大小
net.core.wmem_default = 256960
# TCP数据接收缓冲最大长度
net.core.rmem_max = 513920
# TCP数据发送缓冲最大长度
net.core.wmem_max = 513920
# 定义socket接收使用内存, 第一个值为socket接收缓冲区最少字节数;
# 第二个是缓冲区在系统负载不重的情况可以增长到的值; 第三个是接收缓冲区最大字节数
net.ipv4.tcp_rmem = 8760 256960 4088000
# 定义socket发送使用内存, 第一个值为socket发送缓冲区最少字节数;
#第二个是缓冲区在系统负载不重的情况可以增长到的值; 第三个是接收缓冲区最大字节数
net.ipv4.tcp_wmem = 8760 256960 4088000
# TCP 栈内存使用配置, 第一个值是内存使用下限, 第二个是内存压力模式应用的上限,
# 第三个是内存使用的上限
net.ipv4.tcp_mem = 131072 262144 524288
# 对于还未获得对方确认的连接请求, 可保存在队列中的最大数量
net.ipv4.tcp_max_syn_backlog = 2048
# 网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 2000
# 对于自身断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡
net.ipv4.tcp_fin_timeout = 3
# 对于还未获得对方确认的连接请求,可保存在队列中的最大数目
net.ipv4.tcp_max_syn_backlog = 262144
# 是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
# 更快地回收TIME-WAIT套接字
net.ipv4.tcp_tw_recycle = 1
# 不属于任何进程的tcp socket最大数量. 超过这个数量的socket会被reset, 并同时告警.
# 这个参数是为了防御简单的DDOS攻击, 为了避免大量的告警信息, 可将这个参数调大些
net.ipv4.tcp_max_orphans = 3276800
# 是否打开TCP同步标签(syncookie),内核必须打开了CONFIG_SYN_COOKIES项进行编译,
#同步标签可以防止一个套接字在有过多试图连接到达时引起过载。
net.ipv4.tcp_syncookies = 1
使用 sysctl -p 生效
二. Nginx调优配置
1.Nginx进程配置:
worker_processes 8
根据CPU核心数设定, 一般设为2的倍数, 比如四核设为8
2.Nginx 进程CPU分配
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
与上面的worker_processes对应, 设为8, 则对应的是8个CPU内核分配.
01表示启用第一个CPU内核,10表示启用第二个CPU内核, 有多少个核就对应多少个长度, 1表示开启该内核, 0表示关闭该内核.
3.Nginx 进程打开的文件描述符数量
worker_rlimit_nofile 65535
Nginx 给各进程分配的请求并不均匀, 最好与ulimit -n的值保持一致。
4.Nginx 事件处理模型
events {
use epoll;
multi_accept on;
worker_connections 65535;
}
采用epoll异步高效事件模型, 支持Linux内核2.6版本及以后的系统.
multi_accept 设置on, 多个worker按串行方式来处理连接, 设置为off后,多个worker按并行方式来处理连接, 服务器吞吐量并发要求较大时可以设为off, 提升处理效率.
worker_connections 代表每个进程的最大连接数.
5.Nginx 传输配置优化
keepalive_timeout 60;
client_header_buffer_size 4k;
pen_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
keepalived_timeout设置连接超时时间, 超过服务器会主动断开.
client_header_buffer_size 代表客户端请求头部的缓冲区大小, 跟随系统设置, 一般系统分页都要大于1k, 可以用命令getconf PAGESIZE查询.
open_file_cache中的max代表缓存数量, 一般与进程的文件打开数保持一致; inactive是代表文件未被使用的失效时间.
open_file_cache_valid 是指文件的有效性检查时间.
open_file_cache_min_uses 文件的最少使用次数, 如果低于此值, 该文件将被移除.
6.Nginx 高效传输配置:
http{
sendfile on;
tcp_nopush on;
}
sendfile on代表高效传输文件模式, 普通应用一般设为on, 如果是频繁磁盘IO应用, 可以设置为off, 降低系统负载. (如果图片不能正常显示, 可以设置为off)
tcp_nopush on必须在sendfile 为on开启时才生效, 防止网络阻塞, 减少网络报文段的数量(将响应头和正文的开始部分一起发送)
7.gzip 调优配置
Nginx安装需要开启ngx_http_gzip_module模块
http {
gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_proxied any;
}
gzip on开启压缩功能
gzip_min_length 设置允许压缩的页面最小字节数
gzip_buffers 4 32k 压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存
gzip_http_version为压缩版本
gzip_comp_level 压缩比例, 1代表压缩比最小,处理速度最快,9压缩比最大, 但消耗CPU资源
gzip_types 指定压缩的类型, 默认值是gzip_types text/html
gzip_vary on 让前端的缓存服务器缓存经过GZIP压缩的页面, 比如用Squid缓存经过nginx压缩的数据
gzip_proxied 根据某些头部标识决定是否压缩, any代表所有