这属于是生产环境中的问题了,主要考察有没有 linux 中排查问题的经验,以及对 linux 排查问题的命令是否熟悉
显示 cpu 使用率,执行完该命令后,输入 P,按照 cpu 使用率排序
使用 top -c
命令,找到占用 cpu 最多的进程 id(找 java 项目的)
通过 top -Hp <进程id>
命令,显示这个进程中所有【线程】的详细信息,包括每个线程的 CPU 使用率、内存使用情况、线程状态
找到 cpu 使用率最高的那个 java 进程,记下进程 id
通过 printf "%x\n" <线程id>
命令输出这个线程 id 的 16 进制
通过命令 jstack <进程id> | grep '<16进制线程id>' -C5--color
定位到占用 cpu 过高的代码
jstack 生成该进程的堆栈信息,通过线程的 16 进制线程 id 过滤出指定线程的信息
-C5 表示显示匹配行的 5 行上下文
–color:高亮显示,方便阅读
这也是生产环境的问题,还是考察对 linux 命令了不了解,可以看一下,扩展一下思路
这种情况下,一般是因为你使用 kill 命令杀的这个进程是一个子进程,这是因为子进程释放了资源,但是没有得到父进程的确认,就导致这个子进程变成了 僵尸进程
,也就是 zombie 状态
这种情况,一般将这个僵尸进程的父进程给 kill 掉即可
使用命令 ps aux
,找到 STAT 这一栏为 Z 的进程,就是僵尸进程,记下进程 id
使用命令 ps -ef | grep <僵尸进程id>
通过 kill 命令杀死父进程即可
其实线上机器的磁盘写满,基本上都是日志导致磁盘写满了,这里考察的就是 linux 中查看磁盘占用的命令
使用命令 df -h
查看磁盘的使用情况
找到系统部署的位置,找一下日志在哪里存储,删除掉一些日期比较旧的日志即可
可以写一个 shell 脚本,定时删除 7 天之前的日志数据
快捷查找:
可以通过命令
find / -size +100M | xargs ls -lh
快速找到在根目录下,大于 100M 大小的文件
也可以使用命令
du -h > fs_du.log
会扫描当前执行命令的目录以及子目录中磁盘的使用情况,并将结果输出到 fs_du.log 文件中
也可以执行扫描目录,例如扫描 /path 目录下
du -h /path > fs_du.log