Linux内核Backlog笔记

2023-10-26

一。listen方法传入的backlog参数,net.core.somaxconn

这个参数具体意义,先看看Linux Socket的listen解释

man listen

   #include <sys/socket.h>

   int listen(int sockfd, int backlog);

int类型的backlog参数,listen方法的backlog意义为,已经完成三次握手、已经成功建立连接的套接字将要进入队列的长度。

backlog的定义

Now it specifies the queue length for completely established sockets waiting to be accepted,

instead of the number of incomplete connection requests. The maximum length of the queue

for incomplete sockets can be set using the tcp_max_syn_backlog sysctl. When syncookies

are enabled there is no logical maximum length and this sysctl setting is ignored.

If the socket is of type AF_INET, and the backlog argument is greater than the constant SOMAXCONN

(128 default), it is silently truncated to SOMAXCONN.

net.core.somaxconn 它是listen的第二个参数int backlog的上限值。

 

全连接队列的最大长度:

backlog保存的是完成三次握手、等待accept的全连接,而不是半连接。

负载不高时,backlog不用太大。(For complete connections)

系统最大的、未处理的全连接数量为:min(backlog, somaxconn),net.core.somaxconn默认为128。

这个值最终存储于sk->sk_max_ack_backlog。

 

半连接队列的最大长度:

tcp_max_syn_backlog默认值为256。(For incomplete connections)

当使用SYN Cookie时,这个参数变为无效。

半连接队列的最大长度为backlog、somaxconn、tcp_max_syn_backlog的最小值。


一般我们自己定义设定backlog值,若我们设置的backlog值大于net.core.somaxconn值,将被置为net.core.somaxconn值大小。若不想直接硬性指定,跟随系统设定,则需要读取/proc/sys/net/core/somaxconn。

net\Socket.c :

/*
 *  Perform a listen. Basically, we allow the protocol to do anything
 *  necessary for a listen, and if that works, we mark the socket as
 *  ready for listening.
 */

int sysctl_somaxconn = SOMAXCONN;

asmlinkage long sys_listen(int fd, int backlog)
{
    struct socket *sock;
    int err, fput_needed;

    if ((sock = sockfd_lookup_light(fd, &err, &fput_needed)) != NULL) {
        if ((unsigned) backlog > sysctl_somaxconn)
            backlog = sysctl_somaxconn;

        err = security_socket_listen(sock, backlog);
        if (!err)
            err = sock->ops->listen(sock, backlog);

        fput_light(sock->file, fput_needed);
    }
    return err;
}

比如经常使用的netty(4.0)框架,在Linux下启动时,会直接读取/proc/sys/net/core/somaxconn值然后作为listen的backlog参数进行调用Linux系统的listen进行初始化等。

int somaxconn = 3072;
BufferedReader in = null;
try {
    in = new BufferedReader(new FileReader("/proc/sys/net/core/somaxconn"));
    somaxconn = Integer.parseInt(in.readLine());
    logger.debug("/proc/sys/net/core/somaxconn: {}", somaxconn);
} catch (Exception e) {
    // Failed to get SOMAXCONN
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (Exception e) {
            // Ignored.
        }
    }
}

SOMAXCONN = somaxconn;
......
private volatile int backlog = NetUtil.SOMAXCONN;

一般稍微增大net.core.somaxconn值就显得很有必要。

设置其值方法:

sysctl -w net.core.somaxconn=65535

较大内存的Linux,65535数值一般就可以了。

若让其生效,sysctl -p 即可,然后重启你的Server应用即可。

二。网卡设备将请求放入队列的长度,netdev_max_backlog

内核代码中sysctl.c文件解释:

number of unprocessed input packets before kernel starts dropping them, default 300

我所理解的含义,每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的最大数目,一旦超过将被丢弃。

所起作用处,net/core/Dev.c:

int netif_rx(struct sk_buff *skb)
{
    struct softnet_data *queue;
    unsigned long flags;

    /* if netpoll wants it, pretend we never saw it */
    if (netpoll_rx(skb))
        return NET_RX_DROP;

    if (!skb->tstamp.off_sec)
        net_timestamp(skb);

    /*
     * The code is rearranged so that the path is the most
     * short when CPU is congested, but is still operating.
     */
    local_irq_save(flags);
    queue = &__get_cpu_var(softnet_data);

    __get_cpu_var(netdev_rx_stat).total++;
    if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
        if (queue->input_pkt_queue.qlen) {
enqueue:
            dev_hold(skb->dev);
            __skb_queue_tail(&queue->input_pkt_queue, skb);
            local_irq_restore(flags);
            return NET_RX_SUCCESS;
        }

        netif_rx_schedule(&queue->backlog_dev);
        goto enqueue;
    }

    __get_cpu_var(netdev_rx_stat).dropped++;
    local_irq_restore(flags);

    kfree_skb(skb);
    return NET_RX_DROP;
}

以上代码看一下,大概会明白netdev_max_backlog会在什么时候起作用。

http://blog.csdn.net/zhangskd/article/details/14446581

http://www.blogjava.net/yongboy/archive/2014/07/30/416373.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核Backlog笔记 的相关文章

