🚩Linux 面试题

注意
本文最后更新于 2023-01-10,文中内容可能已过时。

jstack 的使用方式/如何排查 CPU 飙升问题?

  1. jps -l:先找到正在运行的 Java 进程的进程 ID。
  2. jstack -l 1234 > thread_dump.txt:生成 Java 进程的线程快照,包括所有线程的堆栈跟踪信息、线程状态、锁信息等,使用 > 输出到文件
    1. 使用 -l输出锁的信息
    2. 使用 -gc 输出 gc 信息
  3. 使用 VisualVM 读取以上文件,进行可视化分析。

CPU 占用 100% 可能是什么引起的?

CPU密集型操作:

  1. 频繁的GC; 如果访问量很高,可能会导致频繁的GC甚至FGC。当调用量很大时,内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升。
  2. 序列化和反序列化。当程序执行xml解析时,调用量会增加,从而导致CPU变满。
  3. 正则表达式。我遇到了正则表达式使CPU充满的情况; 原因可能是Java正则表达式使用的引擎实现是NFA自动机,它将在字符匹配期间执行回溯。
  4. 线程上下文切换; 有许多已启动的线程,这些线程的状态在Blocked(锁定等待,IO等待等)和Running之间发生变化。当锁争用激烈时,这种情况很容易发生。
  5. 有些线程正在执行非阻塞操作,例如 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 调度算法

  1. FCFS(First Come First Serve) 先来先服务:对短作业不利,但影响用户体验。

  2. SJF(Shortest Job First)短作业优先:改进用户体验,但对长作业不利,基于执行历史来预测进程时间,难以准确知道下一个 CPU 的执行期。

  3. HRRN(Highest Response Ratio Next) 高响应比优先:权衡长短作业

  4. RR(Round Robin)时间片轮转调度:有利于交互式计算,但对于进程大小相似的不利

  5. HPF(Highest Priority First) 最高优先级调度:优先级低的进程会产生饥饿现象。

  6. Multilevel Feedback Queue 多级反馈队列:有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短,如果有新的进程加入优先级高的队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列。对于短作业可能可以在第一级队列很快被处理完。对于长作业,如果在第一级队列处理不完,可以移入下次队列等待被执行,虽然等待的时间变长了,但是运行时间也会更长了,所以该算法很好的兼顾了长短作业,同时有较好的响应时间。

Linux 常用指令

  • 查看占用端口号 lsof -i
  • 查看所有进程情况 pspstree
  • 压缩:tar -czvf
  • 解压缩:tar -xzvf

参考资料

0%