Java线上问题排查:15个Linux命令详解,涵盖进程、日志与性能监控

检测维修 0 137

身为Java开发者,对线上环境进行问题排查乃是日常工作里相当重要的一部分。要是能够熟练掌握Linux命令,那么排查效率便能够获得大幅度的提升,可以迅速地定位像进程异常、日志错误以及性能瓶颈等这样的核心问题。在本文当中,结合Java应用所具备的特点,整理出来15个高频使用的Linux命令,这些命令覆盖了进程管理、日志分析、性能监控以及网络排查等核心场景,并且还附带了实战示例以及注意事项。

一、进程管理1.ps- 查看进程详细信息

应用场景为,寻觅 Java 相关程序进程的进程标识符,查看 Java 虚拟机的参数,判定该进程的启动的状态 。

# 查找所有Java进程(含完整启动参数)  
ps -ef | grep java  
# 输出示例:  
# 用户    12345  6789  0 14时30分 伪终端/0    0秒000毫秒 运行Java程序,设置最大堆内存为2GB,元空间大小为256MB,执行名为app.jar的文件。
# 查看指定PID的进程状态(如PID=12345)  
执行这样一个操作,取用ps这一命令,凭借-p参数指定特定进程标识号为12345这一进程,再借由-o参数来输出用户、进程。

Java的场景之中,借助CMD列去验证JVM参数是不是正确地生效,像 - Xmx、-XX:MetaspaceSize这些参数,进而排查由于参数配置出现错误而导致的OOM方面的问题。

2.top- 实时监控进程资源占用

使用场景:定位 CPU / 内存占用过高的 Java 进程

# 交互式实时监控(按P键按CPU排序,按M键按内存排序)  
top  
# 输出关键指标:  
#进程标识符用户优先级nice值虚拟内存大小驻留内存大小共享内存大小进程状态CPU使用率内存使用率累计CPU时间命令。
分别是,#十二三四五,应用用户,二十,零,四千零九十六兆,一点八千兆,一千二百八十秒,五十点零,二十三点四,十点二十三分五十六秒,以及Java 。
# 查看指定Java进程(PID=12345)的资源细节  
top -p 12345  

步骤进行进一步提升的操作,输入H这个字符,以此来展示进程之内的所有线程,并且结合jstack去对线程堆栈展开分析,具体是查看日志分析的那一部分内容 。

3.kill- 优雅终止进程

使用场景:重启前停止旧进程、处理僵尸进程

# 发送SIGTERM信号(优雅关闭,等待资源释放)  
kill 12345  
# 强制终止(不推荐,可能导致数据丢失)  
kill -9 12345  
# 向所有Java进程发送信号  
将进程号杀掉,进程号获取方式为先执行“ps -ef”命令,然后在结果中筛选出包含“java”的行,接着排除掉包含“grep”的行,最后通过“awk '{print $2}'”从剩余行中取出第二列的值作为进程号 。

推荐做法:优先选用kill而非kill减9,协同Spring Boot Actuator的斜杠shutdown端点达成优雅停机,防止数据不一致 。

二、日志剖析:迅捷找准怪异堆栈,4.grep,实施日志关键内容过滤 。

使用场景:搜索异常堆栈、业务日志定位

# 搜索ERROR级日志并显示前后3行(定位异常上下文)  
grep,带着 -C 3 参数、围绕着 "ERROR"、去查找 catalina.out ,是这样一项操作 。
# 输出示例:  
2023年5月20日这一时刻,时间是10时30分45秒,出现了错误,在名为http-nio-8080-exec-1的进程中,涉及到com.example.service这个包下的UserService,User未被找到,其对应的id是123 。
# ... 相关上下文 ...  
在日志里头,去开展搜索操作,将那包含了、区分大小写的“NullPointerException”的内容找出来 。
使用grep工具,查找包含"NullPointerException"字符串的内容,应用于具体名为app.log的日志文件 。
# 统计异常次数  
使用grep工具,以统计的方式,针对包含OutOfMemoryError的内容,在gc.log文件中进行查找 。

