Nginx下载服务生产服务器调优

一、内存调优

内核关于内存的选项都在/proc/sys/vm目录下.

1.pdflush,用于回写内存中的脏数据到硬盘。可以通过 /proc/sys/vm/vm.dirty_background_ratio调整。

首先查看这个值默认应该是10。

[[email protected] ~]#  cat /proc/sys/vm/dirty_background_ratio
10

这个值是一个阀值,说明如果内存中的脏数据达到系统总内存的10%时,那么pdflush进程就会启动,将内存中的脏数据写回硬盘.这个值可适当调高.可获得更快的写入速度.

2.swappiness选项

[[email protected] ~]# cat /proc/sys/vm/swappiness
60

swappiness表示使用swap分区的使用程度,可以适当调整swappiness=0的时候表示尽可能使用物理内存swap空间.swappiness=100积极使用swap.

3.dirty_ratio

[[email protected] ~]# cat /proc/sys/vm/dirty_ratio
20

dirty_ratio的值是数据写进内存的阀值,20%是指当系统内存已经缓存了20%的数据以后,就不再往内存中缓存数据了.

二、磁盘I/O调优

Linux磁盘I/O调优

一)、     概述

1.   磁盘调优目录:/sys/block

2.   磁盘调优均是调内核参数,要求安装kernel-doc包,

3.   调预先读请求量(默认为128kb)

  1. # blockdev --getra /dev/sda
  2. # blockdev --setra 512 /dev/sda

实际修改/sys/block/sda/queue/read_ahead_kb=256kb;如果读情况多则将此参数调大一点,如写请求读,则将此参数调小一点

4.   调磁盘队列:队列长则处理快,提升硬盘的吞吐量,但会消耗更大的内存

Queue length:/sys/block/sda/queue/nr_requests

  1. # cat /sys/block/sda/queue/nr_requests
  2. 512

#默认128,没有单位

二)、 磁盘I/O的4种调度算法

1.   CFQ(完全公平排队I/O调度程序)(elevator=cfq)

特点:

这是默认算法,对于通用服务器来说通常是最好的选择。它试图均匀地分布对I/O带宽的访问。是deadline和anticipatory调度器的折中方案.

CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择.

CFQ赋予I/O请求一个优先级,而I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级.

CFQ基于64位的队列请求,使用的轮询的方法处理队列.

调优参数:

  1. #  /sys/block/sda/queue/iosched/queued:轮询时每次处理的最大请求数
  2. #  /sys/block/sda/queue/iosched/quantum:每隔多少个请求数做一次轮询

cfq调优工具ionice

ionice可以更改任务的类型和优先级,不过只有cfq调度程序可以用ionice.

有三个例子说明ionice的功能:

采用cfq的实时调度(实时调度:c1),优先级为7(数字越低优先级越高)

  1. # ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&

采用缺省的磁盘I/O调度(轮询调度:c2),优先级为3

  1. # ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&

采用空闲的磁盘调度(idle调度:c3),优先级为0

  1. # ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&

#ionice的三种调度方法,实时调度最高,其次是缺省的I/O调度,最后是空闲的磁盘调度.

ionice的磁盘调度优先级有8种,最高是0,最低是7.

注意,磁盘调度的优先级与进程nice的优先级没有关系.一个是针对进程I/O的优先级,一个是针对进程CPU的优先级.

2.   Deadline(截止时间调度程序)(elevator=deadline):

特点:

Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.

这个算法试图把每次请求的延迟降至最低。该算法重排了请求的顺序来提高性能。可以调队列的过期的读写过程,如 read_expire 和 write_expire 二个参数来控制多久内一定要读到数据,超时就放弃排序。

比较合适小文件。还可以使用打开 front_merges 来进行合并邻近文件。Deadline对数据库环境(Oracle RAC,MYSQL等)是最好的选择.

调优:

  1. # echo deadline >/sys/block/sda/queue/scheduler
  2. # more /sys/block/sda/queue/scheduler
  3. noop anticipatory [deadline] cfq
  4. # ls /sys/block/sda/queue/iosched/
  5. fifo_batch  front_merges  read_expire  write_expire  writes_starved
  6. # cat iosched/read_expire
  7. 500    #默认500ms
  8. # cat iosched/write_expire
  9. 5000   #默认5000ms
  10. # cat iosched/front_merges
  11. 1

#默认为1,请求整合,新的请求和之前请求有关联,则优先处理该请求,对IO性能没有影响,但优化了磁盘处理。

3.   Anticipatory(预料I/O调度程序)(elevator=as):