随机推荐

  • godaddy服务器内网站转移,2021年Godaddy最新域名转出教程

    因为之前Goddady登录界面修改的原因 导致部分新手不知道Godaddy域名转出步骤 笔者特此做了一个简单的教程 供大家学习和参考 第一步 打开Godaddy官网 登录Godaddy账户 然后点击页面右侧的My Account 进入账号管
  • 实战HttpClient 接口调用以及获取token 设置请求头

    简介 HTTP 协议可能是现在 Internet 上使用得最多 最重要的协议了 越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源 虽然在 JDK 的 java net 包中已经提供了访问 HTTP 协议的基本功能 但
  • CrashImmuneDecoder类关系分析(HardwareVideoDecodeSDK)

    关于此项目github地址 https github com shyluo CrashImmuneDecoder 为了以后快速的熟悉老罗大神的视频硬解SdK 画了以下类关系图 画的不好 请见谅
  • VS2019+msys2编译ffmpeg

    最近在学习音视频相关开发技术 第一步是搭建开发环境 通过参考网上查到的资料结合实际情况 最终将ffmpeg编译通过 并支持x264 x265 fdk aac 在这里将具体的操作过程记录下来 方便以后参考 目录 1 下载VS2019社区版本
  • 【平衡小车】学习日志(八)

    任务 基于之前PID算法编写小车的可运动可平衡控制的功能代码 Control 基于之前完成的PID控制算法 修改部分编写 直立环 速度环 转向环 的控制函数 1 在Control c修改PID控制函数 直立环PD控制 直立环PD控制 参数1
  • 学机器人编程好还是学计算机编程好

    学机器人编程好还是学计算机编程好 小孩的学习一直都是家长们非常关心和重视的一件事 很多的家长在培养孩子的学习的时候 会给孩子选择一些能够有利于孩子成长的课程 就很多的家长想要孩子去学习机器人编程的课程来说 他们对于学机器人编程好还是学计算机
  • java使用POI读写Excel

    前期准备 到官网下载pol的jar包 https poi apache org 导入项目所依赖的jar包 注 这几个一个都不能少 不然会报些奇怪的错 代码 使用POI读取Excel并输出 import java io IOException
  • iOS开发之高级视图—— UITableView(一)简单例子

    表视图继承自UIScrollView 这样的继承关系使得表视图可以实现上 下滚动 UITableView需要实现的两个协议如下 UITableViewDatasource 实例化表视图时 必须采用该方法来实现数据源的配置 UITableVi
  • win8/win10操作系统如何通过Legacy BIOS与UEFI两种模式安装

    感谢联想的工程师 Win8系统相对于Win7系统在开机速度上有相当大的提升 这是因为Win8系统为了提升系统性能和对硬件的优化 加入了诸如开机引导及应用预缓存等技术 而其中的UEFI BIOS引导 则能使平台开机更智能 开机速度更快 对比采
  • java中Math,Systerm,Object,Integer类中的一些常见方法

    一 Math类 int abs int 返回绝对值 double ceil double 向上取整 double floor double 向下取整 int round float 四舍五入取整 int max int m int n 返回
  • Springboot 之 JDBC 多数据源实现

    简介 Springboot 中使用 JdbcTemplate 实现多数据源比较简单 查看 JdbcTemplate 源码 可以发现 JdbcTemplate 提供了传入 DataSource 的方式构建不同的 JdbcTemplate 实例
  • Elasticsearch(六)--ES文档的操作(中)---修改文档

    一 前言 上篇文章我们了解了ES的插入和批量插入文档的操作 分别通过ES的kibana客户端以及Java高级Rest客户端进行学习 那么本篇则进入到对文档的修改操作 同新增文档 也有更新单条文档和批量更新文档操作 但还多出一个根据条件更新文
  • Jlink使用技巧之烧写SPI Flash存储芯片

    文章目录 前言 准备 硬件连接 1 打开 2 连接SPI Flash芯片 3 打开程序文件 4 下载 5 程序文件的读取 6 程序文件的保存 7 命令行工具的使用 支持的芯片列表 速度说明 参考资料 JLink软件的下载 前言 大多数玩单片
  • 【异步编程】Promise

    Promise的基本用法 创建promise对象 Promise对象代表一个异步操作 有三种状态 pending 进行中 fulfilled 已成功 和rejected 已失败 Promise构造函数接受一个函数作为参数 该函数的两个参数分
  • Linux基础命令-正则表达式和通配符

    Linux基础命令 正则表达式和通配符 正则表达式和通配符 一 正则表达式 1 正则表达式概念 2 字符匹配 3 匹配次数 4 位置锚定 5 分组 6 后向引用 7 扩展正则表达式 二 通配符 1 通配符 2 Shell常见通配符 3 sh
  • python中类的self的含义

    import torch 省略部分代码 网络模型 预测部分 class Net1 def init self input test self inputn test scaler1 transform input test self inp
  • 排序算法之快速排序及其C语言代码实现

    概述 快速排序 Quicksort 是对冒泡排序的一种改进 快速排序由C A R Hoare在1962年提出 它的基本思想是 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据都要小 然后再按此方法对
  • IDA工具安装、分享

    往期推荐 ARM处理器寻址方式 ARM指令集 ARM汇编语言程序结构 Android与ARM处理器 IDA工具被称之为是世界顶级的交互汇编 掌握IDA工具界面上的快捷功能 导航条主界面功能以及汇编窗口常用快捷键的使用 实战分析 了解ARM指
  • 接口一定要实现序列化Serializable吗?

    背景 最近在做项目的过程中 发现一个问题 我们服务之间调用的feign接口及对外提供的接口 里面的对象都实现了序列化 但是以前我们的对外接不写序列化 也没有啥问题 在这里的时候 就有点疑惑 1 为什么要进行序列化 2 每个实体bean都必须
  • Linux内核Backlog笔记

    一 listen方法传入的backlog参数 net core somaxconn 这个参数具体意义 先看看Linux Socket的listen解释 man listen include