Linux系统开发运维目录
排查线上应用主要排查三个主体:程序所在的应用服务器、数据库服务器、redis(redis通常位于应用服务器)。
应用服务器
基本上出问题就是df、free、top 三连,然后依次jstack、jmap
服务器硬件
查看硬盘
当磁盘容量不足的时候,应用时常会抛出如下的异常信息:
java.io.IOException: 磁盘空间不足
或者云服务器上报警“磁盘使用率”
查看磁盘整体使用率
df -h
查看某个目录下文件大小
du -sh 目录名称
查看内存
查看命令
free -h
查看占用内存前十的应用
ps aux | sort -k4,4nr | head -n 10
查看CPU
根据程序名称查看进程号
在 linux 显示进程的命令是ps,ps命令是Process Status的缩写。
管道符“|”:命令A|命令B,即命令1的正确输出作为命令B的操作对象。
例如ps -aux | grep “test” 的含义是在ps aux执行的结果中查找test。
ps -ef
查看redis进程:
ps -ef | grep redis
ps -aux
ps -aux和ps -ef是同一个命令,只不过前者是标准语法,后者是BSD语法。
示例:
ps -aux | grep redis
根据端口号查看进程id
lsof
lsof -i:端口号
查看进程
ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top工具。
top查看所有进程CPU占用率
top
top -p查看指定进程
top -p 端口号
查看网络
查看防火墙端口是否开启
先查看防火墙状态
systemctl status firewalld
在防火墙开启状态下,开放端口,下图示例开放19999端口
firewall-cmd --zone=public --add-port=19999/tcp --permanent
firewall-cmd --reload
此时查看防火墙开放的端口
firewall-cmd --zone=public --list-ports
查看网络连通
使用telnet命令,不使用ping命令的原因是服务器可以禁止ping。
Java应用
jmap
yum install -y java-1.8.0-openjdk-devel-debug
yum -y whatprovides '*/jmap'
jmap -histo [pid]
jmap -histo [pid] | head -20 (前20行)
基本就可以定位到问题,我们可以看到是OomController这个类的,有关Person的相关问题。
导出整个JVM 中内存信息Dump文件(jmap -dump)
通过mat(Eclipse Memory Analysis Tools)导入dump文件进行分析,内存泄漏问题一般我们直接选Leak Suspects即可,mat给出了内存泄漏的建议。
jstack
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
jstack 进程号 | grep 线程号