Linux系统之运行状态分析及问题排查思路
〇、一件事儿
以下分析是站在Java工程师的角度来分析的。
一、CPU分析
分析CPU的繁忙程度,两个指标:系统负载和CPU利用率
1、系统负载分析
系统负载:在Linux系统中表示,一段时间内正在执行进程数和CPU运行队列中就绪等待进程数,以及非常重要的休眠但不可中断的进程数的平均值(具体load值的计算方式,有兴趣可以自行深究,这里不深究)。说白了就是,系统负载与R(Linux系统之进程状态)和D(Linux系统之进程状态)状态的进程有关,这两个状态的进程越多,负载越高。
查看系统负载,见top命令:第1部分。
怎么看load average的值?
通常先看15分钟的load值,如果load很高,再看1分钟和5分钟的load值,查看是否有下降趋势。短时间内load值高,无须太担心;但是如果长时间内load值持续过高,那么就要赶紧看看发生了什么。- 需要警惕的load average的值(以单核CPU为例):
- load值持续大于0.7,必须开始找问题出在哪里,防止情况恶化;
- load值持续大于1.0,解决问题已迫在眉睫;
load值持续大升高达到5.0,表示各种请求几乎得不到响应,机器几近崩溃;
对于多核机器,则需要根据CPU个数来判断系统负载是否过高。如,若认为0.7算是单核机器负载的安全线的话,则四核机器的负载最好保持在3(4*0.7 = 2.8)以下。
2、CPU利用率分析
- 看CPU的空闲率,用户进程CPU使用率和系统进程CPU使用率。
- 看个别进程的CPU利用率是否明显高于其他进程:
- 死循环?
- 复杂计算?
- 超大对象耗时读写?
查看CPU利用率,见top命令:第3部分和第5部分。
3、综合两个分析
- CPU利用率高,系统负载低
- 死循环?
- 复杂计算?
- 超大对象耗时读写?
- 系统负载高,CPU利用率低
- 大量IO操作?
- 大量死锁?
- 大量执行耗时SQL?
- 内存不足,频繁GC?
- 系统负载高,CPU利用率高
- 大量进程出现死循环?
- 大量进程进行复杂计算?
- 大量进程对超大对象耗时读写?
- 硬件无法支撑应用,升级机器?
三、内存分析
- 看总内存的使用情况;
- 是否有个别进程内存消耗明显高?
- JVM内存设置是否合理?
- 是否有大对象长时间未释放?
四、I/O分析
- 如果avgqu-sz比较大,表示相当量的io在等待;
- 如果svctm比较接近await,说明I/O几乎没有等待时间;如果 await远大于svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化;
- 如果%util接近 100%(70%为安全线),说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈;
- 如果I/O存在瓶颈,可以用pidstat命令找到I/O读写高的进程;
查看I/O读写状况,见iostat命令。
五、网络分析
netstat分析:
- 分析连接状态
- 若服务端出现了大量TIME_WAIT状态的连接,说明该服务器经常主动发起连接关闭操作,这是不可取的;
- 若一个系统频繁出现CLOSE_WAIT状态的连接,说明该系统并未立即处理连接关闭请求,系统存在缺陷;
- 分析网络队列
- 若Recv-Q过大,说明系统未能及时处理外部发来的请求;
若Send-Q过大,说明系统发包速度过快以至于连接无法及时将数据发出,或者对端接收数据包慢
这两个值通常应该为0,如果不为0可能是有问题的;数据包在两个队列里都不应该有堆积;可接受短暂的非0情况。
分析服务器端能否正常处理客户端连接
如果Recv-Q队列大小值>=设置的somaxconn值(cat /proc/sys/net/core/somaxconn)说明服务器无法适应当前连接建立速度,不能及时accept新的连接。客户端在调用listen时,会传递backlog参数,该参数为“已建立连接但未被程序accept的连接队列的长度”,内核层会根据cat /proc/sys/net/core/somaxconn值与传入的backlog值,选择两者中的小值作为“已建立连接但未被服务器accept的连接队列长度”
tcpdump分析:
tcpdump通过抓指定端口的数据包,可以分析指定进程的数据包流量。
通过抓包工具tcpdump及网络状态查看命令netstat可以帮助定位客户端、服务端相关网络问题,在日志匮乏或性能统计信息不足以分析服务器问题时,可以辅助分析服务器相关模块性能。
六、排查思路
- 系统负载、CPU利用率、内存、I/O、网络等因素综合考虑,才是解决问题的关键。
- 先整体分析哪块问题,再定位特征进程(例如CPU利用率明显高于其他进程的进程),进而结合jstack定位到线程和代码。
Linux系统之运行状态分析及问题排查思路的更多相关文章
- 在Linux系统下运行微信Web开发者工具
微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...
- 使用mybatis assembly插件打成tar包,在linux系统中运行服务
使用mybatis assembly插件打成tar包,在linux系统中运行服务 assembly插件插件地址: 链接:https://pan.baidu.com/s/1i6bWPxF 密码:gad5 ...
- linux系统下运行java项目的脚本编写
本文主要讲linux系统下运行jar包,至于如何打包jar包,放到linux系统下可以参考其他的博客. 在linux系统下运行jar包的命令如下: 1.java -jar xxxxx.jar // ...
- telint---切换当前正在运行的Linux系统的运行等级
telint命令用于切换当前正在运行的Linux系统的运行等级 Send control commands to the init daemon. --help Show this help --no ...
- Linux系统中的硬件问题如何排查?(6)
Linux系统中的硬件问题如何排查?(6) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(5)
Linux系统中的硬件问题如何排查?(5) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(4)
Linux系统中的硬件问题如何排查?(4) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(3)
Linux系统中的硬件问题如何排查?(3) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(2)
Linux系统中的硬件问题如何排查?(2) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
随机推荐
- HZOJ 方程的解
乍一看还以为是道水题,没想到这玩意这么难搞. 看题显然是exgcd,然而exgcd求的是一个解而不是解的个数(考试的时候不记得通解的式子然后挂了). 对于40%的数据,直接枚举计数即可. 对于另为20 ...
- 出现 java.net.ConnectException: Connection refused 异常的原因及解决方法
1 异常描述 在启动 Tomcat 服务器的时候,控制台一直输出异常信息,然后停止服务器,报出如下异常: 2 异常原因 通过观察上图中被标记出来的异常信息,咱们可以知道 java.net.Connec ...
- 洛谷 1372 又是毕业季I
题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...
- H3C PPP MP简介
- springmvc 多文件/文件夹上传 下载
注入依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding&g ...
- Python--day29--logging模块(日志模块)
重要程度六颗星,比如一个小窗口的广告如果因为你没有日志的问题导致点击量没有记录下来,几十分钟那就会损失几十万了,这责任谁负得起. 希望离开一个公司是因为有了更好的去处而不是因为各种各样的原因被开掉,那 ...
- gSOAP calc服务端与客户端示例
1. Web服务定义描述头文件 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double &a ...
- java 创建线程方式
1.继承Thread类 子类覆写父类中的run方法,将线程运行的代码存放在run中. 建立子类对象的同时线程也被创建. 通过调用start方法开启线程. 2.实现Runnable接口 子类覆盖接口中的 ...
- element-ui隐藏组件el-scrollbar
代码如下: <div class="main_wrapper"> <el-scrollbar wrapClass="scrollar_container ...
- tsung测试xmpp遇到no_free_userid
tsung里面可以配置xmpp的参数,设置一下 <option type="ts_jabber" name="userid_max" value=&quo ...