zoukankan      html  css  js  c++  java
  • Centos内核参数优化(大并发)

    众所周知在默认参数情况下linux对高并发支持并不友好,主要受限于单进程最大打开文件数限制,内核tcp参数方面和io时间分配机制等,下面从几个方面来调整是linux系统能够支持高并发环境。

    1.iptables相关

      如非必要,关掉或卸载iptables防火墙,并阻止kernel加载iptables模块。这些会影响并发性。

    2.单进程打开文件数限制

      一般发行版,限制单进程最大可以打开1024个文件,这是远远不能满足高并发需求的,调整过程如下:

      ulimit -n 查询当前数值,ulimit -n 65535设为最大值

      如果输出“Operationnotpermitted”之类,说明修改失败,实际上是因为指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制,因此就需要修改Linux系统对用户关于打开文件数的软限制和硬限制。

      第一步修改limits.conf,并添加

      

       其中*号表示修改所有用户限制,soft或hard指定要修改软限制或硬限制;65536则指定了想要修改的新的限制,即最大打开文件数(请注意软限制要小于或等于硬限制)。修改完保存文件。

      第二步修改/etc/pam.d/login文件,在文件中添加如下行:

      

       这是告诉Linux在用户完成系统登录后,在应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改后保存此文件。

      第三步查看linux系统级的最大打开文件数限制,使用如下命令:

      cat/proc/sys/fs/file-max

      输出:ex:32568

      这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件总和)32568个文件,是linux系统的硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制。修改此限制的方法是修改/etc/sysctl.conf文件内fs.file-max=131072,这是让linux启动后强行将系统级打开文件数硬限制设置为131072。修改完成后保存文件。

      完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。如果重启后用ulimit -n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit -n命令已经将用户可同时打开文件数做了限制。由于通过ulimit -n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次ulimit -n设置的值,因此想用此命令增大这个限制值是不可能的。所以如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查询是否使用了ulimit -n限制了用户可同时打开的最大文件数量,如果找到,则需要删除这条命令,或者将其改为合适的值,然后保存文件用户退出并重启。

      通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的限制。

    3.内核TCP参数方面

      Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我么可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

      下面介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以试用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,输入一面的组合命令查看当前TCP连接的状态和对应的连接数量:

      netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

      

       我们只用关心TIM_EWAIT的个数,在这个可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65536个,占用一个少一个,严重的影响到后继的新连接。这种情况下,我们就有必要调整下linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

      编辑配置文件:/etc/sysctl.conf,这这个文件中,修改或加入下面的几行内容:

      vim /etc/sysctl.conf

      net.ipv4.tcp_syncookies=1   #表示开启syncookies。当出现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表示关闭。

      net.ipv4.tcp_fin_timeout=30  #修改系统默认的TIMEOUT时间

      保存关闭输入sysctl-p使修改生效

      在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的Dos、CC、SYN攻击。

      此外,如果你的连接数本身就很多,我们可以在优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,修改或加入下面这些配置

      net.ipv4.tcp_keepalive_time=1200     #表示当keepalive起用的时候,tcp发送keepalive消息的频度。缺省是2小时,改为20分钟。

      net.ipv4.ip_local_port_range=1024 65535 #表示用于向外的连接的端口范围。缺省值默认的情况下很小

      net.ipv4.tcp_max_syn_backlog=8192   #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

      net.ipv4.tcp_max_tw_buckets=5000   #表示系统同时保持TIME_WAIT的最大数量,如果超出这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认180000,改为5000,此项参数可以控制TIME_WAIT的最大数量。

      保存关闭输入sysctl-p使修改生效

    4.内核其他参数说明

      net.ipv4.tcp_max_syn_backlog= 65536 #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128

      net.core.netdev_max_backlog= 32768 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

      net.core.somaxconn= 32768 #例如web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

      net.core.wmem_default= 8388608

      net.core.rmem_default= 8388608

      net.core.rmem_max= 16777216 #最大socketbuffer,可参考的优化值:873200

      net.core.wmem_max= 16777216 #最大socketbuffer,可参考的优化值:873200

      net.ipv4.tcp_timestsmps= 0 #时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

      net.ipv4.tcp_synack_retries= 2 #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYNACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

      net.ipv4.tcp_syn_retries= 2 #在内核放弃建立连接之前发送SYN包的数量。

      #net.ipv4.tcp_tw_len= 1

      net.ipv4.tcp_tw_reuse= 1 #开启重用。允许将TIME-WAITsockets重新用于新的TCP连接。

      net.ipv4.tcp_wmem= 8192 436600 873200 #TCPbuffer,可参考的优化值:8192 436600 873200

      net.ipv4.tcp_rmem = 32768 436600 873200 #TCPbuffer,可参考的优化值:32768 436600 873200

       net.ipv4.tcp_mem= 94500000 91500000 92700000

       #同样有3个值,意思是:

      #net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。

      #net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。

      #net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket

      #上述内存单位是页,而不是字节。可参考的优化值是:7864321048576 1572864

       net.ipv4.tcp_max_orphans= 3276800

      #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,连接将即刻被复位并打印出警告信息,这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)

      net.ipv4.tcp_fin_timeout= 30

      #如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

      同时还涉及了一个TCP拥塞算法的问题,你可以用以下的命令去查看本机提供的拥塞算法控制模块:

      sysctl net.ipv4.tcp_available_congestion_control

      #对于几种算法的分析,详情可以参考下:TCP拥塞控制算法的优缺点、适用环境、性能分析,比如高延时可以试用hybla,中等延时可以试用htcp算法等。

      net.ipv4.tcp_congestion_control=hybla #如果想设置TCP 拥塞算法为hybla

      net.ipv4.tcp_fastopen= 3 #额外的,对于内核版高于于3.7.1的,我们可以开启tcp_fastopen

    5.IO时间分配机制

      在linux启动高并发Tcp连接,必须确认应用程序是否使用了合适的网络I/O技术和I/O时间分派机制。可用的I/O技术有同步I/O,非阻塞式同步I/O,以及异步I/O。在高并发的情况下,如果使用同步I/O,这会严重阻塞程序的运转,除非为每个TCP连接的I/O创建一个线程。但是过多的线程又会因系统对线程的调度造成巨大开销。

      因此在高并发的情况下使用同步I/O是不可取的,这是可以考虑使用非阻塞是同步I/O或异步I/O。非阻塞是同步I/O的技术包括使用select(),poll(),epoll等机制。异步I/o的技术就是使用AIO。从I/O事件分派机制来看,使用select()是不合适的,因为它所支持的并发连接数有限制(通常是1024个)。如果考虑性能,poll()也是不合适的,尽管它可以支持较高的tcp并发数,但是由于其采用“轮询”机制,当并发数较高时,其运行效率相当低,并可能存在I/O事件分派不均,导致部分TCP连接上的I/O出现“饥饿”现象。

      而如果使用epoll或AIO,则没有上述问题(早期linux内核的AIO技术实现是通过在内核中为每个I/O请求创建一个线程来实现,这种实现机制在高并发TCP的情形下使用其实也有严重的性能问题,但在新的Linux内核中,AIO的实现已经得到改进)。

      综上所述,在开发支持高并发TCP连接的linux应用程序时,应尽量使用epoll或AIO技术来实现并发的TCP连接上的I/O控制,这将为提升程序对高并发TCP连接的支持提供有效的I/O保证。

      经过这样的优化配置之后,服务器的TCP并发处理能力会显著提高。以上配置仅供参考,用于生产环境请根据自己的实际情况调整观察再调整。

    6.安装大数据组件环境基础优化

    1. 系统盘raid1,存储盘raid0,hdfs三备份不用raid造成冗余,若对元数据安全系数特别高,namenode元数据所在磁盘可做raid1双备份。
    2. 关闭硬件节能模式(bios)
    3. 双网卡模式选择bound6(平衡负载)
    4. 存储盘多块,减少磁盘IO
    5. 禁用swap
    6. 时间同步
    7. 关闭selinux
    8. 关闭防火墙iptables
    9. root启动的单一进程的最大可以打开的文件数设置为65535个(ulimitn 65535

    返回目录

  • 相关阅读:
    Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
    Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途
    Atitit 图像处理 灰度图片 灰度化的原理与实现
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    Atitit 实现java的linq 以及与stream api的比较
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库
    Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结
    Atitit apache 和guava的反射工具
    atitit。企业的价值观 员工第一 vs 客户第一.docx
  • 原文地址:https://www.cnblogs.com/dan2/p/12607514.html
Copyright © 2011-2022 走看看