zoukankan      html  css  js  c++  java
  • orphan sockets

    orphan sockets

    介绍一下什么是 orphan sockets,简单来说就是该 socket 不与任何一个文件描述符相关联。例如,当应用调用 close() 关闭一个链接时,此时该 socket 就成为了 orphan,但是该 sock 仍然会保留一段时间,直到最后根据 TCP 协议结束。

    实际上 orphan socket 对于应用来说是无用的,因此内核希望尽可能减小 orphan 的数量。对于像 http 这样的短请求来说,出现 orphan 的概率会比较大。

    对于系统允许的最大 orphan 数量,以及当前的 orphan 数量可以通过如下方式查看:

    $ cat /proc/sys/net/ipv4/tcp_max_orphans
    32768
    $ cat /proc/net/sockstat
    ... ...
    TCP: inuse 37 orphan 14 tw 8 alloc 39 mem 9
    ... ...

    你可能会发现,sockstat 中的 orphan 数量要远小于 tcp_max_orphans 的数目。

    实际上,可以从代码中看到,实际会有个偏移量 shift,该值范围为 [0, 2] 。

    static inline bool tcp_too_many_orphans(struct sock *sk, int shift)
    {
        struct percpu_counter *ocp = sk->sk_prot->orphan_count;
        int orphans = percpu_counter_read_positive(ocp);
    
        if (orphans << shift > sysctl_tcp_max_orphans) {
            orphans = percpu_counter_sum_positive(ocp);
            if (orphans << shift > sysctl_tcp_max_orphans)
                return true;
        }
        return false;
    }

    也就是说,在某些场景下会对 orphan 做些惩罚,将 orphan 的数量 2x 甚至 4x,这也就解释了上述的问题。

    如果是这样,那么就可以根据具体的情况,将 tcp_max_orphans 值适当调大

  • 相关阅读:
    springboot小技巧(转)
    spring boot项目如何测试,如何部署
    thymeleaf模板的使用(转)
    springboot+多数据源配置
    springboot+shiro
    springboot+jpa+thymeleaf增删改查的示例(转)
    SpringBoot ( 七 ) :springboot + mybatis 多数据源最简解决方案
    tcpdump查看某个端口数据
    oracle完全删除表空间
    检测python进程是否存活
  • 原文地址:https://www.cnblogs.com/codestack/p/11152252.html
Copyright © 2011-2022 走看看