磁盘相关案例
磁盘相关案例
[TOC]
01.三者关系
下面用通俗易懂的语言,结合 内存、CPU 和系统负载(Load) 三者的关系,帮你理清它们之间的联系
🌟 先说说三个“角色”是干啥的:
| 角色 | 通俗解释 | 类比 |
|---|---|---|
| 内存(Memory) | 电脑的“工作台”.程序运行时,数据放在这里,方便快速取用 | 厨房的操作台:菜、刀、调料都摆上面才做得快. |
| CPU | 电脑的“大脑”.负责计算、执行指令 | 厨师本人:动手切菜、炒菜、尝味道. |
| 系统负载(Load) | 表示“有多少活在排队等 CPU 干”,包括正在干的 + 等着干的(尤其是 | 厨房里:正在炒菜的 + 站着等锅用的 + 等水烧开的人总数. |
💡 注意:Load 高 ≠ CPU 高!比如很多进程在等磁盘读写(I/O wait),CPU 可能很闲,但 Load 很高
- **load负载跟CPU的核心数有关**
- **负载达到4说明满负荷状态**
- 负载 = 4,在 4 核机器上 ≈ CPU 刚好满载🤔 内存高,CPU 一定会高吗?
不一定!
就像你把厨房操作台堆满了食材(内存高),但厨师(CPU)可能正坐着喝茶(空闲)——内存高,CPU 低
反过来,厨师疯狂炒菜(CPU 高),但只用了一点点食材(内存低)——内存低,CPU 高
- **tar命令(**压缩算法**)瞬间占用CPU使用率**✅ 所以:内存和 CPU 是两个独立资源,一个高不代表另一个也高
🔗 但某些情况下,内存高会“拖累”CPU 和 Load
当内存不够用时,系统会“借”硬盘当临时工作台(叫 Swap).但硬盘比内存慢几百倍!
这时候:
-
厨师(CPU)老要跑去地下室(硬盘)拿东西;
-
操作台(内存)不断腾地方,搬进搬出;
-
厨师累得满头汗(CPU 忙于搬运,不是做菜)
-
很多人排队等(Load 升高);
(业务场景不用swap)
📊 三者关系速查表
| 场景 | 内存 | CPU 使用率 | 系统 Load | 说明 |
|---|---|---|---|---|
| 正常大应用 | 高 | 低 | 低 | 如 Java 服务启动后空闲,占内存但不干活 |
| 计算密集型任务 | 低 | 高 | 中~高 | 如视频转码、科学计算,CPU 满载 |
| 内存不足 + Swap | 满(+ Swap 使用高) | 中~高(尤其 sys%)I/O也高 | 很高 | 频繁换页,I/O 等待多 |
| 大量 I/O 等待 | 正常 | 低(但 iowait 高) | 很高 | 如数据库查慢磁盘,CPU 闲但 Load 高 |
| 系统空闲 | 低~中(缓存占一部分) | 低 | 接近 0 | 正常状态 |

参考笔记进程管理,里面有详细的排查流程!
💬 总结一句话:
内存高本身不会让 CPU 或 Load 升高,但一旦内存不够、开始用硬盘(Swap),就会拖慢整个系统,导致 CPU 忙于“搬运”,Load飙升
当 CPU 使用率高(尤其是用户态或系统态持续满载)时,Load 一般也会升高
⚠️ 但要注意:Load 的“单位”是什么?
Linux 中:
Load = 平均“运行进程”或“不可中断睡眠”的进程数 ✅️
-
运行进程(Runnable):正在用 CPU 或等着用 CPU(这是和 CPU 直接相关的部分)
-
不可中断睡眠(D 状态):比如等磁盘 I/O(这部分和 CPU 无关!)
🧒 举个“水桶”的比喻
想象你的程序是一个 水桶(代表可用内存),程序运行时会往桶里倒水(申请内存).
✅ 正常情况:
-
用完水 → 把水倒掉(释放内存).
-
桶不会满,一直能用.
❌ 内存泄漏(Memory Leak):
-
你不断往桶里加水,但忘了关水龙头,也不倒掉旧水.
-
桶里的水 越积越多,但其实很多水早就没用了.
-
桶还没满,但快了……
🔍 内存泄漏 ≠ 程序崩溃,它是一个 缓慢积累的过程.
💥 OOM(Out of Memory):
-
桶终于 彻底满了,再也装不下一滴水.
-
这时你再想加水,系统大喊:“没地方了!崩!”
-
程序直接 被杀死或抛出异常.
⚠️ OOM 是结果,内存泄漏是常见原因.
| 项目 | 内存泄漏(Memory Leak) | OOM(Out of Memory) |
|---|---|---|
| 本质 | 程序没有释放不再使用的内存 | 系统/进程无法分配更多内存 |
| 发生时机 | 逐渐发生,可能运行几小时/几天后才显现 | 瞬间发生,当内存需求 > 可用内存时 |
| 程序状态 | 通常还在运行,但越来越慢、内存越来越高 | 崩溃、退出、抛异常 |
| 是否致命 | 不立即致命,但会导致 OOM | 致命错误 |
🔗 它们的关系?
内存泄漏 → 内存占用越来越高 → 最终耗尽内存 → 触发 OOM
所以:
-
内存泄漏是“慢性病”
-
OOM 是“猝死”
Linux系统自我保护机制:
- 内存使用100%,为了能让自己正常运行,杀死一个进程
自己杀自己
- tar命令(压缩算法)瞬间占用CPU使用率
什么原因会导致oom?
-
业务访问量大(增加内存)
-
开发代码问题(java) 企业最常见的
-
业务波动导致
-
内部测试(测试服务器)
-
对于一些性能要求比较高服务器,我们这个swap直接关闭掉了.
- *因为未来我们的物理内存还是比较充足的.*
解决oom内存溢出!
-
增加内存条
- 这样的操作避免不了**重启Linux系统**,安内存条,太慢了.- 不能保证网站能够顺利流畅的运行.
临时提高内存,使用swap解决虽然内存不足会卡,但是不会让网站崩溃掉.
-
**swap: 磁盘的分区 当内存不够用时让swap临时充当内存使用!(业务场景不用swap)
- *测试内部服务器用的多一点 *- **不能让网站崩掉 **(慢点企业可以接受的) *- **内存低于8G,使用内存的1-1.5倍 **- **如果内存大于8G swap最多给8G!**
创建swap分区


先将tmp卸载
[root@oldboyedu ~]#umount /tmp
/tmp目录临时存放文件,相当于回收站!
-
你可以理解为,它被占用了,我们后面要用它,先把它卸载掉!
-
你也可以换个目录来整,不一定非的是/tmp下的文件
①创建指定大小文件
dd创建指定大小文件

dd if=/dev/zero of=/tmp/1g bs=1M count=1000
②转换为swap格式
mkswap
mkswap /tmp/1g

③激活swap空间
如何查看当前的swap空间??

**疑问??*我们刚才创建的swap文件加入进来了吗?
**答:**还没有激活,要让他加入到Linux中
swapon

④永久挂载
还是两种方法

vim /etc/fstab


swapoff
卸载swap
[root@oldboyedu ~]#swapoff /tmp/1g
⑤swapon -s
查看交换分区的组成

02.磁盘无法写入
①block满了(磁盘空间不足)
- df -h
查看磁盘容量
- 配合着du -sh /* 使用

du -sh /*
查看根下的各个目录的总大小
*是否包含已删除(inode为0)但被进程调用的文件???*du **不统计**已被删除(inode为0)但仍有进程打开的文件因为这些文件在目录树中已不可见**df 会统计这些文件占用的空间**因为block块尚未释放,还在被进程调用**直到进程关闭**👉 这常常导致 du 显示的已用空间比 df 统计的要小的多.**下面有详细介绍**
- find / -size +100M
直接通过find进行查找

如果找出来,这个大文件,它不能删,该怎么办?就该加硬盘,加空间了.类似于升级了,访问量变大了.②inode满了
一般情况下,这个inode数量特别多.几百万,几千万.几乎用不完.
如果满了怎么办??
大多数情况下是由于文件数量过多所引起的,只需要删除无用的就好了.
df -i
查看inode信息

find / -type d -size +1M
查看他的目录本身大小是否大于1MB:
目录里面存放的都是下一级的文件名和子目录名 如果大于,说明它本身小文件肯定很多
-
ls -lhd 目录
-
find / -type d -size +1M

模拟inode满了
- 第一种纯创建文件
touch ./oldboy/{1..50000}.txt
touch ./oldboy/{1..50000}.log
很不明显!

这个目录本身已经超过1M,说明它下面有很多的小文件!!!

-
第二种用dd创建文件
-
把它当做磁盘进行格式化,挂载!


创建一个小一点的文件,nginx.log
把它当做一个硬盘一样—格式化—挂载.


③🧣未彻底删除

-
其他的进程正在调用它,用着它呢!
-
即使硬链接数为0,但是空间不释放

lsof
用于列出当前系统中被进程打开的文件**
-
lsof | grep 文件名
- 既然是你删的的文件,那么那肯定是对这个文件有点印象的!
-
lsof | grep delete
-
这个也能过滤被你delete删除的文件
-
全局过滤很慢,不如lsof +L1
-

- 查看某个进程打开了哪些文件
lsof -p 1234 # 查看 PID=1234 的进程#小写p- 查看某个用户打开的文件
lsof -u oldboy #查看 oldboy用户打开的文件- 查看被删除但仍占用磁盘空间的文件(排查磁盘空间不释放问题)**
lsof +L1#大写的L-
+L1 表示列出硬链接数小于 1 的文件
- 即已被 rm 删除但仍有进程打开的文件.
-
输出中会包含 (deleted) 标记.
-
✅ 这是解决 “df 显示空间满,但 du 找不到大文件” 问题的关键命令!
- 查看网络连接
lsof -i # 所有网络连接lsof -i :80 # 使用 80 端口的进程#有:冒号分隔
lsof -i TCP # 只看 TCP 连接lsof -i @192.168.1.100 # 连接到某 IP 的进程模拟实验

*是否包含已删除(**硬链接为0**)但被进程调用的文件???*du **不统计**已被删除(硬链接数为0)但仍有进程打开的文件因为这些文件在目录树中已不可见统计的是硬链接数不为0的文件所占用的磁盘空间.**df 会统计这些文件占用的空间**因为block块尚未释放,还在被进程调用**直到进程关闭**👉 这常常导致 du 显示的**已用空间**比 df 统计的要小的多.
-
重启服务也要也要找一个夜深人静的时候,网站访问量低的时候.
-
更好的选项还是去raload进行重载!而不是杀死进程或者重启服务


03.解决磁盘不够
软链接迁移
**需求: **运行的业务持续的将日志输入到/var/log/a.log
这个文件太大导致磁盘不够用!!!
解决磁盘不够用,并且日志的文件路径不能变.

①插入大的磁盘20T
②格式化
mkfs.xfs /dev/sdb
③挂载
mount /dev/sdb /data
别忘了永久挂载!
④移动
mv /var/log/a.log /data/
移动完后 /data/a.log才是源文件
⑤软链接
ln -s /data/a.log /var/log/a.log
把源文件做个软链接放到原来的了路径下. 正是因为软连接,用户访问的是快捷方式(原来的路径) 只不过源文件已经到移动到第二块磁盘中了!
面试题
磁盘不够用如何解决?
- 物理机
-
目前磁盘已经满影响业务(比较急)
-
find快速找出较大的文件,
-
不重要的进行删除,保证业务正常进行!
-
同时准备着添加硬盘,格式化,挂载
-
移动业务的同时,做软链接到原位置!
-
-
大文件比较多(没那么急)
-
先把重要的文件打包压缩,移动到备份服务器
-
最后删除没有用的文件
-
- 云服务器
在线扩容—>购买500G—>在线扩容命令
后面会讲,不用重启,直接扩容挂载!
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




