• socket连接No buffer space available


    socket连接No buffer space available的问题,导致接口大面积调用失败

     原因:系统并发过大,连接数过多,部分socket连接无法释放关闭,而持续请求又导致无法释放的socket连接不断积压,最终导致No buffer space available。

    输入netstat -an,发现存在大量处于TIME_WAIT状态的TCP连接,也就是之前提到的未释放的socket连接,并且server端口在不断变化

    对于大型的应用,访问量较高,一台Server往往不能满足服务需求,这时就需要多台Server共同对外提供服务。如何充分、最大的利用多台Server的资源处理请求,这时就需要请求调度,将请求合理均匀的分配到各台Server。

                  LVS结构示意图

    从LVS结构示意图中可以看出,Load Balancer到后端Server的IP的数据包的 源IP地址都是一样(Load Balancer的IP地址和Server 的IP地址属于同一网段),而客户端认为服务是来自一个IP地址(实际上就是Load Balancer的IP),频繁的TCP连接建立和关闭,使得Load Balancer到后端Server的TCP连接会受到限制,导致在server上留下很多处于TIME_WAIT状态的连接,而且这些状态对应的远程IP地址都是Load Balancer的。Load Balancer的端口最多也就60000多个(2^16=65536,1~1023是保留端口,还有一些其他端口缺省也不会用),每个Load Balancer上的端口一旦进入 Server的TIME_WAIT黑名单,就有240秒不能再用来建立和Server的连接,这样Load Balancer和Server的连接就很有限。所以我们看到了使用netstat -an命令查看网络连接状况时同一个 remote IP会有很多端口。

    从系统层面上看,系统socket连接数设置不合理,socket连接数过小,易达到上限;其次是2MSL设置过长,容易积压TIME_WAIT状态的TCP连接。

     

    解决办法是修改Linux内核参数,

    修改系统socket最大连接数,在文件/etc/security/limits.conf最后加入下面两行:

    * soft nofile 32768

    * hard nofile 32768

    或者缩小2MSL的时长、允许重用处于TIME_WAIT状态的TCP连接、快速回收处于 TIME_WAIT状态的TCP连接,修改/etc/sysctl.conf,添加如下几行:

     

    #改系統默认的TIMEOUT时间
    net.ipv4.tcp_fin_timeout=2

    #启重用,允许将TIME_WAIT sockets重新用于新的TCP连接 默认为0表示关闭
    net.ipv4.tcp_tw_reuse=1

    #开启TCP连接中TIME_WAIT sockets的快速回收 默认为0 表示关闭
    net.ipv4.tcp_tw_recycle=1

     

    上面这些参数根据实际情况进行配置。

     

    l 从LVS 层面上看,调度算法不合理,导致请求过多分配到某一台服务器上。

     

    解决办法,根据实际情况指定合理的负载均衡解决方案。

     

    l 从安全层面上看,当服务器遭到DDoS(拒绝服务攻击)时,服务器大量积压TIME_WAIT状态的TCP连接而无法向外提供服务。

     

    解决办法,加强安全防护。

     

  • 相关阅读:
    [ios]总结iOS开发当中一些特别注意的问题 【转】
    [ios]Core Data
    [ios]图片转pdf 【转】
    rsync服务的安装与配置
    c# winform及DotnetBar笔记
    我恨博客园
    C#日期格式化(ASP.NET)
    c# winform DatagridView使用总结
    .net2.0数据绑定语法
    div代替window.alert,让这个div显示信息后,在指定之间时间内消失
  • 原文地址:https://www.cnblogs.com/mabiao008/p/12811789.html
Copyright © 2020-2023  润新知