Nginx优化参数
模块优化
sendfile
不用sendfile
1.系统调用read()产生了一个上下文切换:从User mode切换到kernel mode ,然后DMA执行拷贝,把文件数据读到一个kernel buffer里
2.数据从kernel buffer拷贝到user buffer ,然后系统调用read() 返回,这时产生了一个上下文切换:从kernel mode 切换到user mode.
3.系统调用write()产生了一个上下文切换:从user mode切换kernel mode.然后把步骤2读到user buffer的数据拷贝到kernel buffer(数据第二次拷贝到kernel buffer,不过这次是个不同的kernel buffer,这个buffer和socket 相关联。
4.系统调用write()返回,产生了一个上下文切换:从Kernel mode 切换到user mode,然后DMA从kernel buffer拷贝数据到协议栈。
四次上下文切换,四次拷贝。
在kernel2.0+中,系统调用sendfile()就是用来简化上面步骤提升性能,
硬盘>>kernel buffer >> user buffer >> kernel socket buffer >> 协议栈
硬盘>> kernel buffer >> 协议栈
简单来说,sendfile是个比read和write更高性能的系统接口,不过需要注意的是,sendfile是将in_fd的内容发送到out_fd.而in_fd不能是socket,只能是文件句柄。所以当Nginx是一个静态文件服务器的时候,sendfile能大大提高Nginx性能。做反向代理,就没什么用了,因为Nginx做反向代理时,In_fd就不是文件句柄而是socket,此时不符合sendfile函数要求
tcp_nopush
应用程序没产生一次操作都会发送一个包,典型情况一个包会拥有一个字节的数据以及40个字节长的包头,于是产生4000%的过载,很容易网络发生堵塞。同时浪费资源。
使用tcp_nopush=on会设置调用tcp_cork方法,也是默认的,网络传输效率提升:当包累计到一定大小再发送。有助于解决网络堵塞。只有使用senfile函数时,tcp_nopush才起作用,这个选项对于www,ftp等大文件很有帮助,他和指令tcp_nodelay是互斥的。发送速率响应及时,
tcp_nodelay
如果我们想发送一小块数据,我们可以选择立即发送数据或者等待更多的数据然后再一次发送两种策略。如果我们马上发送数据,那么交互性以及客户/服务器型的应用程序将极大地受益,如果请求立即发出那么响应时间也会快一点。通过设置TCP_NODELAY=ON ,这样就禁用了Nagle算法。
另一种情况则需要我们等到数据量最大时通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的就是文件的服务器。应用Nagle算法在这种情况下就会产生问题。但是如果正在发送大量数据,可以设置TCP——CORK选项Nagle化,这方式正好桶TCP_NODELAY.互斥。
文件压缩模块
原理介绍: 启动该模块,使文件传输前进行压缩,不用再网络中传输占用很大的开销,提升传输效率。
ngx_http_gzip_module模块
gzip: 用于打开或者关闭gzip压缩的功能。
gzip on | off;
git_buffers 32 4 k | 12 8k; 用于指定gzip功能压缩文件时使用的缓存空间的大小。
gzip_comp_level 4; 级别1-9,默认为1,级别越高压缩文件越小,越占用CPU,推荐设置中间值。
总结:
1.压缩作为网站服务器和代理服务器的时候是非常重要的,但是作为负载均衡是不需要压缩的,负载均衡只是做转发使用的
2.压缩主要处理静态资源的,站点有多个对象建议启用压缩,压缩最好再加上一个最小段压缩限制,因为太小反而压缩不出效果来。
3.压缩在整个处理速度和网络资源占用方面可以提供很大的帮助。
配置优化
1.worker_processer 8;
一般CPU(I/O)密集型配置为核数相同,网络(I/O)密集型配置为核数倍数(一般为2倍)
2.worker_cpu_affinity(这个没用过)
仅适用于LInux,使用该选项可以绑定worker进程和CPU(2.4内核机器用不了)
为每个进程分配cpu,或者将每一个进程分配到多个CPU。
3.worker_rlimit_nofile 102400;
每个nginx进程打开文件描述符最大数目配置要和系统的单线程打开文件数一直,linux2.6内核开启文件打开数为65535,
理论值应该与最多打开文件数与Nginx进程数相除,但是Nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
worker_rlimit_nofile就相应应该填65535.
4.use epoll
Nginx使用了最新的epoll(linux2.6内核)和kqueue(freebsd)网络I/O模型,而Apache使用的传统的select 模型。
处理大量连接的读写,Apache所采用的select 网络I/O模型非常低效。
在高并发服务器中,轮询I/O是最耗时间的操作,目前linux下能够承受高并发访问的squid,memcached都采用epoll网络I/O模型。
5. worker_connections 65535;
每个工作进程允许最大的同时连接数
6.keepalive_timeout 75;
keepalive超时时间,MSIE微软浏览器本身关闭保持活动连接大约60秒后。
7.open_file_cache max 102400 inactive=20s;
使用字段:http,server,location
这个指令指定缓存是否启用,默认未启用,如果启用,将记录文件一下信息。
打开的文件描述符
大小信息和修改时间
8.缓存静态文件:
expires 1m;
优化linux内核参数:
net.ipv4.ip_local_port_range =1024 65000允许打开的端口范围
net.ipv4.tcp_tw_recycle=1 启用timewait快速回收