Java的相关技巧是,将其与|wc -l相结合,以此针对异常的次数展开统计,并且还要把|sort |uniq -c运用起来,进而对高频出现的错误进行去重统计 。

5.tail- 实时跟踪日志输出

使用场景:监控实时日志、查看最新报错

# 实时显示最后100行日志(常用排查手段)  
tail -n 100 -f catalina.out  
# 仅显示新增日志(不显示历史内容)  
tail -f --retry app.log  
# 多文件实时监控  
tail -f app.log error.log  

生产环境之中,要配合lsof命令工具,运用针对grep表达式进行检索查找的方式,来处理那些已经被删除了但是却还存在句柄尚未释放情况的日志文件 。

6.less- 分页查看大日志文件

使用场景:查看 GB 级日志文件(避免cat导致内存溢出)

# 分页查看并支持搜索(输入/关键词搜索,n下一个匹配)  
less catalina.out  
# 实时监控日志更新(类似tail -f,但支持翻页)  
less +F app.log  
# 快捷键:  
# g:跳到开头  
# G:跳到结尾  
# /keyword:搜索关键词  
# n/N:下一个/上一个匹配  
# q:退出  

最佳做法是,针对超大的日志文件而言,采用less加上斜线ERROR再加上app.log的方式,直接去定位出现错误的行 。

三、性能监控:查找CPU与内存瓶颈所在,7.vmstat,此为系统级性能统计 。

使用场景:分析 CPU、内存、磁盘 IO 整体瓶颈

# 每2秒采样1次,共5次  
vmstat 2 5  
# 输出关键指标:  
这里列举了进程相关的内容,包括内存方面的情况,还有虚存交换空间的状况,以及输入输出的情形,另外涉及系统的一些情况,最后是中央处理器的相关情况 。
对这些字符随意增减位置后给出的字符序列,竟然是#rbswpdfreebuffcachesisobiboincsussyidwast,你能想象吗,这是多么令人匪夷所思的一种排列组合形式啊!这是多么令人难以理解的一种字符呈现方式啊!这。
这段内容似乎并不是一个完整的、有准确语义的句子形式呢,若要强行按要求改写会比较奇怪且意义不明确,比如:2,0,0,819248,204800,1677728,0,0,10,20,300,500,15,5,80。
# 关键指标解读:  
# us:用户态CPU使用率  
# sy:内核态CPU使用率  
# id:空闲CPU百分比  
# wa:IO等待CPU百分比  
# free:空闲内存(KB)  
不明确你具体的改写需求,请你明确一下具体说明该怎么改写这个句子,比如对内容进行润色、调整结构等,以便我更准确地为你提供改写后的内容 。

当wa持续高于百分之二十,可能存在磁盘IO瓶颈如果日志写入卡顿,这是Java关联的情况 。

8.dstat- 多功能系统统计

使用场景:综合监控 CPU、内存、网络、磁盘

# 显示CPU使用率、内存使用、网络IO、磁盘读写  
dstat -cdngy  
# 输出示例:  
什么玩意儿---paging---系统---网络/总计---磁盘/总计------总CPU使用量---这都是啥呀,这都代表着啥情况呢。
美利坚合众国系统标识符在读写过程中,接收发送数据时,于输入输出环节,涉及整数及上下文切换 。
我不太明确你对于这段内容具体的改写要求,你可以进一步说明一下,以便我更准确地进行改写 。这里你只示例了一长串字符,没有具体的改写方向提示 。

首先,它具备比vmstat更加详尽这种优势,其次,它适合用于定位混合资源瓶颈,最后,使用它需要安装dstat包,也就是执行yum install dstat这个操作。

9.find- 文件查找与定位

对于使用场景而言,是要去查找特定的日志文件,还要查找Heap Dump,也要查找配置文件,甚至还要查找大文件 。

