首页 > 其他分享 >从k8s容器丢包事件中掌握内核参数优化技巧

从k8s容器丢包事件中掌握内核参数优化技巧

时间:2024-07-27 15:29:35浏览次数:11  
标签:丢包 容器 队列 SYN 内核 somaxconn k8s 连接

引言

    在k8s的使用场景中,容器不是仅仅能运行就算ok,往往还需要进行容器的内核参数优化和应用程序参数的调优,如在高并发的业务场景下,运行一个java程序,我们不仅需要对其JVM参数进行调优,而且需要对其所在的容器进行内核参数优化,这篇文章主要通过一次容器丢包事件介绍容器中内核参数优化的方法。

背景 

     线上业务反馈接口偶发性返回502状态码,从请求日志和监控系统看,有好几个微服务的接口都有出现,期间容器资源使用率平稳并无异常,而502的发生主要聚焦在业务高峰阶段,所以暂时排除了是微服务性能问题,优先尝试通过压测的方式在非生产环境复现。

请求链路 

为了方便复现,将pod设置为单副本,链路大致如下:

client --> ingress --> service --> pod

排查与分析过程 

1、使用ab压测,设置请求数50000,并发数200,未能复现;

2、尝试增加并发数至500时,502的场景复现了,起初怀疑是conntrack table满了,但通过dmesg和conntrack -S查看并无异常;

3、经过一顿排查,最终通过下面的指令定位到容器的半连接队列满了,导致请求被丢弃

netstat -st | egrep -i "drop|reject|overflowed|listen|filter|TCPSYNChallenge"

图片

 知识点插播

1、排查与分析过程中用到的netstat指令的作用是什么?

打印包含上述关键词相关的 TCP 统计信息,帮助我们快速定位和分析网络问题,如丢包、连接被拒绝、缓冲区溢出、监听端口状态、包过滤情况以及 TCP SYN 挑战等。

  • drop:表示丢弃的数据包,可能由于网络拥塞或错误配置导致。

  • reject:表示被拒绝的数据包,通常是因为防火墙规则或访问控制列表(ACL)拒绝了这些连接。

  • overflowed:表示溢出的数据包,可能是由于缓冲区或队列满了,导致无法处理更多的数据包。

  • listen:表示监听的端口和连接,通常用于显示服务器正在监听的端口和等待连接的数量。

  • filter:表示过滤的统计信息,通常与防火墙或包过滤器相关。

  • TCPSYNChallenge:表示 TCP SYN 挑战包的统计信息,用于防止 SYN flood 攻击的一种保护机制。

2、什么是半连接队列/长连接队列?二者之间的区别又在哪?

如图所示,一个完整的TCP连接的建立,会经历一次3次握手,两个状态:SYN_REVD、ESTABELLISHED,而操作系统中用来存放他们的,我们称之为队列,即

半连接队列:存放SYN的队列

全连接队列:存放已经完成连接的队列

图片

3、半连接队列/长连接队列的长度跟哪些内核参数有关?

半连接队列:长度为net.core.somaxconn、tcp_max_syn_backlog的最小值

全连接队列:长度为net.core.somaxconn的值。

    其中tcp_max_syn_backlog的值并未定义,而net.core.somaxconn的默认值为128,一般我们可以调整net.core.somaxconn的值来增加队列的长度。

问题优化

    在Pod中并不能直接通过sysctl修改内核参数,所以我们使用init容器进行修改,在yaml中加入如下内容,将连接队列长度调整为2048,在优化后502状态码明显减少。

    spec:
      initContainers:
        - name: init-sysctl
          image: busybox
          command:
            - sh
            - '-c'
            - echo 2048 > /proc/sys/net/core/somaxconn
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
          securityContext:
            privileged: true

结语

    综上所述,容器的性能并不能简单的交给弹性伸缩,一味地增加资源有时候并不能解决问题,反而会造成资源浪费,所以容器的性能和应用程序的性能我们都应该去关注和优化,这期的分享就到这里,谢谢! 

参考文档

https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/

https://xie.infoq.cn/article/681d093ffc06d594de54992b9

欢迎订阅我的公众号「SRE运维手记」,可扫下方二维码,或者微信搜“SRE运维手记”

 

 

