Linux-----进程管理面试题
怎么排查Linux服务器卡顿
按从简单到复杂顺序查:
- 先看整体负载:
uptime看系统忙不忙;查看系统开机时长、当前时间、登录用户数、1/5/15分钟平均负载 - 查 CPU:是不是某个程序疯狂跑占满 CPU;top
- 查内存:内存不够会不会在疯狂读写硬盘 Swap;free -h
- 查磁盘 IO:硬盘读写卡死(最容易忽略,磁盘慢服务器直接卡);iostat -x 1 :磁盘IO性能 iotop :哪个进程读写磁盘
- 查磁盘空间:
df -h看磁盘是不是 100% 满了; - 查网络:带宽打满、大量连接拖慢系统;ip ss端口 ping连通性 traceroute路由 iftop看网络流量
- 查内核日志:
dmesg看有没有 OOM 杀进程、硬件报错、内核崩溃;journalctl 内核日志 - 最后查有没有定时任务跑大量脚本、挖矿病毒。
交换(Swap)内存不足时,系统把内存数据挪到硬盘Swap分区,这个行为叫 换出(swap out);再读回来叫 换入(swap in)
free后怎么查找占用高的进程
- 输入
free -h先看内存整体; - 敲
top命令,按大写M,自动按内存从高到低排序,前面的就是吃内存大户; - 也可以直接一条命令列出:
ps aux --sort=-rss; - 装个 htop 更直观,鼠标点一下就能按内存排序。
怎么看我当前的这个 Linux 系统的 CPU 详细信息是多少?
- 最简单一条:
lscpu直接显示:几颗物理 CPU、多少核心、多少超线程、主频、缓存大小、架构; - 只想看 CPU 型号:
cat /proc/cpuinfo | grep "model name"; - 数核心:看有多少个 processor 就是逻辑 CPU 总数。
可用内存怎么看,主要关注哪些数据?
命令:free -h只记 3 个关键点:
- available(最关键):系统实打实还能分给新程序用的内存,别看 free 那一列;
- Swap used:交换分区如果一直在涨,说明物理内存不够用了,硬盘疯狂读写,服务器必卡;
- buff/cache:Linux 闲着也是闲着,拿多余内存加速硬盘读写,这个数值大完全不用慌,内存不够系统会自动收回来。
判断:available 充足、Swap 几乎不用 = 内存健康;Swap 一直在跳涨 = 内存瓶颈。
Linux中查看系统性能的命令
- CPU:uptime、top、mpstat、pidstat
- 内存:free、vmstat
- 磁盘 IO(卡顿重灾区):iostat、iotop、df
- 网络:ss、iftop
- 日志查异常:dmesg、journalctl
CPU出现问题怎么排查?
- 先用 uptime 看负载,4 核机器负载长期大于 4,就是 CPU 扛不住;
- 打开 top 看三列:
- us(用户态高):业务代码死循环、疯狂计算,程序本身问题;
- sy(内核态高):系统内核频繁干活、频繁调用系统接口;
- wa(iowait 高):根本不是 CPU 坏了,是硬盘读写太慢,CPU 在干等磁盘;
- top 按大写 P,按 CPU 占用排序,找到占用最高的进程 PID;
- 看进程里面哪个线程耗资源,排查代码死循环、定时任务扎堆执行、挖矿程序。
CPU爆满怎么查、内存泄漏怎么定位
(1)CPU 爆满排查
- 看负载 → top 区分是纯计算还是等硬盘 IO;
- 揪出高占用进程 → 拆解内部线程;
- 查代码 bug(死循环、无限递归)、定时任务、恶意进程。
(2)内存泄漏
内存泄漏:程序申请了一块内存,用完之后代码忘了还给系统,越跑占用越多,慢慢把内存吃光。
排查步骤:
- 持续观察 free,available 一点点往下掉,Swap 慢慢上涨;
- top 按 M 排序,锁定内存只涨不跌的那个进程;
- 对应语言工具查: Java 用 jmap 导出堆文件分析,C 语言用 valgrind,Python 用内存检测模块;
- 改代码:关闭没释放的连接、清空无限膨胀的缓存、销毁没用的对象。
什么是oom,有 swap 为什么还会 OOM killer 杀进程
解释 OOM
OOM = 内存用光了。Linux 内核有个自保程序叫 OOM Killer,为了防止整个服务器彻底死机,直接把最吃内存的进程干掉,腾出内存救系统。
有 Swap 还被杀的 4 个原因
- Swap 是硬盘,速度比内存慢几万倍,如果大量往 Swap 挪数据,服务器直接卡死,内核不等慢慢交换,直接杀程序最快;
- 系统参数 swappiness 设置太低,告诉内核尽量别用 Swap,内存一耗尽直接触发 OOM;
- 程序一次性要一大块连续内存,Swap 在硬盘上是零散空间,凑不出连续大块内存,分配失败触发杀进程;
- 内核自己内存泄露了,驱动 / 内核模块占死内存,就算应用没占满内存,也会触发 OOM。
查看历史被杀记录:dmesg -T | grep oom
什么是swap?他和虚拟内存是一种东西吗
- Swap(交换分区):在硬盘上划出来一块空间,当物理内存不够时,系统把暂时不用的数据扔到硬盘里,腾内存给正在活跃的程序用。缺点就是巨慢。
- 虚拟内存:是一整套操作系统的管理规则。简单说:让软件以为自己拥有超大内存,不用管实际物理内存条多大,里面包含分页、缺页调用、Swap 硬盘缓存这一整套机制。
一句话总结:虚拟内存是一套大规则,Swap 只是这套规则里用到的硬盘存储空间,Swap 属于虚拟内存的一部分,不能完全划等号。
Cpu的使用率计算原理是什么
- Linux 内核有个像秒表一样的计数器,不停在跳,把 CPU 每时每刻干的活分成 7 类:跑用户程序、跑内核、闲着发呆、等硬盘、处理中断等等;
- 隔一小段时间读两次这个秒表数字,算出差值;
- 用公式:
CPU使用率 =(总干活时间 - 纯发呆空闲时间)÷ 总运行时间 ×100%
补充: 单核 CPU 满负荷是 100%,8 核跑满 top 会显示 800%;按键盘数字 1,可以看到每一个核心各自占用多少。
free 这个命令它输出的结果当中,它的 free 那行和 available 那行,这两列的区别是什么呢
1. Mem.free(free 那一列)
字面意义上彻底空着、啥都没放的裸内存。 Linux 系统有个习惯:空闲内存不会白白浪费,会拿去做磁盘缓存(buff/cache)加速读写,所以 free 数值通常很小,这个数字参考价值极低,不能用来判断够不够内存。
2. available(最核心)
系统真正可以立刻拿出来分给新程序的总内存组成 = 狭义 free 内存 + 可以快速回收的 buff/cache 缓存内存 + 可回收的共享内存。
一句话记死
- free:剩在手里完全闲置的零花钱
- available:零花钱 + 存在余额宝里随时能取出来的钱 判断内存够不够只看available,别看 free。
如何排查一个系统的CPU负载情况,你说uptime,使用uptime命令后有几个数展示,分别代表什么。
举个例子输出:16:25 up 8 days, 4:12, 2 users, load average: 0.35, 0.41, 0.30
一段一段翻译:
16:25:服务器现在几点up 8 days, 4:12:机器开机连续运行了 8 天 4 小时 12 分钟2 users:目前有 2 个人登录了这台服务器load average: 0.35, 0.41, 0.30三个核心负载数字
- 第一个:最近 1 分钟的平均负载
- 第二个:最近 5 分钟的平均负载
- 第三个:最近 15 分钟的平均负载
uptime的负载数是怎么计算的,和CPU核数是什么关系。
负载到底统计啥
系统统计等着要用 CPU 干活的进程总数平均值,包括三种: 正在 CPU 跑的程序、排着队等 CPU 的程序、卡死在磁盘 IO 动不了的程序。 内核定时采样算出来的平均值。
和 CPU 核数最简单理解
举例子:4 核 CPU
负载 = 4:CPU 刚好全部拉满,刚刚好
负载<4:CPU 还有空余,很轻松
负载>4:活太多,任务排队堵了,服务器压力大
口诀:负载数字等于 CPU 核心数就是满载线
CPU使用率越高,uptime越高吗
不一定,完全两码事
情况 1:正常挂钩(最常见)
程序疯狂算东西、死循环、打包编译,CPU 跑满,任务排队,负载跟着涨。
情况 2:负载很高,CPU 却很闲(经典坑)
大量程序卡在读写硬盘(IO 阻塞),进程一动不动不耗 CPU,但系统会把它算进负载里。 现象:load 飘很高,top 看 CPU 使用率几乎为 0。
情况 3:CPU 很高,负载却很低
4 核服务器,只跑一个单线程程序占满其中 1 个核心 整体 CPU 使用率 25%,负载只有 1 左右,数字看着一点不高。
