首页 > 其他分享 >一次系统高LOAD优化之经验

一次系统高LOAD优化之经验

时间:2023-05-22 13:32:56浏览次数:34  
标签:LOAD 经验 打印 系统 线程 日志 优化 CPU


现象

某个应用,机器数增加到了150台,但是发现其load较高。

一次系统高LOAD优化之经验_java

对于4核机器来说,负载率高峰期超过4,意味着高峰期几乎满载,这是一个不正常的现象。




经验法则如下:
当系统负荷持续大于0.7,你必须开始调查了,问题出在哪里,防止情况恶化;
当系统负荷持续大于1.0,你必须动手寻找解决办法,把这个值降下来;
当系统负荷达到5.0,就表明你的系统有很严重的问题,长时间没有响应或者接近死机了。




指标

一次系统高LOAD优化之经验_打印日志_02


首先确认系统无FullGC、Java线程符合预期。


一次系统高LOAD优化之经验_java_03

查看CPU,CPU一直运行在较高的峰值。当然对于4核CPU来说,这个比例就不算太高。


分析

那么我们分析出来了比较明显的结论,CPU运行低和LOAD较高,则表示等待IO的进程比较多。我们进一步定位问题,我们DUMP线程,看看线程在等待什么了,为什么会导致如此高的IO。




sudo /opt/taobao/java/bin/jstack -F 1908 > stack.log




一次系统高LOAD优化之经验_java_04


经过统计,发现大量的线程都BLOCKED在红色的代码代码内,那么这段代码到底是做了什么,为什么会BLOCK大量的请求。


继续使用线程诊断,发现大量的线程都在等待状态,其中等待的代码段是logback的日志打印。

一次系统高LOAD优化之经验_打印日志_05


根据业务情况,我们就得到了结论,即本系统有大量线程的相同代码块同步打印同一个日志,导致加锁并行处理,进而导致多个没有取到锁的线程在等待上个线上打印日志释放资源。


优化

很简单的一个办法,就是利用Logback的异步打印日志,可以参考文档:

https://examples.javacodegeeks.com/enterprise-java/logback/logback-ayncappender-example/


核心原理是同步打印日志是直接对文件同步操作,而异步打印日志原理就是打印日志写将日志写到队列,然后将队列异步写到文件里去。


结果

优化后,发布线上观察机器的LOAD情况如下:

一次系统高LOAD优化之经验_java_06


可以看到,发布优化后的LOAD已经小于昨日的同比LOAD,说明优化还是有一定的效果的。但是,同时发现,优化不明显,说明还有其他原因,还需要进一步排查是否有其他系统未知问题。


思考

系统调优是难度非常大的一个课题,也是需要具备非常深的基础底层知识,才能更快的定位和分析以及解决问题。


标签:LOAD,经验,打印,系统,线程,日志,优化,CPU
From: https://blog.51cto.com/u_15990596/6323420

相关文章

  • pod 插件报错: LoadError - cannot load such file -- cocoapods/command/gen
    报错信息:LoadError-cannotloadsuchfile–cocoapods/command/gen解决方法:geminstallcocoapods-generate......
  • rt下降40%?程序并行优化六步法
    1背景性能优化是我们日常工作中很重要的一部分,主要有以下原因:降低服务器和带宽等硬件成本:用更少的资源处理更多的请求提高现实世界的运行效率:人机处理效率存在数量级的偏差,同样机器世界的效率提升能带来现实世界效率提升的方法效果提高用户的体验:解决响应缓慢、宕机等问题......
  • 办公位2.0,用SVG实现Chrome浏览器图标,文末有近半年经验总结
    功能拆解很多图形的实现并不困难,我之前的文章也实现过各式各样的图形。基本是CSS里的样式约熟悉,图形实现的越快速、越相似。还有一些需要SVG或Canvas实现的图形,这就需要这两项技术的基本功扎实了。简单图形设计整个画面中有很多图形,有些图形比如画框、太阳、桌腿、便签,无论是形状还......
  • 数据库链接池从100ms优化到3ms!
    数据库连接池的配置是开发者们常常搞出坑的地方,在配置数据库连接池时,有几个可以说是和直觉背道而驰的原则需要明确。1万并发用户访问想象你有一个网站,压力虽然还没到Facebook那个级别,但也有个1万上下的并发访问——也就是说差不多2万左右的TPS。那么这个网站的数据库连接池应该设置......
  • Qt开发经验小技巧266-270
    从Qt6.4版本开始多媒体模块提供了ffmpeg作为后端解码使用(6.5版本默认就是ffmpeg),可以通过设置环境变量来更改使用哪种后端解码,在main函数的第一行qputenv("QT_MEDIA_BACKEND","ffmpeg");目前已知的问题是如果选用ffmpeg则暂时不支持中文目录以及中文名称,如果一定要支持中文则需......
  • Day 41 41.1 Python中json模块的loadloads方法实战及参数详解
    Python中json模块的load/loads方法实战及参数详解【一】loads方法与load方法的异同在Python中json是一个非常常用的模块,这个主要有4个方法:json.dumpsjson.dumpjson.loadsjson.load这里主要分析讲解一下json的loads和load方法。这两个方法中都是把其他类型......
  • 接口查询优化-层级分类数据查询优化
    一.需求:法规、案例根据输入的关键字、选择的分类进行查询,如果选择的是父级分类要查询出所有子分类的相关数据,还要统计出相关分类的数量。只显示分类数量大于0的分数,子分类的数据要累加到父级上。效果图: 左边是相关层级的分类统计,右边是列表,分页。表设计和数据结构 法规表......
  • GO性能优化指南笔记
    今天的学习内容时关于GO性能优化的问题。今天的讲师讲的关于GO在项目实操过程中的各种优化案例可以说是目前来说我见过的最好的了,以下我从几个方面说明一下1,GO语言在编程过程都要注意的问题:简单性(以能理解并运行为第一要素,拒绝冗杂的代码,以简单清晰的逻辑编辑代码)可读性(代码是......
  • MySQL索引优化
    1.索引是啥?简单来说是可以快速查找数据的数据结构。数据结构就是存储数据的结构,例如数组,链表...在数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用指向表中是数据,这些数据结构就是索引,它让我们可以用算法来查找数据。假设有个user表,通过name字段找李白,没有......
  • 测试人员转型是大势所趋:我的十年经验告诉我,你必须要行动起来了。
    做测试十多年,有不少人问过我下面问题:现在的手工测试真的不行了吗?测试工程师,三年多快四年的经验,入门自动化测试需要多久?自学自动化测试到底需要学哪些东西?不得不说,随着行业的竞争加剧,互联网产品迭代速度越来越快,QA与测试工程师都需要在越来越短的测试周期内充分保证质量。可......