18600329666

咨询技术专家

扫一扫
与技术专家在线沟通

Menu
单机Linux+TOMCAT+NGINX性能优化
       单机Linux+TOMCAT+NGINX性能优化,受资源限制一般的web应用都部署在Linux单机上运行,如果没有提供多台服务器资源,无法实现分布式和负载均衡那么就只能通过优化和提高单机运行效率以达到最优负载能力,本文从三个方面讲解优化配置,Linux操作系统优化,Nginx配置优化,tomcat配置优化
 一、linux系统配置优化(以centos7为例)
Linux最大连接数优化配置:Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数

  • 1.解除 Linux 系统的最大进程数和最大文件打开数限制
        vi /etc/security/limits.conf
        # 添加如下的行
        * soft noproc 11000
        * hard noproc 11000
       上边两行可以用一行代替  * - noproc 11000       -的意思为soft 和hard 全部限制 。
 
        * soft nofile 4100
        * hard nofile 4100
        说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
 
  • 2.让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
         a、vi /etc/ssh/sshd_config
             把 UserLogin 的值改为 yes,并把 # 注释去掉
        b、重启 sshd 服务:              /etc/init.d/sshd restart
  • 3.修改所有 linux 用户的环境变量文件:
        vi /etc/profile
        ulimit -u 10000
        ulimit -n 4096
        ulimit -d unlimited
        ulimit -m unlimited
        ulimit -s unlimited
        ulimit -t unlimited
        ulimit -v unlimited     
        保存后运行#source /etc/profile 使其生效
Linux内核tcp调优方案,sysctl.conf的设置
#sudo vi /etc/sysctl.conf 
$ /proc/sys/net/core/wmem_max
该文件指定了发送套接字缓冲区大小的最大值(以字节为单位),可参考的优化值:873200
$ /proc/sys/net/core/rmem_max
该文件指定了接收套接字缓冲区大小的最大值(以字节为单位),可参考的优化值:873200
$ /proc/sys/net/core/netdev_max_backlog
进入包的最大设备队列.默认是1000,对重负载服务器而言,该值太低,可调整到16384.
$ /proc/sys/net/core/somaxconn
listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到8192.
$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默认10K(10240).也可调整到20k(20480).但建议保留不变
$ /proc/sys/net/ipv4/tcp_max_syn_backlog
进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到16384.
$ /proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.
$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
这3个参数与TCP KeepAlive有关.默认值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可调整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_probes 3
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
$ proc/sys/net/ipv4/ip_local_port_range
指定端口范围的一个配置,默认是32768 61000.可调整为1024 65535.
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的快速回收,默认为0,表示关闭。
!!!开启快速回收后,可以很大程度的减少TIME_WAIT状态,及时回收资源,之前我发过一篇文章,这里会导致app移动设备无法同时访问网站,这个问题应该是曾经阿里云的bug,目前应该是修复了。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200
表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65535
表示用于向外连接的端口范围。缺省情况下过窄:32768到61000,改为1024到65535。
net.ipv4.tcp_max_syn_backlog = 16384
表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 1000
表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,建议减小,避免TIME_WAIT状态过多消耗整个服务器的资源,但也不能太小,跟你后端的处理速度有关,如果速度快可以小,速度慢则适当加大,否则高负载会有请求无法响应或非常慢。
 
#缺省socket写buffer,可参考的优化值:873200/1746400/3492800
net.core.wmem_default = 1746400
 
#最大socket写buffer,可参考的优化值:1746400/3492800/6985600
net.core.wmem_max = 3492800
 
#缺省socket读buffer,可参考的优化值:873200/1746400/3492800
net.core.rmem_default = 1746400
 
#最大socket读buffer,可参考的优化值:1746400/3492800/6985600
net.core.rmem_max = 3492800
 
#进入包的最大设备队列.默认是1000,对重负载服务器而言,该值太低,可调整到16384/32768/65535
net.core.netdev_max_backlog = 32768
 
#listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到8192/16384/32768
net.core.somaxconn = 16384
 
#每个socket buffer的最大补助缓存大小,默认10K(10240),也可调整到20k(20480),但建议保留
net.core.optmem_max = 10240
 
#表示用于向外连接的端口范围.缺省情况下过窄:32768到61000,改为1024到65535
net.ipv4.ip_local_port_range = 1024 65535
 
