[转帖]限制内核 udp bad checksum 失败告警信息

限制,内核,udp,bad,checksum,失败,告警信息 · 浏览次数 : 0

小编点评

**解决方法:** 1. **修改 `net.core.message_cost` 和 `net.core.message_burst` 中的数值,降低限速值。** 2. **使用 `sysctl` 命令设置 `net.core.message_cost` 和 `net.core.message_burst` 的值。** 3. **使用 `proc` 文件操作设置 `net.core.message_cost` 和 `net.core.message_burst` 的值。** **注意:** * 使用 `sysctl` 命令设置限速值可能会影响系统的性能,因此请在进行限速配置之前测试其性能。 * 使用 `proc` 文件操作设置限速值可能会更易于管理,但它可能对系统性能略有影响。

正文

问题描述

某系统 dmesg 信息中有如下内容频繁打印,冲掉了其它相关的信息,需要限制打印。

UDP: bad checksum. From 10.66.245.93:61525 to 255.255.255.255:137 ulen 58

    相关代码

    内核源码树中的文件名:

    net/ipv4/udp.c 
    

      相关源码:

      csum_error:
              /*
               * RFC1122: OK.  Discards the bad packet silently (as far as
               * the network is concerned, anyway) as per 4.1.3.4 (MUST).
               */
              net_dbg_ratelimited("UDP%s: bad checksum. From %pI4:%u to %pI4:%u ulen %d\n",
                                  proto == IPPROTO_UDPLITE ? "Lite" : "",
                                  &saddr, ntohs(uh->source), &daddr, ntohs(uh->dest),
                                  ulen);
      

        这部分功能为,内核检验报文的 checksum 失败,丢弃报文并打印警告。问题的原因可能是网络链路存在问题导致有错包出现。

        从功能上说,这个属于异常告警,直接关闭显然不太合理,但是系统中一直打印这些信息加之 dmesg 使用环形缓冲区,一些有用的内核打印信息会被这个信息冲掉,为此需要进行处理。

        如何限制打印?

        从上文的源代码中可以看出,内核调用了 net_dbg_ratelimited 函数来打印这个告警信息,net_dbg_ratelimited 函数本身就有限速的功能,但是这个限速明显不符合我们的要求,如果能够提高限速,或许能够解决我们的问题。

        从 net_dbg_ratelimited 函数的实现着手

        linux-5.x 内核代码中,net_dbg_ratelimited 函数实现代码如下:

        #if defined(CONFIG_DYNAMIC_DEBUG) || \
        	(defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))
        #define net_dbg_ratelimited(fmt, ...)					\
        do {									\
        	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);			\
        	if (DYNAMIC_DEBUG_BRANCH(descriptor) &&				\
        	    net_ratelimit())						\
        		__dynamic_pr_debug(&descriptor, pr_fmt(fmt),		\
        		                   ##__VA_ARGS__);			\
        } while (0)
        #elif defined(DEBUG)
        #define net_dbg_ratelimited(fmt, ...)				\
        	net_ratelimited_function(pr_debug, fmt, ##__VA_ARGS__)
        #else
        #define net_dbg_ratelimited(fmt, ...)				\
        	do {							\
        		if (0)						\
        			no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
        	} while (0)
        #endif
        

          我们的系统中开启了 CONFIG_DYNAMIC_DEBUG 内核配置,这里只需要考虑第一种情况。根据代码能够将问题缩小到 net_ratelimit 函数中。

          net_ratelimit 函数源码如下:

          DEFINE_RATELIMIT_STATE(net_ratelimit_state, 5 * HZ, 10);
          /*
           * All net warning printk()s should be guarded by this function.
           */
          int net_ratelimit(void)
          {
                  return __ratelimit(&net_ratelimit_state);
          }
          EXPORT_SYMBOL(net_ratelimit);
          

            net_ratelimit_state 为内核向用户态导出的可配置接口,它在 net_core_table ctl_table 中的定义如下:

                    {
                            .procname       = "message_cost",
                            .data           = &net_ratelimit_state.interval,
                            .maxlen         = sizeof(int),
                            .mode           = 0644,
                            .proc_handler   = proc_dointvec_jiffies,
                    },
                    {
                            .procname       = "message_burst",
                            .data           = &net_ratelimit_state.burst,
                            .maxlen         = sizeof(int),
                            .mode           = 0644,
                            .proc_handler   = proc_dointvec,
                    },
            

              我们可以通过修改 net.core.message_cost 与 net.core.message_burst 来完成限速功能。

              实现限速的两种方式

              上文已经描述了 net_dbg_ratelimited 的主要实现,根据内核代码,可以使用如下两种方式来配置限速:

              1. 使用 sysctl -w 来设置

                相关的项目如下:

                [root] #$ sysctl -a  | grep net.core.message 
                net.core.message_burst = 10
                net.core.message_cost = 5
                
                • 1
                • 2
                • 3
              2. 通过 proc fs 来设置

                相关文件如下:

                /proc/sys/net/core/message_burst
                /proc/sys/net/core/message_cost
                
                • 1
                • 2
              文章知识点与官方知识档案匹配,可进一步学习相关知识
              网络技能树首页概览24206 人正在系统学习中

              与[转帖]限制内核 udp bad checksum 失败告警信息相似的内容:

              [转帖]限制内核 udp bad checksum 失败告警信息

              问题描述 某系统 dmesg 信息中有如下内容频繁打印,冲掉了其它相关的信息,需要限制打印。 UDP: bad checksum. From 10.66.245.93:61525 to 255.255.255.255:137 ulen 58 相关代码 内核源码树中的文件名: net/ipv4/udp

              [转帖]Linux内核参数net.ipv4.ip_local_port_range对服务器连接数影响的正确解释

              首先明确一下该参数的意义:net.ipv4.ip_local_port_range表示本机作为客户端对外发起tcp/udp连接时所能使用的临时端口范围。 对于TCP连接,本机所能发起的tcp连接数受四元组(源地址*源端口*目标地址*目标端口)限制。 而对于UDP连接,本机所能发起的udp连接数则受二

              [转帖]fs-max、file-nr和nofile的关系

              fs-max、file-nr和nofile的关系 1. file-max /proc/sys/fs/file-max: 这个文件决定了系统级别所有进程可以打开的文件描述符的数量限制,如果内核中遇到VFS: file-max limit reached的信息,那么就提高这个值。 设置

              [转帖]fs-max、file-nr和nofile的关系

              fs-max、file-nr和nofile的关系 1. file-max /proc/sys/fs/file-max: 这个文件决定了系统级别所有进程可以打开的文件描述符的数量限制,如果内核中遇到VFS: file-max limit reached的信息,那么就提高这个值。 设置

              [转帖]fs-max、file-nr和nofile的关系

              https://www.cnblogs.com/ermazi/p/7843632.html 1. file-max /proc/sys/fs/file-max:这个文件决定了系统级别所有进程可以打开的文件描述符的数量限制,如果内核中遇到VFS: file-max limit rea

              [转帖]linux中内核的一个不错的参数somaxconn

              最近发现很多内核优化参数都记不住了,写下文章来备记,方便以后查看. 编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) #设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数) net.ipv4.ip_conntrack_max = 25000000 #最大

              [转帖]Docker系列--Docker设置系统资源限制及验证

              https://www.cnblogs.com/caijunchao/p/13415386.html 1、限制容器的资源 默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源。Docker提供了控制容器可以使用多少内存或CPU的方法,设置docker run命令的运行时配置

              [转帖]一文解决内核是如何给容器中的进程分配CPU资源的?

              https://zhuanlan.zhihu.com/p/615570804 现在很多公司的服务都是跑在容器下,我来问几个容器 CPU 相关的问题,看大家对天天在用的技术是否熟悉。 容器中的核是真的逻辑核吗? Linux 是如何对容器下的进程进行 CPU 限制的,底层是如何工作的? 容器中的 thr

              [转帖]Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南

              https://zhuanlan.zhihu.com/p/417472115 什么是cgroup? cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等)。 什么是Docker资源限制? 默

              [转帖]docker 容器基础技术:linux cgroup 简介

              https://cizixs.com/2017/08/25/linux-cgroup/ Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、