标签:丢包,容器,队列,SYN,内核,somaxconn,k8s,连接
From: https://blog.csdn.net/weixin_41350845/article/details/140584072

相关文章

  • k8s cronjob执行时间
    问题现象一般cronjob执行时间会比预期晚8小时。问题分析cronjob执行时区以kube-controller-manager为准,而kube-controller-manager默认是0时区。解决问题解决方式1kube-controller-manager容器挂载宿主机timezone,更改为东8区。解决方式2cronjob执行时间比预期减8小时。解决方......
  • 【0298】Postgres内核之 INSERT INTO 原始解析树 转 Query 树 (2)
    相关文章:【0297】Postgres内核之INSERTINTO原始解析树转Query树(1)1.获取insertinto目标表writelock在初始化了一个Query类型变量后,接下来第一步是需要获取INSERTINTO目标表上面的写锁(writelock)。必须在扫描SELECT之前获得INSERT目标表上的写锁,否则如果......
  • Linux内核链表源码的简单操作
    一、Linux内核链表源码的获取下载系统源码的方法常见的有两种:第一种访问网站下载:kernel.org第二种输入Linux命令下载:sudoaptinstalllinux-source-5.15.0(一般这种下载的是当前系统所用到的系统源码版本)下载完之后在/usr/src中可找到系统源码的压缩包,可以解压......
  • k8s Deployment与StatefulSet:深入理解两种控制器的区别
    Kubernetes(k8s)是一个强大的容器编排平台,它提供了多种资源对象来管理容器化应用。在这些资源对象中,Deployment和StatefulSet是两种常见的控制器,它们用于不同场景下的容器应用管理。本文将深入探讨这两种控制器的区别,帮助你更好地理解它们在Kubernetes中的应用和选择。一、Kuber......
  • 【Kubernetes】初识K8S基础
    目录一.K8S概述1.K8S背景物理机的缺点虚拟机特点(解决了物理机的缺点)虚拟机缺点容器化特点(解决了虚拟机的缺点)容器化缺点2.K8S基本概念2.1.作用2.2.特点二.K8S 集群架构与组件1.集群架构介绍2.核心组件2.1.Master组件Kube-apiserver:是所有服务请求的统一访问入......
  • 使用git工具管理泰山派内核源码目录及抽打补丁简易流程
    目录使用git工具管理泰山派内核源码目录及抽打补丁简易流程一、使用git维护源码二、git常用的一些操作三、抽补丁四、打补丁五、补充使用git工具管理泰山派内核源码目录及抽打补丁简易流程最近,在做linux开发的过程中入手了一块泰山派RK3566的开发板,在官方提供的各......
  • k8s集群部署prometheus
    目录一、Prometheus简介1.1、前言1.2、prometheus架构1.3、prometheus时间序列数据1.3.1、什么是序列数据?1.3.2、时间序列数据特点1.3.3、Promethues适合场景二、部署配置2.1、Prometheus部署2.1.1、创建命名空间2.1.2、创建RBAC规则2.1.3、创建ConfigMap类型的Prometheus配置文件......
  • 在K8S中,headless服务是什么?
    在Kubernetes(K8S)中,headless服务(无头服务)是一种特殊类型的服务,它与普通的K8S服务有所不同。通常情况下,服务(Service)的作用是为一组后端Pod提供一个稳定的网络入口,使得这些Pod可以通过服务的名称或IP地址被访问到。Headless服务的主要特点如下:不分配ClusterIP:......
  • 在K8S中,集群可以做哪些优化?
    在Kubernetes(K8S)集群中进行优化是一个多方面的任务,涉及从硬件层面到软件层面的诸多考虑。以下是一些常见的优化领域和技术:1.硬件优化选择合适的节点类型:根据工作负载的特点选择合适的计算、内存和存储资源。使用具有高I/O性能的SSD存储,对于I/O密集型工作负载尤......
  • 在K8S中,replicaset 和deploy有何区别?
    在Kubernetes(K8S)中,ReplicaSet和Deployment是两种非常重要的资源对象,它们都用于管理Pod的副本数量。尽管它们有一些相似之处,但在功能和用途上还是存在显著差异。下面详细介绍它们之间的区别:1.ReplicaSet定义:ReplicaSet是一种确保运行指定数量的Pod副本的Kuber......