1、磁盘空间不足问题
先用 df -h 从总体查看磁盘状态,看挂载点为根目录的 / 的容量咯,这里我只用了 25%,显然还没有达到瓶颈,但如果这里太大了,还要进一步看看是哪个目录大了。
此时用 du -sh *(ls -lh) 命令,查看 / 路径下的各个文件和目录的大小。
2、CPU 与内存使用率过高问题
用top命令查看
图上表示不同进程(PID)所占用的资源情况,没错,不仅仅是 CPU 情况。
top命令列表解析:
VIRT 表示使用的虚拟内存数量,RES 表示使用的物理内存数量,SHR 表示使用的共享内存数量,这三者可以从内存角度看该进程的资源占用情况。
S 表示进程的状态,下面的值 S 表示睡眠,D 表示不可中断睡眠,R 表示运行,基本知道这三个就够了。
后面两个值是百分比,%CPU 自然就是 CPU 使用率,%MEM 自然就是内存使用率,看这俩值可以一目了然看谁占用的资源过高了。
TIME 表示累计 cpu 使用时长,感觉没什么用。
COMMAND 表示启动进程使用的命令行,Java 程序的话,可以看看 JVM 启动参数,看是否配置的合理。
如果专门看 Java 进程的情况,可以先 jps 命令找到它的 PID。
然后再 top -p 19063 专门看这个 Java 进程的情况。
如果再细化到线程,可以加个 -H 参数,top -p 19063 -H
当然,top 命令已经可以分析内存了,如果想单独分析下内存,可以用小而美的命令,free -h
3、网络延时
netstat -a 查看所有连接中的 socket。
用 netstat -tnpa 命令可以查看所有 tcp 连接的信息,包括进程号。
当然这些是从机器上的,如果是一个接口响应耗时过长,一方面可能是由于机器本身所在的网络有问题。
一般这种问题也就是运维同学去解决,或者我们单节点重启一下,换台机器,就搞定了。
还有可能是服务提供方业务耗时严重,这个就需要去排查服务提供方的日志,机器负载,连接池占用情况等,分析问题,这也是我们平时开发碰到的主要问题。
4、Java 程序的问题分析
用 jmap -dump 分析堆内存中的快照,看是否有大对象问题
用 jmap -heap 查看堆内存设置与当前使用情况。
用 jstack 查看 jvm 线程运行信息,上传到 fastthread.io 这个网站,直观地看一下,一看线程有点多。