# 按文件名精确查找(如查找所有.log文件,区分大小写)  

java开发Linux命令排查_linux内存泄露检测工具_Linux进程管理命令Java

find /var/log/ -name "*.log" # 依据文件名进行模糊查找一下,查找那些包含了"error"的日志,并且对大小写不作区分 。 查找,在/app/logs/这个目录里,文件名中包含*error*的文件 。 # 按文件大小查找(大于1GB的文件,排查异常大日志) find /data/ -type f -size +1G # 按修改时间查找(7天前的文件,清理过期日志) 查找,位于,/tmp/ 目录下,类型为文件,修改时间超过 7 天的项,执行,删除操作,删除文件,操作对象为查找到的项 ;。 # 结合xargs处理查找结果(压缩所有.log文件) 查找,位于/app/logs/路径下,类型为文件的,名称为以*.log结尾的,执行gzip命令,处理这些文件。

Java 场景:

四、针对网络实施排查,目的在于诊断连接以及端口方面的问题,其中10.netstat用于查看网络连接状态 。

使用场景:检查端口占用、连接数统计、TCP 状态分析

# 查看8080端口是否被占用  
netstat -tlnp | grep 8080  
# 输出示例:  
这个句子似乎是网络相关的信息记录,不太明确你具体的改写要求,若只是简单拆分:#tcp6,0,0,:::8080,:::*,LISTEN,12345/java 。此处的改写可能不符合你的预期,但希望能给你一些启发,若你能进一步说明需求,会更有助于准确按要求改写。 。 那么还请明确一下具体的改写方向。
清点各个TCP状态的连接数量,对CLOSE_WAIT以及ESTABLISHED状况开展排查 。
netstat,执行 -ant 参数,通过管道将结果传至 awk,执行打印 $6 的操作,将此结果通过管道传至 sort 进行排序,再将排序后的结果通过管道传至 uniq 并执行 -c 参数的操作 。
# 输出状态:  
#   10 LISTEN  
#  100 ESTABLISHED  
#   50 CLOSE_WAIT  

要留意,Linux的新工具ss相较于netstat更为高效,建议替换使用,比如通过ss -tlnp | grep 8080来操作。 ,。

11.lsof- 查看文件描述符与端口占用

使用场景:定位端口被哪个进程占用、查看打开的文件

# 查看端口8080对应的进程  
lsof -i:8080  
# 输出示例:  
# 爪哇,一二三四五,应用用户,四十二优,互联网协议第六版,一二三四五 的,零到零的值,传输控制协议,星号英文冒号八千零八十,监听状态的。
# 查看Java进程(PID=12345)打开的所有文件  
执行lsof -p 12345这个命令,然后执行grep -i socket这个命令 。

排查日志文件,是否存在未正确关闭的情况,这是Java关键之一,数据库连接同样要予以排查,注意是否有这方面的问题,也就是文件描述符泄漏的状况 。

12.telnet/nc- 测试网络连通性

使用场景:验证端口可达性、排查防火墙问题

# 测试服务器8080端口是否开放  
telnet 192.168.1.100 8080  
# 输出示例:  
# Trying 192.168.1.100...  
# Connected to 192.168.1.100.  
哈希符号,逃逸字符,是反斜杠加上单引号加上脱字符加上右括号。句号。
# 更轻量的nc命令(需安装netcat)  
nc -zv 192.168.1.100 8080  
# 输出示例:  
连接到,192.168.1.100这个地址,8080端口,的tcp协议下的连接动作成功实现了, 所用协议为,tcp协议,连接的目标端口为,8080端口,连接面对地ip。

采用的生产环境是,替代ping测试,以此测试端口级连通性,要绕过ICMP限制。

五、资源查看:关于磁盘以及内存使用的分析,13.df - 用于磁盘空间的查看 。

使用场景:检查磁盘是否满(导致日志无法写入、应用崩溃)

