看了很多书都说docker来部署应用可以隔离系统资源互不影响,直到这段时间出现的一系列问题又颠覆了我的认知。
发现docker并不能隔离真正隔离系统资源。最近k8s中的某一个应用总是被强制重启,由于监控体系没有完善,找了好久都没有找到原因,之前也有其它应用类似的问题是应为metaspace溢出导致的,但是此次事务毫无报错,严重时一天重启三次。有时候又一连好几天个把月没有问题。为了不让五一小长假的美好心情被破坏,觉定把这个问题彻底解决掉,好吧其实放假的第一天就被破坏了,当天重启了3次,为了后续的美好日子,决定把它根因找出来。看k8s日志发现每次重启都是健康检查失败导致重启,于是推断以下几种可能:

  • jvm 频繁GC导致进程stw挂起liveless prob探针超时
  • 系统cpu负载过高导致处理超时

正对两种情况进行对应排查,有时候排查问题也是有点小麻烦,只能绕着想点其它办法,比如skywalking和arthas的冲突问题,比如docker包只打了jre,好吧就只能打印GC日志来观察情况了,排查过程就不讲了,反正排查半天最后发现内存方面没有问题。

所以就考虑第二种情况,cpu负载问题导致超时,于是先用top观察负载。发现load average值大概在8左右,但是发现这个负载值时机器的总平均负载,没办法查看当前docker容器的情况,但是这也不影响我做出正确的推断,配置的cpu核心数为0.5-1,宿主机和cpu核心数为16,相对16核心数8的负载算正常范围,忽然间又想到这个负载时基于进程级别的,要是我应用的线程数过多,而docker限制了cpu核心数,那么这里会不会出现问题呢?也就是当我进程中的一个线程在使用cpu时其它线程用不了,尽管cpu还有空闲,但是进程内的线程就不断产生上下文切换,导致探针超时,这个也完全有可能,于是按用top -H -p pid 查看线程情况,发现好家伙开了300多个线程,才配置0.5到1核的cpu 这个确实有点过分了。在观察的过程中发现间隔一分钟cpu使用率还会暴涨一次,好吧这个应用是个定时任务,每隔1分钟就会有10几个定时任务同时进来然后开3个线程处理这个10几个定时任务,每个线程进来又开了cpu核心x10个线程去处理子任务,那么如果此时有大量业务数据需要处理就会产生大量的上下文切换,就非常有可能导致探针请求超时。但是按道理说探针超时10秒这个也不太可能吧?
于是接着想到假如cpu又被其它docker容器的进程占用了呢?也就是说当前应用除了跟自己抢占资源外还需要跟其它的进程抢占资源,所以有可能等待更久。也就是这个应用本身是个cpu密集型的应用,给的cpu过少了。看代码的过程中又发现一个坑爹的地方,应用配置的默认线程数是cpu核心数*10,由于docker容器中获取cpu核心数不准确的问题,导致cpu核心数获取到的是宿主机真正核心数16 也就是说实际上是3个线程各自开了160个线程在处理业务,意味着高峰期线程数可能达到480+其它线程的数量,这才导致了探针超时,因为轮半天可能每轮到它执行。
给线程池设置个参数,别开160个线程,外加增加cpu核心数重启完美解决此问题。

k8s下docker容器获取cpu核心数不准确导致高负载引发的宕机问题相关推荐

  1. C++获取CPU核心数(用来初始化线程池)

    std::thread::hardware_concurrency()该函数返回CPU核心的数量,当系统无法获取时,函数返回0  #include <thread>unsigned int ...

  2. Java 代码如何获取CPU核心数和定义线程池的核心数

    在自定义线程池的时候,我们应该如何选择线程的核心数量? 这里又一个简单的方法供大家参考. CPU 密集型:线程数量=cpu核心数量 IO 密集型:线程数量=cpu核心数量*2 // 那么在java代码 ...

  3. Android下设置CPU核心数和频率

    现在的Android手机双核.四核变得非常普遍,同时CPU频率经常轻松上2G,功耗肯定会显著增加.而大多数的ARM架构的CPU采用的是对称多处理(SMP)的方式处理多CPU.这就意味着每个CPU核心是 ...

  4. Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池

    调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能.在实际工作中,我们需要根据任务类型的不同选择对应的策略. CPU 密集型任务 首先,我们 ...

  5. 深入理解-CPU核心数与线程池并发线程数关系

    那是一个风和日丽的下午! 面试官微微一笑,对我说:"小伙子,合理配置线程池你是如何考虑的?" 我微微一笑,说出了我的答案: 首先确认业务是CPU密集型还是IO密集型的, 如果是CP ...

  6. 如何设置Docker容器的CPU和内存使用限制

    如何设置Docker容器的CPU和内存使用限制 1. 概述 在很多情况下,我们需要限制docker主机上资源的使用. 在本教程中,我们将学习如何设置docker容器的内存和CPU限制 2. 通过doc ...

  7. CPU核心数和线程数都是什么意思

    CPU 是电脑中最重要的硬件,关乎整机的性能,所以选择 CPU 特别重要,那么很多朋友在看 CPU 参数的时候可以看到核心数的线程数两个参数,都是什么意思呢?CPU 从早期的单核,发展到现在的双核.多 ...

  8. 为什么k8s中docker容器的启动命令必须是前台执行?

    k8s中docker容器的启动命令(在yaml的command字段中配置)必须是前台执行,不能使用后台执行程序, nohup ./start.sh & 否则kubelet创建了包含这个容器的p ...

  9. java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

    CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...

最新文章

  1. android c聊天功能,Android实现简单C/S聊天室应用
  2. Lancet:支持奋战在疫情一线的中国科研技术工作者
  3. R获取股票数据并进行进行可视化分析
  4. 基于单片机的倒车雷达系统设计c语言,基于AT89C2051单片机实现超声波倒车雷达系统的设计...
  5. [转载] 中华典故故事(孙刚)——24 嫁鸡随鸡_嫁狗随狗
  6. Zookeeper在Kafka中的作用
  7. mybatis 中case_mybatis 对string类型判断比较 group case when then 综合
  8. Lighttpd 的安装配置(web服务器软件)
  9. ElasticSearch手动创建mapping
  10. (17)HTML标准文档流
  11. fullgc触发条件_JVM的内存分配策略以及进入分代的条件
  12. 网上讨论“电商平台打败了实体店”?
  13. centos7 mysql dump还原_CentOS 7.6使用mysqldump备份恢复MariaDB
  14. 斯坦福的著名小兔子模型的点云数据_基于正交投影的点云局部特征描述详解
  15. 无线射频专题《射频合规,2.4GHz WIFI频谱模板》
  16. 安卓手机屏幕分辨率怎么调整
  17. 同轴电缆传输容易出现哪些干扰?
  18. 如何解决 fs.renameSync() 跨区移动文件的问题
  19. 三句话的原则-看人长处-帮人难处-记人好处
  20. GUI设计之马的遍历

热门文章

  1. 中国古代帝王的十大驭人术
  2. 【大话设计模式】全局把握篇
  3. 【SpringMVC学习01】宏观上把握SpringMVC框架
  4. 银河麒麟桌面操作系统V10上安装使用Node.js 14.15.1 LTS版本并构建一个electronjs桌面应用
  5. 给IT销售人员一点经验
  6. ensp的ipsec实验(ike自动协商)
  7. Windows系统分盘
  8. 单行图片与文字垂直居中、图片和span水平垂直居中问题
  9. 基于粒子群算法的极限学习机(ELM)分类算法-附代码
  10. 有哪些适合小耳朵戴的耳机、盘点几款佩戴舒适的骨传导耳机