nginx 高并发优化
一、关闭系统中不需要的服务
二、优化磁盘写操作
mount -o remount defaults,noatime,nodiratime partion mount_partion
fstab 将partion mount_partion defaults 0 0
修改为partion mount_partion defaults,noatime,nodiratime 0 0
即修改为写入磁盘不修改访问时间
三、优化资源限制
ulimit -n 和ulimit -u 即open_file和最大打开程序数
在文件中修改:
vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
这种方式需要重启系统或者直接使用ulimit -n&-u修改
四、nginx配置
nginx配置
关闭访问日志如果有需求根据区段来记录
使用epoll模型
配置
worker_processes 8 //nginx进程数按照cpu数目来指定
worker_cpu_affinity //为每个进程分配cpu
worker_rlimit_nofile 102400 //这个指令是指当一个nginx进程打开的最多文件描述符数目理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除但是nginx分配请求并不是那个均匀所以最好与ulimit -n的值保持一致。
use epoll //使用epoll的I/O模型。
worker_connections 102400 //每个进程允许的最多连接数理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。
keepalive_timeout 60; //keepalive超时时间
client_header_buffer_size 4K //客户端请求头部的缓冲区大小这个可以根据你的系统分页大小来设置一般一个请求头的大小不会超过1k不过由于一般系统分页都要大于1K所以这里设置为分页大小。分页大小可以用getconf PAGESIZE 获取。
open_file_cache_max=102400 inactive 20s //这个将为打开文件制定缓存默认是没有启动的max指定缓存数量建议和打开文件数一致inactive是指经过多长时间文件没被请求后删除。
open_file_cache_vaild 30s; //这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1//open_file_cache指令中的inactive参数时间内文件的最少使用次数如果超过这个数字文件描述符一直是在缓存中打开的如上例如果有一个文件在inactive时间内一次没被使用它将被移除。
gzip on;
五、内核优化
net.ipv4.tcp_max_tw_buckets=5000 //timewait的数量默认为180000
net.ipv4.ip_local_port_range=1024 65000 //允许系统打开的端口范围
net.ipv4.tcp_tw_recycle=1 //timewait快速回收
net.ipv4.tcp_tw_reuse=1 //开启timewait重用允许把sockets用于新的TCP连接
net.ipv4.tcp_syncookies=1 //开启SYN Cookies当出现SYN等待队列溢出时启用cookies来处理。
net.core.somaxconn=262144 //web应用中listen函数的backlog默认会给内核参数net.core.somaxconn限制到128而nginx定义的NGX_LISTEN_BACKLOG默认为511需要调整
net.core.netdev_max_baklog=262144 //每个网络接口接受数据包的速率比内核处理这些包的速率快时允许送到队列的数据库最大数目。
net.ipv4.tcp_max_orphans=262144 //系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字孤儿连接将即刻被复位并打印出警告信息。这个限制是为了防止简单的dos攻击。不能过分依靠它或者认为的减少这个值更应该增加这个值如果增加了内存
。
net.ipv4.tcp_max_syn_backlog=262144 //记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言缺省值是1024小内存的系统则是128
net.ipv4.tcp_timestamps=0 //时间戳可以避免序列号的卷绕一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种异常的数据包。这里将其关闭。关闭时间戳会导致timewait快速回收无效根据自己情况进行设置。
net.ipv4.tcp_synack_retries=1 //为了打开对端的连接内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries=1 //在内核放弃建立连接之前发送syn包的数量。
net.ipv4.tcp_fin_timeout=1 //如果套接字由本端要求关闭这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接甚至意外宕机。缺省值是60秒。2.2内核的通常值是180秒。你可以按这个设置但要记住的是即使你的机器是一个轻载的WEB服务器也有因为大量的死套接字而内存溢出的风险FIN-WAIT-2的危险性比FIN-WAIT-1要小因为它最多只能吃掉1.5K内存但是他们的生存期长。
net.ipv4.tcp_keepalive_time=30 //当keepalive启用的时候TCP发送keepalive消息的额度。缺省是2小时
六、TCMalloc优化内存使用
google-perftools优化
配置内容
google_perftools_profiles /tmp/tcmalloc;
本文出自 “tring” 博客,请务必保留此出处http://warcraft3.blog.51cto.com/6514883/1426865
原文:http://warcraft3.blog.51cto.com/6514883/1426865