一、快速根据关键字定位错误信息
grep 命令
查找包含关键字的日志内容
在 Linux 系统中,可以使用 grep 命令来查找日志文件中包含特定关键字的行。假设你的日志文件路径为 /var/log/myapp.log,你想要查找包含关键字 "abc" 的日志内容,可以按照以下步骤操作:
如果你很明确要找的内容在某一个文件xxx.log中,可以使用下面两条命令输出内容所在行号:
cat xxx.log |grep -n "xxx"
或
grep -n "xxx" xxx.log
如果你有大量的日志文件,不确定要找的东西在哪里,可以使用递归搜索,这条命令可以快速找到所有含关键字的行
grep -r -n "xxx" .
-r :递归搜索,即搜索当前目录及其子目录中的所有文件。. :表示当前目录。-n:输出行号
这个命令会在当前文件夹及其所有子文件夹中的所有文件内搜索包含“xxxx”这段文字的行,并将结果输出。
找到行号后,通过下一条命令 直接输出当前行号下的日志
这个命令是用来查看一个日志文件 xxx.log 中特定范围的行。从第 501 行开始,显示接下来的 100 行日志
tail -n +501 xxx.log | head -n 100
这样可以更快速更精准的定位到关键日志,而不是去打开日志文件来搜索,或者二次触发bug,来查看日志,这些命令能够帮助你更高效地查找和分析日志文件中的特定信息。
正则搜索
某个服务的日志文件保存在以 personnel 开头的多个文件夹中,需要查找特定关键字(如异常信息、用户ID、错误码等),可以使用下面这句命令:
find . -type d -name "personnel*" -exec grep -rn "关键字" {} +
这条命令是 Linux 上的 find 命令,用于在指定的目录及其子目录中搜索符合条件的文件夹,并执行指定的操作。以下是这条命令的详细解释:
命令详解
find .
表示从当前目录(.)开始递归查找。可以替换成指定的路径(如 /path/to/start)。
-type d
指定查找的文件类型为目录(directory)。
-name "personnel*"
匹配名称以 personnel 开头的目录。* 是通配符,表示任意字符。
-exec
指定对找到的目录执行接下来的命令。
grep -rn "关键字" {}
对找到的目录使用 grep 命令进行关键字搜索,find 查找到的目录名会替换 {}。
+
表示将所有匹配的目录作为参数一起传递给 grep,而不是对每个目录分别执行一次。这种方式通常比 \; 更高效。
如果你希望从当前目录开始递归查找所有名字以 personnel 开头的文件,并在这些文件中搜索特定的关键词,可以使用以下命令:
find . -type f -name "personnel*" -exec grep -rn "关键词" {} +
二、动态实时查看日志
tail 命令
tail -f xxx.log实时展示日志末尾内容,默认最后10行,相当于增加参数 -n 10
tail -f server.log
查看日志正数20行内容
tail -n +20 xxx.log
cat 命令
cat 区别于tail是对日志进行全文搜索,其中-n的作用是显示行号
cat -n xxx.log | grep "xxx"
-C 选项来显示检索结果的前后几行,-A 选项展示检索结果后几行,-B选项展示检索结果前几行
cat -n xxx.log | grep -C 5 'xxx'
less 命令
less 命令多用于读取文本文件,也可用于读取实时被更改的文件。ctrl +c 中断实时读取显示,按 q 会退出less视图,选项 +F 可以实时跟踪文件的更改:
less +F xxx.log
第一步:打开日志文件
less xxx.log
第二步:定位到日志文件的最后一行:
shift+g 移动到最后一行
第三步:往前一页一页翻页查看
ctrl+b
1.全屏导航
ctrl + F - 向前移动一屏
ctrl + B - 向后移动一屏
ctrl + D - 向前移动半屏
ctrl + U - 向后移动半屏
vim编辑模式
进入编辑日志文档
vim xxx.log
正向查找,配合n键可以将光标移动到下一个符合条件的地方
/关键字
反向查找,配合shift + n 键可以将光标移动到下一个符合条件的地方
?关键字
三、 常用监控命令
1. free 命令
free 命令是Linux系统中用于显示内存使用情况的一个常用工具。它提供了关于系统内存使用的详细信息,包括物理内存(RAM)和虚拟内存。当你在终端中运行 free 命令时,它会显示几个与内存使用相关的值。以下是这些值的含义:
total:表示系统中物理内存(RAM)的总量,单位可以是千字节(KB)、兆字节(MB)或吉字节(GB)。used:显示当前正在被各种进程和操作系统本身使用的物理内存量。free:表示当前未被使用的物理内存量。shared:表示多个进程共享的内存量。buffers:显示用于缓冲磁盘I/O操作的内存量。cache:表示用于缓存从磁盘或其他存储设备频繁访问的数据的内存量。available:表示估计的可用内存量,用于新进程分配。它考虑到了用于缓冲和缓存的内存,如果需要,可以被其他应用程序释放。
常用参数:
-b 以Byte为单位显示内存使用情况。-k 以KB为单位显示内存使用情况。-m以MB为单位显示内存使用情况。-h 以比较人性化的方式显示内存使用情况。-o 不显示缓冲区调节列。-s <间隔秒数> 持续观察内存使用状况。-t 显示内存总和列。-V 显示版本信息
free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息
2.top命令
实时监控系统的运行状态,并且可以按照cpu及内存等进行排序
top 命令是 Linux 和其他类 Unix 系统上常用的实时系统监控工具,它提供了一个动态的、交互式的实时视图,显示系统的整体性能信息以及正在运行的进程的相关信息。这个命令是系统管理员最重要的工具之一,被广泛用于监视服务器的负载。top 命令是一个交互命令,在运行 top 的时候还可以运行很多命令。
命令行选项
-d <秒数>:指定top命令的刷新时间间隔,单位为秒。-n <次数>:指定top命令运行的次数后自动退出。-p <进程ID>:仅显示指定进程ID的信息。-u <用户名>:仅显示指定用户名的进程信息。-H:在进程信息中显示线程详细信息。-i:不显示闲置(idle)或无用的进程。-b:以批处理(batch)模式运行,直接将结果输出到文件。-c:显示完整的命令行而不截断。-S:累计显示进程的CPU使用时间。
显示信息
总体系统信息:包括系统的运行时间和平均负载、当前运行的进程和线程数目、总体CPU使用率和各个核心的使用情况、总体内存使用情况、可用内存和缓存。
进程信息:包括进程的标识符、运行进程的用户名、进程的优先级、进程的优先级调整值、进程使用的虚拟内存大小、进程实际使用的物理内存大小、进程共享的内存大小、进程占用CPU的使用率、进程占用内存的使用率、进程的累计CPU时间。
实际实例分析
下面是在一台机器上跑了 top 之后得到的信息,我们来分析一下
top - 09:45:49 up 166 days, 30 min, 5 users, load average: 39.40, 103.11, 159.44
Tasks: 274 total, 2 running, 272 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.1 us, 44.8 sy, 0.0 ni, 0.0 id, 43.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31947.6 total, 196.5 free, 31877.2 used, 352.2 buff/cache
MiB Swap: 976.0 total, 0.0 free, 976.0 used. 70.4 avail Mem
从你提供的 top 命令输出来看,系统存在严重的性能问题,主要表现为 IO 瓶颈 和 内存耗尽,具体分析如下:
1. 系统负载(load average)异常高
load average: 39.40, 103.11, 159.44
这三个数值分别代表系统过去 1 分钟、5 分钟、15 分钟的平均负载。
正常情况下,负载值应接近或小于 CPU 核心数(例如 8 核 CPU 负载应在 8 左右)。而当前数值(尤其是 15 分钟均值 159.44)远高于正常范围,说明系统长期处于超负荷状态。
结合其他指标,这种高负载主要由 IO 等待 引起(而非 CPU 计算密集)。
2. CPU 资源被 IO 等待严重占用
%Cpu(s): 12.1 us, 44.8 sy, 0.0 ni, 0.0 id, 43.0 wa, ...
us(用户态 CPU):12.1%,正常范围。sy(内核态 CPU):44.8%,偏高,可能是内核在处理大量 IO 请求。wa(IO 等待):43.0%,非常高!表示 CPU 有 43% 的时间在等待磁盘 IO 操作完成,是系统卡顿的核心原因。id(空闲 CPU):0.0%,CPU 完全没有空闲,资源耗尽。
3. 内存和交换空间(swap)耗尽
MiB Mem : 31947.6 total, 196.5 free, 31877.2 used, 352.2 buff/cache
MiB Swap: 976.0 total, 0.0 free, 976.0 used. 70.4 avail Mem
物理内存(Mem):总内存 32GB,已使用 31.8GB,仅剩 196MB 空闲,几乎耗尽。交换空间(Swap):总大小 976MB,已完全用尽(0 空闲)。avail Mem 仅 70.4MB:系统可立即分配的内存极少,内存严重不足。
综合结论:系统因内存耗尽导致严重 IO 阻塞
内存枯竭:物理内存和 swap 完全用尽,系统被迫频繁进行内存页面交换(swap in/out)。IO 风暴:内存交换依赖磁盘 IO,导致 kswapd0 进程(内存交换守护进程)频繁读写磁盘,引发极高的 IO 负载(wa 43%)。恶性循环:IO 阻塞导致 CPU 等待,系统响应变慢,进而加剧任务堆积,使负载持续升高。
紧急处理建议
当前系统已处于严重过载状态,可能出现响应迟缓、服务中断等问题,建议优先处理内存和 IO 瓶颈。
kswapd0 是 Linux 内核中的一个内核线程(kernel thread),专门负责 内存页面回收(memory
reclaim) 的。 简单来说,它的作用就是: 👉 当系统内存不足时,kswapd0
会在后台自动工作,释放内存、回收页面,以防止系统因为内存耗尽而卡死。
kswapd0 在以下情况会变得非常活跃:
系统内存紧张(可用内存低于阈值)程序占用大量内存(例如 Java、数据库)文件缓存(page cache)占用太多内存存在内存泄漏
四、线上出现 OOM(OutOfMemoryError)
很好,这个问题很实战,也非常重要。
线上出现 OOM(OutOfMemoryError),往往最先要做的就是:
快速定位是哪台机器、哪个服务 OOM,为什么。
下面用详细但通俗的方式一步步告诉你如何定位线上 OOM 是哪个服务导致的。
🚀 2️⃣ ssh 登录到那台机器,查看 OOM 日志
✅ 查看系统日志
dmesg | grep -i kill
# 或
cat /var/log/messages | grep -i "Out of memory"
# 或
journalctl -k | grep -i kill
示例输出:
[123456.789] Out of memory: Kill process 12345 (java) score 999 or sacrifice child
Killed process 12345 (java) total-vm:2048000kB, anon-rss:1024000kB, file-rss:0kB, shmem-rss:0kB
process 12345 (java) 表示是一个 java 进程。可以看 pid 和被杀前内存使用量。
🚀 3️⃣ 确定是哪个服务的进程 OOM
同一台机器可能部署多个服务(多容器、多进程)。
常用以下方法:
✅ (1) 根据 pid 查进程命令行
ps -ef | grep 12345
就能看到:
java -jar your-service-name.jar ...
马上知道是哪个服务。
✅ (2) 如果是 docker / k8s
docker:
docker ps
docker top
docker inspect
k8s:
kubectl get pod -o wide
kubectl describe pod
kubectl logs
如果 pod 因 OOM 被杀掉:
kubectl get events --sort-by='.metadata.creationTimestamp'
就能看到:
Warning OOMKilled kubelet ... Container killed due to memory limit
🚀 4️⃣ 事后查看 JVM OOM dump 文件
如果 JVM 配置了:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.hprof
就会在 OOM 时生成一个 dump.hprof 文件。
下载到本地后,用 MAT (Memory Analyzer Tool)、VisualVM 打开,分析是谁占用了最多的内存(比如缓存太大、List 没清理、Netty 堆积)。
五、线上出现CPU过载
1. 定位占用 CPU 的进程
top
使用 top 找到 CPU 占用最高的 PID,假设是 12345。
2.进一步查看线程级别(找出哪条线程在“烧 CPU”)
top -Hp 12345
这会显示该进程内所有线程的 CPU 占用情况。
找到一个 CPU 高的线程号,例如 56789。
把它转成十六进制:
printf "%x\n" 56789
假设结果是 0xdd85。
3. 结合 Java(或其他语言)分析
如果是 Java 应用(如 Spring Boot),用以下命令导出线程堆栈:
jstack 12345 | grep -A 50 dd85
然后你就能看到是哪段代码在占用 CPU —— 比如一个死循环、频繁的日志输出、线程池爆炸等。
六、JPS命令
很好,这个问题问得很实用!
jps 是 JDK 自带的一个命令行工具,全名叫:
Java Virtual Machine Process Status Tool
它的作用就是:
列出当前机器上所有正在运行的 Java 进程(JVM),以及它们对应的主类(Main Class)。
🚀 为什么常用 jps?
因为在一台机器上,可能同时跑很多个 Java 服务,比如:
salary-boot.jarreport-boot.jarnginx (不是 Java)mysql (也不是 Java)
用 ps -ef | grep java 虽然也能查到 Java,但没有专门针对 JVM。
而 jps 专门用来找 JVM:
它只列出 Java 进程能直接显示出 主类名 或 jar 包名
🔍 最常用命令示例
jps -l
输出:
12345 com.dekeinfo.personnel.ApplicationMain
23456 org.springframework.boot.loader.JarLauncher
34567 sun.tools.jps.Jps
12345 是进程号(PID)com.dekeinfo.personnel.ApplicationMain 是启动类(如果是 Spring Boot 就是你的 main() 类)JarLauncher 则表示用 spring-boot-loader 启动的 jar
这样就可以很快看出:
✅ 哪些 Java 应用正在跑
✅ 分别对应哪个类
🛠 常用选项
命令说明jps列出所有 Java 进程 PIDjps -l列出全类名(包名+类名)或 jar 的全路径jps -v显示 JVM 启动参数(如 -Xmx)jps -m显示传给主类的参数(main(String[] args))