特点:

预想调度算法。优化完成率,改善读请求。

本质上与Deadline一样,但在最后一次读操作后,要等待6ms才能继续进行对其它I/O请求进行调度。可以从应用程序中预订一个新的读请求,改进读操作的执行,但以一些写操作为代价,它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量。

AS适合于写入较多的环境,比如文件服务器;适合大文件处理,适合web server等。AS对数据库环境表现很差。

调优:

  1. # echo "anticipatory">/sys/block/sda/queue/scheduler
  2. # more iosched/antic_expire
  3. 6       #默认为6秒
  4. # more /sys/block/sda/queue/iosched/read_expire
  5. 125      #读的最大队列时间
  6. # more /sys/block/sda/queue/iosched/write_expire
  7. 250      #写的最大队列时间
  8. 注:测试时一定要清空缓存
  9. # free –m    #查看缓存
  10. total    used   free   shared    buffers     cached
  11. Mem:        4054    506   3548   0        140        256
  12. -/+ buffers/cache:      108   3945
  13. Swap:         8189   0    8189

测试:

  1. # sysctl -w vm.drop_caches=3   #清空缓存
  2. # rpm –ivh elevator-test-0.1-3.i386.rpm  #安装测试软件
  3. # dd if=/dev/urandom of=/root/bigfile bs=1M count=100
  4. # watch –n 1 ls –lh /root/bigfile   #每隔一秒查写入bigfile的数据量
  5. 默认调度类型为cfq下,测试读数据速度(测试时要求清空缓存)
  6. # cat /sys/block/sda/queue/scheduler
  7. noop anticipatory deadline [cfq]
  8. et_start reader /root/bigfile
  9. Launching
  10. Reading 25600 pages
  11. Read 20000 pages
  12. real    0m1.552s
  13. user    0m0.011s
  14. sys     0m0.147s
  15. 将调度类型改为anticipatory,测试读数据速度(测试时要求清空缓存)
  16. # echo “anticipatory”>/sys/block/sda/queue/scheduler
  17. noop anticipatory deadline [anticipatory]
  18. # cat /sys/block/sda/queue/iosched/antic_expire
  19. 12    #该值默认为6,为提高速度,改成12

    et_start reader /root/bigfile

    Launching

    Reading 25600 pages

    Read 20000 pages

    real    0m1.456s

    user    0m0.007s

    sys     0m0.144s

    结论:很明显读的数度提高了。

4.   NOOP(电梯式调度程序)(elevator=noop):

特点:

不做任何调优,主要用于节省CPU资源。

Noop调度算法指的是当请求被存储到队列并交由I/O子系统处理时由磁盘硬件对其进行优化。该算法一般只对一些特定的硬件(例如RAM disk和TCQ disk等)。

Noop对于I/O不那么操心,对所有的I/O请求都用FIFO队列形式处理,默认认为 I/O不会存在性能问题。这也使得CPU也不用那么操心

三)、 I/O调度算法使用建议

1.   Deadline I/O scheduler

在这个中 deadline 调度算法通过降低性能而获得更短的等待时间,它使用轮询的调度器,简洁小巧,提供了最小的读取延迟

和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库,Oracle 10G 之类).

2.   Anticipatory I/O scheduler

anticipatory 算法通过增加等待时间来获得更高的性能,假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流(相当于给随机读写变顺序读写), 使用这个原理来使用读取写入的延时换取最大的读取写入吞吐量.适用于大多数环境,特别是读取写入较多的环境,比如文件服务器,Web 应用,App等应用我们可以采纳as调度.后面我会教大家怎么调这个的合并的等待时间。

3.   CFQ I/O scheduler

这个是 对所有因素也都做了折中而尽量获得公平性,使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统。

四、 sysctl.conf参数的调整

一:优化TIME_WAIT

