提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
服务变慢
生产环境变慢问题,变慢这个问题主要是感官上的变慢,究其原因有两方面服务器全局慢,服务器局部慢。
服务器全局慢
包括cpu 慢,内存慢,io/磁盘慢,io/网络慢。
服务器局部慢
指得是发现某一个或者多个服务很慢。
1.全局查询思路
1 top 命令(进程,cpu,内存)
1.1 服务器整体情况(top)----- 进程,cpu,内存
top命令说明
- 第 1 行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)
- 第 2 行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。一般情况下,只要没有僵死的进程,就没啥大问题。
- 第 3 行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。
- 第 4 行:物理内存总量、内存空闲量、内存使用量、作为内核缓存的内存量
- 第 5 行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量
- 第 6 行里面主要看 PID 和 COMMAND 这两个参数,其中 PID 就是进程 ID , COMMAND 就是执行的命令,能够看到比较靠前的两个进程都是 java 进程
在当前这个界面,按下数字键盘 1 能够看到各个 CPU 的详细利用率
1.2 cpu使用情况(vmstat)
1.3 内存(free)
1.4 磁盘(df)
1.5 磁盘io(iostat)
2.局部查询思路
top 发现有问题的进程,对于进程进行查看,这里我只说java 进程的服务,cpu 标高,怀疑内存泄漏导致的full
gc 还有就是线程死锁,
jps -ln (查看java 进程)
jmap -histo {pid}
grep 一下GC 的信息,也可以查询GC 的 信息。(这里就能查询到是否都是FULL GC)
grep waiting on
(这里就可以查看到是否是有线程死锁的问题)
服务变慢排查思路:
- 是不是资源层面的瓶颈,硬件、配置环境之类的问题
- 针对查询类接口,是不是没有添加缓存,如果加了,是不是热点数据导致负载不均衡
- 是不是有依赖于第三方接口,导致因第三方请求拖慢了本地请求
- 是不是接口涉及业务太多,导致程序执行跑很久
- 是不是sql层面的问题导致的数据等待加长,进而拖慢接口
- 网络层面的原因?带宽不足?DNS解析慢
- 确实是代码质量差导致的,如出现内存泄漏,重复循环读取之类