#TCP写buffer,可参考的优化值:873200/1746400/3492800/6985600
net.ipv4.tcp_wmem = 873200 1746400 3492800
 
#TCP读buffer,可参考的优化值:873200/1746400/3492800/6985600
net.ipv4.tcp_rmem = 873200 1746400 3492800
 
#进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到16384/32768/65535
net.ipv4.tcp_max_syn_backlog = 32768
 
#TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源
net.ipv4.tcp_retries2 = 5
 
#以下3个参数与TCP KeepAlive有关.默认值是:
#tcp_keepalive_time = 7200 seconds (2 hours)
#tcp_keepalive_probes = 9
#tcp_keepalive_intvl = 75 seconds
#意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效
#对服务器而言,显然上述值太大.可调整到:
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 30
 
#表示开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
 
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 30
 
#表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
#net.ipv4.tcp_tw_reuse = 1
 
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
#net.ipv4.tcp_tw_recycle = 1
 
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息
#默认为180000,建议使用默认值,不建议调小
#net.ipv4.tcp_max_tw_buckets = 180000
 
#其它的一些设置
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
 
保存退出:
2 #sudo /sbin/sysctl -p

二、tomcat优化配置
配置tomcat链接池增加并能力

使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请求的能力。

编辑配置文件 server.xml : vi  /usr/local/tomcat8/conf/server.xml

1.打开被注释的默认连接池配置

                     默认配置:                                              

[html] view plain copy
 
 
  1. <!--  
  2.              <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"  
  3.                     maxThreads="150" minSpareThreads="4"/>  
  4.                  -->  
修改实例:           
[html] view plain copy
 
 
  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"  
  2.             maxThreads="150" minSpareThreads="100"   
  3.         prestartminSpareThreads="true" maxQueueSize="100"/>   
 参数讲解:
  •  name: 线程名称
  •  namePrefix: 线程前缀
  •  maxThreads : 最大并发连接数,不配置时默认200,一般建议设置500800 ,要根据自己的硬件设施条件和实际业务需求而定。
  •  minSpareThreads:Tomcat启动初始化的线程数,默认值25   
  •  prestartminSpareThreads:在tomcat初始化的时候就初始化minSpareThreads的值, 不设置true时minSpareThreads   
  •  maxQueueSize: 最大的等待队列数,超过则拒绝请求

2.修改链接配置                 

 默认配置:
[html] view plain copy
 
 
  1. <Connector port="8080" protocol="HTTP/1.1"  
  2.               connectionTimeout="20000"  
  3.               redirectPort="8443" />  
修改配置:
[html] view plain copy
 
 
  1. <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"  
  2.         connectionTimeout="20000"  
  3.         redirectPort="8443"   
  4.         executor="tomcatThreadPool"  
  5.         enableLookups="false"   
  6.         acceptCount="100"   
  7.         maxPostSize="10485760"   
  8.         compression="on"   
  9.         disableUploadTimeout="true"   
  10.         compressionMinSize="2048"   
  11.         noCompressionUserAgents="gozilla, traviata"   
  12.         acceptorThreadCount="2"   
  13.         compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"   
  14.         URIEncoding="utf-8"/>  
参数讲解:
  •    port:连接端口。  
  •   protocol:连接器使用的传输方式。  Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol    
  •   protocol, Tomcat 6、7 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol      
            注:
           每个web客户端请求对于服务器端来说就一个单独的线程,客户端的请求数量增多将会导致线程数就上去了,CPU就忙着           跟线程切换。
            而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe     或者队       列里的请求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。   
  •   executor: 连接器使用的线程池名称
  •  enableLookups:禁用DNS  查询 
  •   acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 。
  •  maxPostSize:限制 以FORM URL 参数方式的POST请求的内容大小,单位字节,默认是 2097152(2兆),10485760 为 10M。如果要禁用限制,则可以设置为 -1。
  • acceptorThreadCount: 用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2。
  • compression:传输时是压缩。
  • compressionMinSize:压缩的大小
  • noCompressionUserAgents:不启用压缩的浏览器
3.优化jvm配置
修改
${JAVA_HOME}/bin/catalina.sh文件,JAVA_OPTS选项
三,nginx优化配置

worker_processes  8;//取值为cup合数的倍数
worker_rlimit_nofile 65535;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
events {
    use epoll;
    worker_connections  65535;
}