磁盘相关案例

2964 字
15 分钟
磁盘相关案例

磁盘相关案例#

[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?

  1. 业务访问量大(增加内存)

  2. 开发代码问题(java) 企业最常见的

  3. 业务波动导致

  4. 内部测试(测试服务器)

  • 对于一些性能要求比较高服务器,我们这个swap直接关闭掉了.

    - *因为未来我们的物理内存还是比较充足的.*

解决oom内存溢出!

  1. 增加内存条

    - 这样的操作避免不了**重启Linux系统**,安内存条,太慢了.
    - 不能保证网站能够顺利流畅的运行.

临时提高内存,使用swap解决虽然内存不足会卡,但是不会让网站崩溃掉.

  1. **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满了(磁盘空间不足)#

  1. df -h

查看磁盘容量

  1. 配合着du -sh /* 使用

du -sh /*#

查看根下的各个目录的总大小

*是否包含已删除(inode为0)但被进程调用的文件???*
du **不统计**已被删除(inode为0)但仍有进程打开的文件
因为这些文件在目录树中已不可见
**df 会统计这些文件占用的空间**
因为block块尚未释放,还在被进程调用
**直到进程关闭**
👉 这常常导致 du 显示的已用空间比 df 统计的要小的多.
**下面有详细介绍**

  1. find / -size +100M

直接通过find进行查找

如果找出来,这个大文件,它不能删,该怎么办?就该加硬盘,加空间了.
类似于升级了,访问量变大了.

②inode满了#

一般情况下,这个inode数量特别多.几百万,几千万.几乎用不完.

如果满了怎么办??

大多数情况下是由于文件数量过多所引起的,只需要删除无用的就好了.

df -i#

查看inode信息

find / -type d -size +1M#

查看他的目录本身大小是否大于1MB:

目录里面存放的都是下一级的文件名和子目录名 如果大于,说明它本身小文件肯定很多

  • ls -lhd 目录

  • find / -type d -size +1M

模拟inode满了#

  1. 第一种纯创建文件

touch ./oldboy/{1..50000}.txt

touch ./oldboy/{1..50000}.log

很不明显!

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

  1. 第二种用dd创建文件

  2. 把它当做磁盘进行格式化,挂载!

创建一个小一点的文件nginx.log

把它当做一个硬盘一样—格式化挂载.

🧣未彻底删除#

  • 其他的进程正在调用它,用着它呢!

  • 即使硬链接数为0,但是空间不释放

lsof#

用于列出当前系统中被进程打开的文件**

  • lsof | grep 文件名

    • 既然是你删的的文件,那么那肯定是对这个文件有点印象的!
  • lsof | grep delete

    • 这个也能过滤被你delete删除的文件

    • 全局过滤很慢,不如lsof +L1

  1. 查看某个进程打开了哪些文件
Terminal window
lsof -p 1234 # 查看 PID=1234 的进程
#小写p
  1. 查看某个用户打开的文件
Terminal window
lsof -u oldboy #查看 oldboy用户打开的文件
  1. 查看被删除但仍占用磁盘空间的文件(排查磁盘空间不释放问题)**
Terminal window
lsof +L1
#大写的L
  • +L1 表示列出硬链接数小于 1 的文件

    • 即已被 rm 删除但仍有进程打开的文件.
  • 输出中会包含 (deleted) 标记.

  • 这是解决 “df 显示空间满,但 du 找不到大文件” 问题的关键命令!

  1. 查看网络连接
Terminal window
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

把源文件做个软链接放到原来的了路径下. 正是因为软连接,用户访问的是快捷方式(原来的路径) 只不过源文件已经到移动到第二块磁盘中了!

面试题#

磁盘不够用如何解决?

  1. 物理机
  • 目前磁盘已经满影响业务(比较急)

    • find快速找出较大的文件

    • 不重要的进行删除,保证业务正常进行!

    • 同时准备着添加硬盘,格式化,挂载

    • 移动业务的同时,做软链接到原位置!

  • 大文件比较多(没那么急)

    • 先把重要的文件打包压缩,移动到备份服务器

    • 最后删除没有用的文件

  1. 云服务器

在线扩容—>购买500G—>在线扩容命令

后面会讲,不用重启,直接扩容挂载!

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

磁盘相关案例
https://www.kpyun.fun/posts/basics/core/core17/
作者
久棹
发布于
2025-08-19
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录