Tomcat8.x http 并发调优

Tomcat 的优化不像其它软件那样,简简单单的修改几个参数就可以了,它的优化主要有三方面,分为系统优化,Tomcat 本身的优化,Java 虚拟机(JVM)调优。

点我下载已经调优好的 apache-tomcat-8.5.41
点我下载 apr 模式安装包

Tomcat8.x http 并发调优

看这个压测结果, 相同机器, 优化后的效果还是很显著的

一、Tomcat 本身优化

Tomcat 的自身参数的优化,这块很像 ApacheHttp Server。修改一下 xml 配置文件中的参数,调整最大连接数,超时等。此外,我们安装 Tomcat 是,优化就已经开始了。下面以 tomcat8.5.41 为例

1、Connector 连接器的配置

 Tomcat 连接器的三种方式: bio、nio 和 apr,三种方式性能差别很大,apr 的性能最优, bio 的性能最差。而 Tomcat 8 如果使用 Apr 协议,需要安装系统 Apr 库,否则就会使用 bio 方式。

安装时候特别注意–with-xx 的目录指向!

–prefix 程序安装位置

–with-apr apr 安装的位置

–with-java-home javahome 目录

–with-ssl 自定义安装的 openssl(如果没有就去除此参数)**

1. apr安装
tar -zxvf apr-1.5.2.tar.gz
cd apr-1.5.2
./configure --prefix=/usr/local/httpd/apr && make && make install
2. apr-utils安装
tar -zxvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --prefix=/usr/local/httpd/apr-util --with-apr=/usr/local/httpd/apr && make && make install
3. apr-iconv安装
tar -zxvf apr-iconv-1.2.2.tar.gz
cd apr-iconv-1.2.2
./configure --prefix=/usr/local/httpd/apr-iconv --with-apr=/usr/local/httpd/apr && make && make install
4. openssl-1.0.2h安装(此步骤非必需,如果当前系统openssl的版本小于1.0.2,才需要安装[openssl version命令查看版本])
tar -zxvf openssl-1.0.2h.tar.gz
cd openssl-1.0.2h
./config --prefix=/usr/local/httpd/openssl -fPIC                 #加上-fPIC参数,否则编译native的时候会报错,如附一
make 
make install

