在工作中总会轮到你排查线上问题,当Liunx服务器中出现CPU占用率过高的情况,应该如何快速排查定位问题所在,提高工作效率呢?
记: 一次登录服务器发现CPU占用率居高不下, 排查后发现是MySQL占用达到200%
针对MySQL
参考官网链接
登录进入Mysql命令界面,使用 show full processlist 返回的结果是实时变化的,是对mysql链接执行的现场快照,所以用来处理突发事件非常有用
一些问题会导致连锁反应,而且不太好定位,有时候以为是慢查询,很可能是大多时间是在等在CPU、内存资源的释放,所以有时候同一个查询消耗的时间有时候差异很大
总结了一些常见问题:
CPU报警:很可能是 SQL 里面有较多的计算导致的
连接数超高:很可能是有慢查询,然后导致很多的查询在排队,排查问题的时候可以看到”事发现场“类似的 SQL 语句一大片,那么有可能是没有索引或者索引不好使,可以用:explain 分析一下 SQL 语句
查询出来多条SQL语句索引添加并未命中、完全无索引、索引失效... 导致全表扫描,执行效率极大降低,针对SQL语句做对应优化,索引正确使用后,CPU使用率马上下降且平稳至20%以下!
针对Java
在项目中为了提高运行效率,就离不开多线程,但是这个玩意有利有弊。
优点是同一时间能可以处理的任务更多了,速度效率有显著提高,注:在运用得当的情况下是这样的。
需要考虑的是线程切换对整体性能的影响,占用更多的内存空间,模块数据要保证线程安全,以及防止死锁情况的发生。
在线上有时瞬时数据量达到峰值,多线程任务分配不过来,或出现死循环,也会导致在服务器中Java的占用率直线飙升!
需要排查堆栈信息,针对哪些代码有问题及时处理优化即可。
// 查看Java程序线程占用CPU情况
top -Hp <pid>
// 将对应线程 TID 转换为16进制
printf "%x\n" <tid>
// 通过查看对应堆栈信息 grep 后的tid 为转换为16进制后的tid
jstack pid |grep tid
// -A 60 表示查看前60行
或者直接使用 jstack pid |grep tid -A 60
服务器云磁盘满?
df -lh // 查看磁盘空间使用情况
cd .. // cd 进入到磁盘使用率较高的文件夹
du -h --max-depth=1 // 查看文件夹下各目录占用情况
在Liunx中查询指定文件
- 搜索当前目录(包含子目录,以下同)中,所有文件名以my开头的文件
java find . -name 'my*'
- 搜索当前目录中,所有文件名以my开头的文件,并显示文件的详细信息
java find . -name 'my*' ls
- 搜索当前目录中,所有过去10分钟更新过的普通文件。如果不加 type -f 参数,则搜索普通文件 + 特殊文件
java find . -type f -mmin -10
Tip
当你使用了阿里云服务器,一般会定期在后台控制台定期扫描云上服务漏洞预警问题
扫描出来的漏洞几乎全都来自于软件版本过低,存在泄漏被攻击风险
当点击(一键修复或者生成修复命令时,服务商就开始让买买买了); 🤑🤑🤑
关于这个问题自己手动修复的话, 采用软件升级一般都可以解决.
除了提示带kernel的高危漏洞其他的不需要重启实例即可修复.
有kernel的需要更新完成重启实例.
修复过程如下:root登陆
yum check-update 查看可升级的系统软件
yum upgrade 升级所有可升级的系统软件
等待执行完成.
完成后, 再阿里云控制台, 验证!