tcp连接断开后,会以TIME_WAIT状态保留一定的时候,然后才会释放端口。当并发很多的时候,就会产生大量的TIME_WAIT,无法及时断开,占用大量的端口和服务器资源。优化TCP的内核参数,及时处理TIME_WAIT

  1. 查看TIME_WAIT的数量
  2. # netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
  3. 优化
  4. # vim /etc/sysctl.conf
  5. net.ipv4.tcp_syncookies = 1     //开户SYN Cookies,当出现等待队列溢出时,启用cookies来处理,防范少量SYN攻击
  6. net.ipv4.tcp_tw_reuse = 1       //开户重用,允许TIME_WAIT sockets重新用于新的TCP连接
  7. net.ipv4.tcp_tw_recycle = 1     //开户TCP连接中TIME_WAIT sockets的快速回收
  8. net.ipv4.tcp_fin_timeout = 30       //修改TIMEOUT的时间
  9. net.ipv4.tcp_keepalive_time = 1200      //当keepalive起作用的时候,TCP发送keepalive消息的频度,缺少是2小时,改为20分钟
  10. net.ipv4.ip_local_port_range = 10000 65000      //修改端口范围,允许更多的连接
  11. net.ipv4.tcp_max_syn_backlog = 8192     //SYN队列的长度,默认为1024,加大队列长度为8192,以容纳更多等待连接的网络连接
  12. net.ipv4.tcp_max_tw_buckets = 5000      //系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立即被清除
  13. net.core.netdev_max_backlog = 32768     //每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
  14. net.core.somaxconn = 32768      //web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
  15. net.ipv4.tcp_wmem = 8192 436600 873200  //TCP写buffer
  16. net.ipv4.tcp_rmem  = 32768 436600 873200    //TCP读buffer
  17. net.inet.tcp.sendspace=65536  //最大的待发送TCP数据缓冲区空间
  18. net.inet.tcp.recvspace=65536  //最大的接受TCP缓冲区空间
  19. net.inet.udp.sendspace=65535  //最大的接受UDP缓冲区大小
  20. net.inet.udp.maxdgram=65535  //最大的发送UDP数据缓冲区大小
  21. net.local.stream.sendspace=65535  //本地套接字连接的数据发送空间
  22. 最后使用命令sysctl让其生效
  23. # sysctl -p

五、 网络调优

双网卡绑定以提高带宽

  1. 1.安装软件
  2. apt-get install ifenslave
  3. 2.修改配置文件
  4. /etc/network/interfaces
  5. auto lo
  6. iface lo inet loopback
  7. iface eth0 inet dhcp
  8. iface eth1 inet dhcp
  9. auto bond0
  10. iface bond0 inet static
  11. address 64.0.177.20
  12. netmask 255.255.255.0
  13. gateway 64.0.177.254
  14. up ifenslave bond0 eth0 eth1
  15. down ifenslave -d bond0 eth0 eth1
  16. 3.加载模块
  17. vi /etc/modules
  18. bonding

六 nginx调优

一)、配置文件调优

  1. worker_processes 8;  //nginx进程数,建议按照cpu数目来指定,一般为它的倍数。
  2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;  //为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
  3. worker_rlimit_nofile 102400;  //这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
  4. use epoll;   //使用epoll的I/O模型,这个不用说了吧.
  5. worker_connections 102400;   //每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。
  6. keepalive_timeout 60;  //keepalive超时时间。
  7. limit_rate_after 2m;
  8. //限制速度,当用户请求的文件超过2M的时候,开始限速,限制为128k
  9. limit_rate  128k;

二)、安装插件调优

安装Google插件,以实现加速内存的分配和回收

TCMallocde的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中得一个成员。与标准的glibc库的Malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低了系统的负载。

要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库位基于64位cpu和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。

1、安装libunwind库

可以从http://mirror.yongbok.net/nongnu/libunwind/ 下载相应的版本

下载地址:http://mirror.yongbok.net/nongnu/libunwind/libunwind-0.99.tar.gz

  1. # tar xnf libunwind-0.99.tar.gz
  2. # cd libunwind-0.99/
  3. # CFLAGS=-fPIC ./configure
  4. # make CFLAGS=-fPIC
  5. # make CFLAGS=-fPIC install

2、安装google-perftools

可从http://code.google.com/p/gperftools/ 下载相应的版本。

下载地址:http://gperftools.googlecode.com/files/google-perftools-1.9.tar.gz  最新版:http://gperftools.googlecode.com/files/gperftools-2.0.tar.gz 这里用的google-perftools-1.9.tar.gz

  1. # tar xvf google-perftools-1.9.tar.gz
  2. # cd google-perftools-1.9/
  3. # ./configure
  4. # make && make install
  5. # echo "/usr/local/lib“ >> /etc/ld.so.conf.d/usr_local_lib.conf
  6. # ldconfig

至此google-perftools安装完成

3、重新编译nginx

为了使nginx支持google-perftools,需要在安装过程中添加”--with-google_perftools_module"选项重新编译nginx。安装如下:

  1. # ./configure --with-google_perftools_module --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/webserver/nginx
  2. # make
  3. # make install

到这里nginx安装完成

4、为google-perftools添加线程目录

创建一个线程目录,这里将文件放在/tmp/tcmalloc下。

  1. # mkdir /tmp/tcmalloc
  2. # chmod 0777 /tmp/tcmalloc

5、修改nginx主配置文件

  1. 修改nginx.conf文件,在pid这行的下面添加如下代码:
  2. google_perftools_profiles    /tmp/tcmalloc;

接着,重启nginx即可完成google-perftools的加载。

6、验证运行状态

  1. 为了验证google-perftools已经正常加载,可通过如下命令查看:
  2. lsof -n | grep tcmalloc
时间: 2024-10-08 10:14:21

Nginx下载服务生产服务器调优的相关文章

服务器调优

linux 服务器调优 Linux内核参数 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies 当出现SYN等待队列溢出时,启用cookies来处理,减少SYN攻击,默认0表示关闭, net.ipv4.tcp_tw_reuse = 1 表示开启重用.允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭: net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为

【译】Java服务器调优

随着成千上万的Java服务器运行在企业线上环境,Java已经成为构建线上系统的语言之一.如果希望我们的机器表现出可接受的性能,那么就需要对它们进行定期调优.这篇文章详细阐述了Java服务器调优的各项技术. 衡量性能 为了让我们的调优有意义,我们需要某种方法来衡量性能是否提高.让我们记住两个重要的性能指标:延迟和吞吐量. 延迟(Latency) 衡量的是端到端的某个操作的处理时间.在分布式环境中我们通常用发送请求和接收到响应整个来回的时间来衡量延迟.在那些场景,延迟是从客户端机器开始衡量的,并且也

Nginx源码安装及调优配置(转)

导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前的优化 [[email protected] ~]# wget http://nginx.org/download/nginx-1.10.1.tar.gz [[email protected] ~]# tar xvf nginx-1.10.1.tar.gz -C /usr/local/src/ [[em

ActiveMQ生产环境调优

ActiveMQ简介 MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka.ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现.消息类型包括点对点(queue),一对多(topic),本次生产环境用的是queue. 1.部署环境 三个ActiveMQ实例+MySQL数据数据库持久化,三台ActiveMQ采用failover方式,MQ数据持久化在MySQL数据库中,M

服务器调优?

除了上述内存泄漏外,我们还发现CPU长期不足3%,系统吞吐量不够,针对8core×16G.64bit的Linux服务器来说,是严重的资源浪费. 在CPU负载不足的同时,偶尔会有用户反映请求的时间过长,我们意识到必须对程序及JVM进行调优.从以下几个方面进行: 线程池:解决用户响应时间长的问题 连接池 JVM启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量 程序算法:改进程序逻辑算法提高性能

记一次Web服务的性能调优

前言 一个项目在经历开发.测试.上线后,当时的用户规模还比较小,所以刚刚上线的项目一般会表现稳定.但是随着时间的推移,用户数量的增加,qps的增加等因素会造成项目慢慢表现出网页半天无响应的状况.在之前的工作中也恰巧遇到这个过程,当时对项目进行了很多性能测试和调优,今天借助博客园,将这次性能调优的过程进行整理后写成随笔,希望给广大Java后端开发的工程师提供帮助,也借此机会,对性能调优进行一些总结工作,达到备忘的目的. 测试工具与环境 性能测试工具 Loadrunner:一种预测系统行为和性能的负

服务器调优原理

1.CPU  动态优先级:  内核自动检测占用cpu时间的进程,自动调整进程的优先级  手动优先级调整:调整nice值,但是内核也会再动态调整这些手动调整优先级高的进程 CPU调度队列   0-139个优先级队列 内核从优先级由高到低挨个扫描队列,      调度策略:先到先得,轮流,完全公平(CFS),   内核调度实时进程:先到先出 或者 轮流   调度用户级别的进程:完全公平 2.内存 内存的刷写时间 内存查看的时间 释放已使用内存页以及释放slab小文件系统 3.硬盘 硬盘中的数据是做成

Nginx下TIME_WAIT过多的调优

查看Nginx并发状态 #netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 1259SYN_SENT 2FIN_WAIT1 8ESTABLISHED 166FIN_WAIT2 24SYN_RECV 25CLOSING 17LAST_ACK 18 ======================== 以上参数解释:CLOSED:无连接是活动的或正在进行LISTEN:服务器在等待进入呼叫SYN_R

Linux服务器调优

Linux内核参数 http://space.itpub.net/17283404/viewspace-694350 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies.当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭:什么是SYN Cookies:http://www.ibm.com/developerworks/cn/linux/l-syncookie/ net.ipv4.tcp_tw_reuse = 1 表示