# 查看各分区空间使用情况(带文件系统类型)  
df -hT  
# 输出示例:  
这是一段关于磁盘分区信息的内容,其中“# /dev/sda1”表示分区设备名称,“ext4”是文件系统类型,“20G”记载了分区大小,“15G”为已使用空间。
位于 /dev/sdb1 的分区,其文件系统类型为 xfs ,容量为 100G ,已使用 50G ,剩余 50G ,使用率为 50% ,挂载点为 /data。
# 关键指标:Use%(使用率),当超过90%需立即排查  

Java存在这样一种风险,即磁盘满的状态会致使JVM没办法生成Heap Dump,所以需要配置-XX:HeapDumpPath到并非根分区的地方。

14.free- 内存使用情况

使用场景:分析物理内存 /swap 空间使用

# 以人类可读格式显示内存状态  
free -h  
# 输出示例:  
总共,被使用的,空闲的,共享的,缓冲/缓存,可利用的 ,这里一共列出了六个指标 ,每个指标都有其特定的含义 。
这儿有关于内存的一组数据,分别是7.8G、4.0G、1.5G、256M、2.3G以及3.5G。第一个数字与第二个数字不同,第二个数字和第三个数字不一样,第三个数字跟第四个数字有别,第四个数字分别和第五个第七数字大不一样,这样的一组数据存在于内存相关的信息。
交换空间:2.0吉字节。当前已用该交换空间0字节。空闲及总的使用情况为2.0吉字节。
# 关键指标解读:  
# Mem.total:总物理内存  
# Mem.free:空闲内存  
# Mem.buff/cache:缓冲/缓存内存(可回收)  
# Swap:交换空间使用情况(频繁使用表示内存不足)  

对于Java进行调优时,倘若buff与cache所占的比例处于较高状态,这属于正常的情况,而要是swap被频繁地加以运用,那么得对内存泄漏展开排查 。

15.du- 目录空间占用分析

用于定位大文件的场景,比如异常大的日志文件,还有未能清理的Heap Dump文件 。

# 查看当前目录下各文件夹大小(按降序排列)  
先使用显示磁盘已使用空间大小且以人类可读的形式,同时按照指定最大深度为1级目录来进行展示,之后再对其。
# 输出示例:  
# 4.0G    ./logs  
# 2.0G    ./data  
# 100M    ./tmp  
# 查找大于1GB的文件  
查找,位于目录 /var/log/ 下,类型为文件,大小大于 1G 的文件,执行 du -h 命令并传入该文件路径 。
# 清理大文件前预览  
执行“du -h /var/log/*”命令,将其结果通过管道传递给“sort -rh”命令进行反向排序,再将排序后的结果通过管道传递给“head -n。

对Java进行操作,要定期去清理位于/tmp之中的临时文件,以此来避免磁盘空间出现耗尽的情况。

总结:从命令到排查体系

将这15个命令予以掌握,能够对80%以上的Java线上问题排查场景进行覆盖。在实际操作期间是需要加以注意的事情,。

对于权限方面存在这样的问题,有一些命令,比如说像top及lsof这类命令,是需要root权限来执行的,所以要提前去申请sudo ;在探讨性能产生的影响的时候,要注意避免在处于高负载状态的服务器之上执行命令,诸如find / -size这类全路径扫描的命令 ;关于工具组合这一方面,要把Java自身所携带的工具,也就是jps、jstack以及jmap,和APM工具,也就是Prometheus和Grafana,结合在一起,从而去形成一个完整的排查体系。

建议开发者去构建个人命令手册,把常用组合给记录下来,像ps -ef | grep -v grep | awk '{print $2}'这样的,并且借助man命令深入领会每个参数的底层逻辑。线上排查的关键并非在于记住多少数量的命令,而是要凭借系统化的思路,迅速地定位问题的本质所在,最终达成从“命令使用者”到“问题解决者”的能力提升。

相关推荐: