nginx+系统层优化
一、内存调优
[root@esf ~]# cat /proc/sys/vm/dirty_background_ratio
10
[root@esf ~]# cat /proc/sys/vm/swappiness
60
[root@esf ~]# cat /proc/sys/vm/dirty_ratio
40
二、磁盘I/O调优
一)、 概述
# blockdev --getra /dev/sda
# blockdev --setra 512 /dev/sda
# cat /sys/block/sda/queue/nr_requests
512
二)、 磁盘I/O的4种调度算法
# /sys/block/sda/queue/iosched/queued:轮询时每次处理的最大请求数
# /sys/block/sda/queue/iosched/quantum:每隔多少个请求数做一次轮询
# ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2Mcount=300&
# ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2Mcount=300&
# ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2Mcount=300&
# echo deadline >/sys/block/sda/queue/scheduler
# more /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
# ls /sys/block/sda/queue/iosched/
fifo_batch front_merges read_expire write_expire writes_starved
# cat iosched/read_expire
500 #默认500ms
# cat iosched/write_expire
5000 #默认5000ms
# cat iosched/front_merges
1
# echo "anticipatory">/sys/block/sda/queue/scheduler
# more iosched/antic_expire
6 #默认为6秒
# more /sys/block/sda/queue/iosched/read_expire
125 #读的最大队列时间
# more /sys/block/sda/queue/iosched/write_expire
250 #写的最大队列时间
注:测试时一定要清空缓存
# free –m #查看缓存
total used free shared buffers cached
Mem: 4054 506 3548 0 140 256
-/+ buffers/cache: 108 3945
Swap: 8189 0 8189
# sysctl -w vm.drop_caches=3 #清空缓存
# rpm –ivh elevator-test-0.1-3.i386.rpm #安装测试软件
# dd if=/dev/urandom of=/root/bigfile bs=1Mcount=100
# watch –n 1 ls –lh /root/bigfile #每隔一秒查写入bigfile的数据量
默认调度类型为cfq下,测试读数据速度(测试时要求清空缓存)
# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
et_start reader /root/bigfile
Launching
Reading 25600 pages
Read 20000 pages
real 0m1.552s
user 0m0.011s
sys 0m0.147s
将调度类型改为anticipatory,测试读数据速度(测试时要求清空缓存)
# echo “anticipatory”>/sys/block/sda/queue/scheduler
noop anticipatory deadline [anticipatory]
# cat /sys/block/sda/queue/iosched/antic_expire
-
12 #该值默认为6,为提高速度,改成12et_start reader /root/bigfileLaunchingReading 25600 pagesRead 20000 pagesreal 0m1.456suser 0m0.007ssys 0m0.144s结论:很明显读的数度提高了。
三)、 I/O调度算法使用建议
四、 sysctl.conf参数的调整
查看TIME_WAIT的数量
# netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
优化
# vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 //开户SYN Cookies,当出现等待队列溢出时,启用cookies来处理,防范少量SYN***
net.ipv4.tcp_tw_reuse = 1 //开户重用,允许TIME_WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle = 1 //开户TCP连接中TIME_WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout = 30 //修改TIMEOUT的时间
net.ipv4.tcp_keepalive_time = 1200 //当keepalive起作用的时候,TCP发送keepalive消息的频度,缺少是2小时,改为20分钟
net.ipv4.ip_local_port_range = 10000 65000 //修改端口范围,允许更多的连接
net.ipv4.tcp_max_syn_backlog = 8192 //SYN队列的长度,默认为1024,加大队列长度为8192,以容纳更多等待连接的网络连接
net.ipv4.tcp_max_tw_buckets = 5000 //系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立即被清除
net.core.netdev_max_backlog = 32768 //每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.somaxconn = 32768 //web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.ipv4.tcp_wmem = 8192 436600 873200 //TCP写buffer
net.ipv4.tcp_rmem = 32768 436600 873200 //TCP读buffer
net.inet.tcp.sendspace=65536 //最大的待发送TCP数据缓冲区空间
net.inet.tcp.recvspace=65536 //最大的接受TCP缓冲区空间
net.inet.udp.sendspace=65535 //最大的接受UDP缓冲区大小
net.inet.udp.maxdgram=65535 //最大的发送UDP数据缓冲区大小
net.local.stream.sendspace=65535 //本地套接字连接的数据发送空间
最后使用命令sysctl让其生效
# sysctl -p
五、 网络调优
1.安装软件
apt-get install ifenslave
2.修改配置文件
/etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet dhcp
iface eth1 inet dhcp
auto bond0
iface bond0 inet static
address 64.0.177.20
netmask 255.255.255.0
gateway 64.0.177.254
up ifenslave bond0 eth0 eth1
down ifenslave -d bond0 eth0 eth1
3.加载模块
vi /etc/modules
bonding
六 nginx调优
一)、配置文件调优
worker_processes 8; //nginx进程数,建议按照cpu数目来指定,一般为它的倍数。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; //为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个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超时时间。
limit_rate_after 2m;
//限制速度,当用户请求的文件超过2M的时候,开始限速,限制为128k
limit_rate 128k;
二)、安装插件调优
# tar xnf libunwind-0.99.tar.gz
# cd libunwind-0.99/
# CFLAGS=-fPIC ./configure
# make CFLAGS=-fPIC
# make CFLAGS=-fPIC install
# tar xvf google-perftools-1.9.tar.gz
# cd google-perftools-1.9/
# ./configure
# make && make install
# echo "/usr/local/lib“ >> /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig
# ./configure --with-google_perftools_module --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/webserver/nginx
# make
# make install
# mkdir /tmp/tcmalloc
# chmod 0777 /tmp/tcmalloc
修改nginx.conf文件,在pid这行的下面添加如下代码:
google_perftools_profiles /tmp/tcmalloc;
为了验证google-perftools已经正常加载,可通过如下命令查看:
lsof -n | grep tcmalloc
====用在上线下载机器