附录:
    /usr/local/openssl/lib/libssl.a(s3_meth.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with –fPIC
    /usr/local/openssl/lib/libssl.a: could not read symbols: Bad value
    collect2: error: ld returned 1 exit status
    make[1]: *** [libtcnative-1.la] Error 1
    make[1]: Leaving directory `/usr/local/tomcat-native-1.2.8-src/native'
    make: *** [all-recursive] Error 1
	
    用make clean删除之前的编译文件,然后再重新config,注意加-fPIC参数,会提示使用make depend,如下
    *** Because of configuration changes, you MUST do the following before
    *** building:
        make depend
5. tomcat-native安装(如果第4步不需要安装,则不需要--with-ssl参数)
tar zxf tomcat-native.tar.gz
cd tomcat-native-1.2.21-src/native
./configure --prefix=/usr/local/httpd/tomcat-native --with-apr=/usr/local/httpd/apr --with-java-home=/test/jdk --with-ssl=/usr/local/httpd/openssl && make && make install
6.  所有程序安装完成后,需要添加环境变量才能使用tomcat,地址是tomcat-native安装目录
vi ~/.bash_profile
非root用户在LD_LIBRARY_PATH最后面加上  :/usr/local/httpd/tomcat-native/lib/    加的时候一定要注意前面有个冒号
root用户如果没有LD_LIBRARY_PATH,就加一下:
LD_LIBRARY_PATH=:::::::::::::::::/usr/local/httpd/tomcat-native/lib/
export LD_LIBRARY_PATH

启动 tomcat 出现如下异常, 是 tomcat 没有找到 apr 库, 需要看看是不是环境变量设置不对
Tomcat8.x http 并发调优

启动 tomcat 出现如下异常, 有两个解决办法:

Tomcat8.x http 并发调优

———如果不使用 https, 则可以在 server.xml 关闭使用 openssl–
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
———当前自带的 openssl 不支持, 需要在上面第四步安装自定义的 openssl

2、配置文件优化

配置文件优化其实就是对 server.xml 优化,可以提大大提高 Tomcat 的处理请求的能力,下面我们来看 Tomcat 容器内的优化。
默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200),服务启动时,默认创建了 5 个空闲线程随时等待用户请求。
生产我们采用如下配置:

<Executor name="tomcatThreadPool"
              namePrefix="catalina-exec-"
              maxThreads="800"
              minSpareThreads="30"
              maxSpareThreads="60"
              maxIdleTime="60000"
              prestartminSpareThreads="true" />

线程池配置参数说明:
name                                        :    线程池名称,用于 Connector中指定。
namePrefix                               :    所创建的每个线程的名称前缀,一个单独的线程名称为 namePrefix+threadNumber。
maxThreads                             :    池中最大线程数。
minSpareThreads                     :    最小活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
maxSpareThreads                    :    最大活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
maxIdleTime                            :    线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
prestartminSpareThreads        :    启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。

    <Connector executor="tomcatThreadPool"
               port="9080"
               protocol="org.apache.coyote.http11.Http11AprProtocol"
               URIEncoding="UTF-8"
               connectionTimeout="30000"
               enableLookups="false"
               disableUploadTimeout="false"
               connectionUploadTimeout="150000"
               acceptCount="400"
               keepAliveTimeout="120000"
               maxKeepAliveRequests="1"
               compression="off"
               compressionMinSize="2048"
              compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
               redirectPort="8443"
               server="i-search"/>

Connector参数说明:
executor  : 使用的线程池名称
port      : 服务端口
protocol  : 服务使用的协议,生产使用apr协议
URIEncoding :   指定 Tomcat 容器的URL编码格式,语言编码格式
connectionTimeout  :  网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒,可根据检测实际情况,适当修改。
enableLookups :   是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false。
disableUploadTimeout : 上传时是否使用超时机制
connectionUploadTimeout : 上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
acceptCount : 指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。 一般是设置的跟 maxThreads一样或一半,此值设置的过大会导致排队的请求超时而未被处理。所以这个值应该是主要根据应用的访问峰值与平均值来权衡配置。
keepAliveTimeout : 长连接最大保持时间(毫秒),表示在下次请求过来之前,Tomcat 保持该连接多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。
maxKeepAliveRequests : 表示在服务器关闭之前,该连接最大支持的请求数。超过该请求数的连接也将被关闭,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间。
compression :  是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。
compressionMinSize  :  表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048。
compressableMimeType  : 压缩类型,指定对哪些类型的文件进行数据压缩。
server :  在response里面隐藏tomcat的服务类型

3、安全优化

a) 安装完成后立即删除webapps下面的所有代码
     rm -rf /srv/apache-tomcat/webapps/*

b) 隐藏tomcat版本
       01.首先找到这个jar包,$TOMCAT_HOME/lib/catalina.jar
       02.解压catalina.jar之后按照路径\org\apache\catalina\util\ServerInfo.properties找到文件
       03.打开ServerInfo.properties文件修改如下:把server.number、server.built置空
       04. 重新打成jar包替换

c) 隐藏tomcat的服务类型
      conf/server.xml文件中,为connector元素添加server="i-search",注意不是空字符串,是空格组成的长度为1的字符串,或者输入其他的服务类型,这时候,在response header中就没有server的信息

d) 应用程序安全
     关闭war自动部署 unpackWARs="false" autoDeploy="false"。防止被植入木马等恶意程序

二、JVM 本身优化

Tomcat 的启动参数位于安装目录 ${JAVA_HOME}/bin 目录下,Linux 操作系统就是 catalina.sh 文件。
-Xms -Xmx这2个参数是tomcat分配的内存大小,根据实际机器内存大小分配 ,且这2个大小要一样
-XX:NewSize -XX:MaxNewSize 这2个参数是须配置成和-Xmx的一半左右

CATALINA_OPTS="
-server
-Xms4096M
-Xmx4096M
-Xss512k
-XX:NewSize=2250M
-XX:MaxNewSize=2250M
-XX:MetaspaceSize=128M
-XX:MaxMetaspaceSize=256M  
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:MaxTenuringThreshold=15
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Duser.timezone=Asia/Shanghai
-Djava.awt.headless=true"


-server:一定要作为第一个参数,在多个 CPU 时性能佳,还有一种叫 -client 的模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试,在 32 位环境下直接运行 Java 程序默认启用该模式。Server 模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,在具有 64 位能力的 JDK 环境下默认启用该模式,可以不配置该参数。
-Xms:表示 Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存,导致性能大起大落,默认值为物理内存的 1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制。
-Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用 java -Xmx512M -version 命令来进行测试,然后逐渐的增大 512 的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制。
-Xss:表示每个 Java 线程堆栈大小,JDK 5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整,在相同物理内存下,减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。一般小的应用, 如果栈不是很深, 应该是128k 够用的,大的应用建议使用 256k 或 512K,一般不易设置超过 1M,要不然容易出现out ofmemory。这个选项对性能影响比较大,需要严格的测试。
-XX:NewSize:设置新生代内存大小。
-XX:MaxNewSize:设置最大新生代新生代内存大小
-XX:MetaspaceSize:设置持久代内存大小(tomcat1.8之前是-XX:PermSize)
-XX:MaxMetaspaceSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代。(tomcat1.8之前是-XX:MaxPermSize)
-XX:+AggressiveOpts:作用如其名(aggressive),启用这个参数,则每当 JDK 版本升级时,你的 JVM 都会使用最新加入的优化技术(如果有的话)。
-XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。
-XX:+DisableExplicitGC:在 程序代码中不允许有显示的调用“System.gc()”。每次在到操作结束时手动调用 System.gc() 一下,付出的代价就是系统响应时间严重降低,就和关于 Xms,Xmx 里的解释的原理一样,这样去调用 GC 导致系统的 JVM 大起大落。
-XX:+UseConcMarkSweepGC:设置年老代为并发收集,即 CMS gc,这一特性只有 jdk1.5
后续版本才具有的功能,它使用的是 gc 估算触发和 heap 占用触发。我们知道频频繁的 GC 会造面 JVM
的大起大落从而影响到系统的效率,因此使用了 CMS GC 后可以在 GC 次数增多的情况下,每次 GC 的响应时间却很短,比如说使用了 CMS
GC 后经过 jprofiler 的观察,GC 被触发次数非常多,而每次 GC 耗时仅为几毫秒。
-XX:+UseParNewGC:对新生代采用多线程并行回收,这样收得快,注意最新的 JVM 版本,当使用 -XX:+UseConcMarkSweepGC 时,-XX:UseParNewGC 会自动开启。因此,如果年轻代的并行 GC 不想开启,可以通过设置 -XX:-UseParNewGC 来关掉。
-XX:MaxTenuringThreshold:设置垃圾最大年龄。如果设置为0的话,则新生代对象不经过 Survivor 区,直接进入老年代。对于老年代比较多的应用(需要大量常驻内存的应用),可以提高效率。如果将此值设置为一 个较大值,则新生代对象会在 Survivor 区进行多次复制,这样可以增加对象在新生代的存活时间,增加在新生代即被回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。该参数只有在串行 GC 时才有效,这个值的设置是根据本地的 jprofiler 监控后得到的一个理想的值,不能一概而论原搬照抄。
-XX:+CMSParallelRemarkEnabled:在使用 UseParNewGC 的情况下,尽量减少 mark 的时间。
-XX:+UseCMSCompactAtFullCollection:在使用 concurrent gc 的情况下,防止 memoryfragmention,对 live object 进行整理,使 memory 碎片减少。
-XX:LargePageSizeInBytes:指定 Java heap 的分页页面大小,内存页的大小不可设置过大, 会影响 Perm 的大小。
-XX:+UseFastAccessorMethods:使用 get,set 方法转成本地代码,原始类型的快速优化。
-XX:+UseCMSInitiatingOccupancyOnly:只有在 oldgeneration 在使用了初始化的比例后 concurrent collector 启动收集。
-Duser.timezone=Asia/Shanghai:设置用户所在时区。
-Djava.awt.headless=true:这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的 J2EE 工程中使用一些图表工具如:jfreechart,用于在 web 网页输出 GIF/JPG 等流,在 winodws 环境下,一般我们的 app server 在输出图形时不会碰到什么问题,但是在linux/unix 环境下经常会碰到一个 exception 导致你在 winodws 开发环境下图片显示的好好可是在 linux/unix 下却显示不出来,因此加上这个参数以免避这样的情况出现。
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与 jmap -heap 中显示的 New gen 是不同的。整个堆大小 = 新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的 3/8。
-XX:CMSInitiatingOccupancyFraction:当堆满之后,并行收集器便开始进行垃圾收集,例如,当没有足够的空间来容纳新分配或提升的对象。对于 CMS 收集器,长时间等待是不可取的,因为在并发垃圾收集期间应用持续在运行(并且分配对象)。因此,为了在应用程序使用完内存之前完成垃圾收集周期,CMS 收集器要比并行收集器更先启动。因为不同的应用会有不同对象分配模式,JVM 会收集实际的对象分配(和释放)的运行时数据,并且分析这些数据,来决定什么时候启动一次 CMS 垃圾收集周期。这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100 >= Xmn 就不会出现 promotion failed。例如在应用中 Xmx 是6000,Xmn 是 512,那么 Xmx-Xmn 是 5488M,也就是老年代有 5488M,CMSInitiatingOccupancyFraction=90 说明老年代到 90% 满的时候开始执行对老年代的并发垃圾回收(CMS),这时还 剩 10% 的空间是 5488*10% = 548M,所以即使 Xmn(也就是新生代共512M)里所有对象都搬到老年代里,548M 的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的 promotion failed,因此这个参数的设置必须与 Xmn 关联在一起。
-XX:+CMSIncrementalMode:该标志将开启 CMS 收集器的增量模式。增量模式经常暂停 CMS 过程,以便对应用程序线程作出完全的让步。因此,收集器将花更长的时间完成整个收集周期。因此,只有通过测试后发现正常 CMS 周期对应用程序线程干扰太大时,才应该使用增量模式。由于现代服务器有足够的处理器来适应并发的垃圾收集,所以这种情况发生得很少,用于但 CPU情况。
-XX:NewRatio:年轻代(包括 Eden 和两个 Survivor 区)与年老代的比值(除去持久代),-XX:NewRatio=4 表示年轻代与年老代所占比值为 1:4,年轻代占整个堆栈的 1/5,Xms=Xmx 并且设置了 Xmn 的情况下,该参数不需要进行设置。
-XX:SurvivorRatio:Eden 区与 Survivor 区的大小比值,设置为 8,表示 2 个 Survivor 区(JVM 堆内存年轻代中默认有 2 个大小相等的 Survivor 区)与 1 个 Eden 区的比值为 2:8,即 1 个 Survivor 区占整个年轻代大小的 1/10。
-XX:+UseSerialGC:设置串行收集器。
-XX:+UseParallelGC:设置为并行收集器。此配置仅对年轻代有效。即年轻代使用并行收集,而年老代仍使用串行收集。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集,JDK6.0 开始支持对年老代并行收集。
-XX:ConcGCThreads:早期 JVM 版本也叫-XX:ParallelCMSThreads,定义并发 CMS 过程运行时的线程数。比如 value=4 意味着 CMS 周期的所有阶段都以 4 个线程来执行。尽管更多的线程会加快并发 CMS 过程,但其也会带来额外的同步开销。因此,对于特定的应用程序,应该通过测试来判断增加 CMS 线程数是否真的能够带来性能的提升。如果还标志未设置,JVM 会根据并行收集器中的 -XX:ParallelGCThreads 参数的值来计算出默认的并行 CMS 线程数。
-XX:ParallelGCThreads:配置并行收集器的线程数,即:同时有多少个线程一起进行垃圾回收,此值建议配置与 CPU 数目相等。
-XX:OldSize:设置 JVM 启动分配的老年代内存大小,类似于新生代内存的初始大小 -XX:NewSize。

三、Linux 系统优化

1、优化网络参数

修改文件: vi /etc/sysctl.conf

net.core.netdev_max_backlog=32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 65536


立刻生效: /sbin/sysctl -p


net.core.netdev_max_backlog:     参数net.core.netdev_max_backlog表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目,一般默认值为128(可能不同的linux系统该数值也不同)。nginx服务器中定义的NGX_LISTEN_BACKLOG默认为511。我们可以将它调整一下
net.core.somaxconn:         该参数用于调节系统同时发起的TCP连接数,一般默认值为128.在客户端存在高并发请求的情况下,该默认值较小,肯那个导致连接超时或重传问题,我们可以根据实际需要结合并发请求数来调节此值。
net.core.wmem_default:     默认的TCP数据发送窗口大小(字节)。
net.core.rmem_default:   默认的TCP数据接收窗口大小(字节)。
net.core.rmem_max :     最大的TCP数据接收窗口(字节)。
net.core.wmem_max :     最大的TCP数据发送窗口(字节)。
net.ipv4.ip_local_port_range :     表示TCP/UDP协议允许使用的本地端口号
net.ipv4.route.gc_timeout : 路由缓存刷新频率,当一个路由失败后多长时间跳到另一个路由,默认是300。
net.ipv4.tcp_fin_timeout:     对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。
net.ipv4.tcp_keepalive_time : TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。
net.ipv4.tcp_timestamps : TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项。
net.ipv4.tcp_synack_retries :tcp_synack_retries 显示或设定 Linux 核心在回应 SYN 要求时会尝试多少次重新发送初始 SYN,ACK 封包后才决定放弃。这是所谓的三段交握 (threeway handshake) 的第二个步骤。即是说系统会尝试多少次去建立由远端启始的 TCP 连线。tcp_synack_retries 的值必须为正整数,并不能超过 255。因为每一次重新发送封包都会耗费约 30 至 40 秒去等待才决定尝试下一次 重新发送或决定放弃。tcp_synack_retries 的缺省值为 5,即每一个连线要在约 180 秒 (3 分钟) 后才确定逾时.
net.ipv4.tcp_syn_retries :         对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)
net.ipv4.tcp_tw_recycle : 能够更快地回收TIME-WAIT套接字。
net.ipv4.tcp_tw_reuse : 表示是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接 。
net.ipv4.tcp_mem : 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。
net.ipv4.tcp_max_orphans :     该参数用于设定系统中最多允许存在多少tcp套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,没有与用户文件句柄关联的tcp套接字符将立即被复位,同时给出警告信息。这个限制只是为了防止简单的DoS工具。一般在系统内存比较充足的情况下,可以增大这个参数的赋值
net.ipv4.tcp_max_syn_backlog:  记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。一般在系统内存比较充足的情况下,可以增大这个参数的赋值

2、优化用户进程数和最大文件打开数量
安通过下面命令可看到目前每个进程打开的文件数量
lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more

------------------------1--------------------------------
vi /etc/security/limits.conf

 *   soft noproc  20480
 *   hard noproc  20480  
 *   soft nofile  100000  
 *   hard nofile  100000
 
 * 代表针对所有用户
noproc 是代表最大进程数
nofile 是代表最大文件打开数

------------------------2--------------------------------
vi /etc/profile

 ulimit -u 20480
 ulimit -n 100000
 ulimit -d unlimited  
 ulimit -m unlimited  
 ulimit -s unlimited  
 ulimit -t unlimited  
 ulimit -v unlimited

立刻生效: source /etc/profile

------------------------3--------------------------------
vi /etc/security/limits.d/20-nproc.conf

*    soft nproc 100000
root soft nproc unlimited