🚩Linux 面试题
目录
注意
本文最后更新于 2023-01-10,文中内容可能已过时。
jstack 的使用方式/如何排查 CPU 飙升问题?
jps -l
:先找到正在运行的 Java 进程的进程 ID。jstack -l 1234 > thread_dump.txt
:生成 Java 进程的线程快照,包括所有线程的堆栈跟踪信息、线程状态、锁信息等,使用>
输出到文件- 使用
-l
输出锁的信息 - 使用
-gc
输出 gc 信息
- 使用
- 使用 VisualVM 读取以上文件,进行可视化分析。
CPU 占用 100% 可能是什么引起的?
CPU密集型操作:
- 频繁的GC; 如果访问量很高,可能会导致频繁的GC甚至FGC。当调用量很大时,内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升。
- 序列化和反序列化。当程序执行xml解析时,调用量会增加,从而导致CPU变满。
- 正则表达式。我遇到了正则表达式使CPU充满的情况; 原因可能是Java正则表达式使用的引擎实现是NFA自动机,它将在字符匹配期间执行回溯。
- 线程上下文切换; 有许多已启动的线程,这些线程的状态在Blocked(锁定等待,IO等待等)和Running之间发生变化。当锁争用激烈时,这种情况很容易发生。
- 有些线程正在执行非阻塞操作,例如
while(true)
语句。如果在程序中计算需要很长时间,则可以使线程休眠。
如何切换 jdk 版本?
sudo update-alternatives --config java
如何查看磁盘使用情况?
df -h
:其中 -h 选项可以将磁盘大小、已用空间、可用空间以 GB 或 MB 显示du -h
:递归地计算目录和文件的大小,可以帮助我们查找磁盘空间占用大的文件和目录du --max-depth=1 -h
只看目录占用大小
查看日志的命令
- 实时监控日志最后 100 行
- tail -n 100 -f xxx.log
- 按行号查询
- 收尾 100 行:head/tail -n 100
- 第 100-300 行:cat xx.log | tail -n +100 | head -n 200
- 按日期查询
- sed -n’/2023-06-17 08:00:000/,/2023-06-23 17:00:000/p’ xx.log
- 以上两个时间必须在日志中出现过
- 查询并输出日志
- cat -n xx.log | grep “error” | error.txt
线上诊断:Arthas,指定 ip+port 即可
CPU 调度算法
FCFS(First Come First Serve) 先来先服务:对短作业不利,但影响用户体验。
SJF(Shortest Job First)短作业优先:改进用户体验,但对长作业不利,基于执行历史来预测进程时间,难以准确知道下一个 CPU 的执行期。
HRRN(Highest Response Ratio Next) 高响应比优先:权衡长短作业
RR(Round Robin)时间片轮转调度:有利于交互式计算,但对于进程大小相似的不利
HPF(Highest Priority First) 最高优先级调度:优先级低的进程会产生饥饿现象。
Multilevel Feedback Queue 多级反馈队列:有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短,如果有新的进程加入优先级高的队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列。对于短作业可能可以在第一级队列很快被处理完。对于长作业,如果在第一级队列处理不完,可以移入下次队列等待被执行,虽然等待的时间变长了,但是运行时间也会更长了,所以该算法很好的兼顾了长短作业,同时有较好的响应时间。
Linux 常用指令
- 查看占用端口号
lsof -i
- 查看所有进程情况
ps
、pstree
- 压缩:
tar -czvf
- 解压缩:
tar -xzvf