六、磁盘管理体系
1. 磁盘管理系统详解
1.1磁盘管理系统概述
- 目标:
- 熟练掌握常用磁盘配置(容量,转速,个数)
- 熟练说出或写出:raid级别
- 熟练掌握磁盘基本使用
- 熟练掌握磁盘空间不足的故障,原因,排查,解决
1.2 磁盘管理基础
1)磁盘介绍
- 介绍一块企业级硬盘结构
- 磁盘(硬盘):永久(持续)存放数据
- 磁盘分类(结构):机械硬盘(HDD),固态硬盘(SSD)
- 磁盘接口(类似与水壶的壶嘴):sata(接口),SAS(接口,企业级),pci-e(固态硬盘接口,企业级,家用)
- 硬盘指标:
- 硬盘转速:每分钟 5400 rpm 7200rpm(家用) 10k 15k rpm(企业级)
- 硬盘容量
- 性能
2)磁盘选型🌟🌟🌟🌟🌟
- 企业磁盘选型:
接口 | 应用场景 | |
---|---|---|
sata | 企业内部使用,存放备份。线下业务(给自己内部人员使用) | 4tb 6tb 7.2K转 *8 |
SAS | 企业标配,一般线上业务使用(线上环境,生产环境) | 300g 600g 900g 15K转 *8 |
固态硬盘(pci-e /sas/sata) | 访问量巨大(并发高),数据量不是很大。(架构优化:把用户经常访问的数据存放在固态) | 500g 1tb 2tb *4 |
3)磁盘内部结构
- 机械
- 磁头
- 盘片
- 机械磁盘细致结构:
- 磁头:用于读写数据,径向运行(半径),从数字0开始命名
- 磁道:类似与环形跑道,用来存放数据的区域
- 最外面的圈开始时0号磁道
- 每个磁道存放的数据量是一样的
- 扇区:存放数据最小单位。默认是512字节
- 柱面:不同盘面上,相同的磁道组成的形状,磁盘读写是以柱面单位进行的。
4)机械VS固态
1.3 RIAD🌟🌟🌟🌟🌟
1)概述
-
磁盘我们冗余阵列 RAID
-
物理服务器的硬盘,通过raid管理,才能使用
-
使用raid优势
- 可以获取更高容量
- 可以获取更高性能
- 可以获取更高冗余
2)raid级别
- raid:raid管理磁盘具体方式
- 常见的raid级别:raid0 raid1 raid5 raid10
最少需要几块 | 容量 | 冗余 | 性能 | |
---|---|---|---|---|
raid0 | 1 | 所有硬盘容量总和 | 最低,没有冗余 | 最快的 |
raid1(镜像) | 2块硬盘(制作的时候,1次稚嫩给2块硬盘做raid1) | 一半 | 冗余100% | 写入新能较慢,读取类似与单块硬盘 |
raid5 | 至少3块硬盘 | 损失n-1(n硬盘总数,n>=3) | 损坏一块 | 读取性能还可以,写入较慢 |
raid10 | 至少需要4块硬盘 | 减半 | 损坏一半,但是不能在一个组里 | 读写很快 |
3)raid级别及应用场景
4)未来应用
- 物理服务器需要配置raid
- 物理服务器拿到手
- 拆开包装
- 上电
- 配置raid
- 安装系统(光盘,u盘)
- 选择软件包
- 创建磁盘分区
- 安装完成
- 部署环境
5)raid vs lvm
- raid 硬件控制
- lvm 软件 逻辑卷,优点:动态扩容磁盘空间。
1.4磁盘分区
1)磁盘分区概述
- MBR:磁盘的引导程序(主引导记录),引导系统启动
- 分区表:存放分区开始结束信息
2) 主分区,扩展分区,逻辑分区
- 主分区:最多有4个,每个占用16个字节分区表空间
- 扩展分区:
- 主要用来解决主分区最多4个
- 主分区无法直接存放数据与使用
- 如果要使用需要在扩展分区中创建逻辑分区
- 扩展分区在一个磁盘中只有1个
- 逻辑分区
- 需要先创建扩展分区
- 使用逻辑分区存放数据
3)linux系统磁盘及分区命名规则
/dev/sda #硬盘名字
/dev/sda1
/dev/sda2
#Linux系统磁盘名字的命名规则
#物理机
sata/sas/pci-e 接口的硬盘
/dea/sa?开头
##云服务器
/dav/vd开头
##第一块硬盘
/dev/sda
##第二块硬盘
/dev/sda
#Linux系统磁盘分区的命名规则
#主分区或扩展分区1-4
/dev/sda1-4
#逻辑分区从5开始
/dev/sda5
4)MBR vs GPT
-
MBR主引导记录,磁盘分区格式
-
磁盘大小不能大于2tb,如果大于2tb则无法使用
-
GPT分区表格式,解决问题
-
解决系统支持大硬盘问题
-
主分区随便用,不用区分主分区,扩展分区,逻辑分区。
MBR VS GPT | 支持的主分区数量 | 支持的硬盘大小🌟🌟🌟🌟🌟 | 磁盘分区命令 |
---|---|---|---|
MBR | 支持的主分区+扩展分区最多4个 | 小于2tb硬盘 | fdsik 只支持mbr |
GPT | 可以理解无限 | 可以各种容量的磁盘 | parted/gdisk 支持gpt和mbr |
1.5 磁盘分区实战
1)环境准备
[root@lichengbo-nb ~]# fdisk -l | grep '/dev/sd[a-c]:'
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Disk /dev/sdc: 106 MB, 106954752 bytes, 208896 sectors
2)磁盘分区
- ⚠️磁盘分区属于危险操作,操作前备份。
磁盘分区指令 | 共同点 | 区别 |
---|---|---|
fdisk | 都可以进行磁盘分区 | 仅支持mbr格式分区,磁盘大小不能超过2tb |
parted/gdisk | 都可以进行磁盘分区 | 支持gpt格式分区表,(parted支持mbr和gpt),用于大硬盘分区 |
3)磁盘分区-fdisk
#01 查看磁盘分区信息
[root@lichengbo-nb ~]# fdisk -l | grep '/dev/sd[a-c]:'
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Disk /dev/sdc: 106 MB, 106954752 bytes, 208896 sectors
#02 对/dev/sdb进行分区。
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
#更改将只保留在内存中,直到您决定写入它们。
Be careful before using the write command.
#在使用write命令之前要小心。
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xb5ecdcf3.
#03 fdisk 磁盘分区指令详解
p (print) 显示单签磁盘分区信息
n (new) 创建磁盘分区
d (delete)删除分区
q (quit) 退出不保存
w (write)保存并退出,让磁盘分区生效
#04 案例01 在/dev/sdb中创建一个10mb的磁盘分区
#第一步:进入磁盘分区模式
fdisk /dev/sdb
#第二步:创建分区
Command (m for help): n #创建分区
Partition type: #请选择分区类型
p primary(主分区) (0 primary, 0 extended, 4 free) #(0个主分区,0个扩展分区,4个可用主分区和扩展分区)
e extended (扩展分区)
Select (default p): #输入回车选择(默认的主分区)
Using default response p
Partition number (1-4, default 1): #指定分区号,回车就行
First sector (2048-208895, default 2048): #磁盘分区的第一个扇区是从哪里开始(不需要关注从哪里开始,回车就行)
#重点:输入+10M表示这个分区空间是10MB
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895): #磁盘分区结束于哪里。
Partition 1 of type Linux and of size 10 MiB is set #创建磁盘分区号是1,大小是10MB分区
#第三步:查看分区
Command (m for help): p
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb5ecdcf3
Device Boot Start End Blocks Id System
/dev/sdb1 2048 22527 10240 83 Linux
#第四步:保存并生效
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
# 案例02 企业案例 创建1个分区使用整个磁盘空间的容量
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-208895, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895):
Using default value 208895
Partition 1 of type Linux and of size 101 MiB is set
Command (m for help): p
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb5ecdcf3
Device Boot Start End Blocks Id System
/dev/sdb1 2048 208895 103424 83 Linux
#一直按回车就可以把一个磁盘空间给一个分区
4)磁盘分区-parted
#第一步:进入到磁盘
(parted) p
Error: /dev/sdc: unrecognised disk label
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 107MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
#第二步:创建磁盘分区表
mktable #gpt格式:mktable gpt mbr格式:mktable msdos
(parted) mktable gpt
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 107MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
#第三步:创建磁盘分区
(parted) mkpart primary 0 10 #创建10mb分区
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I
#删除分区
rm
(parted) rm 4
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 107MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 10.0MB 9983kB primary
2 10.5MB 19.9MB 9437kB primary
3 19.9MB 30.4MB 10.5MB primary
1.6 磁盘使用全流程
1)磁盘使用流程概述
- 一般流程:
- 1️⃣磁盘分区
- 2️⃣格式化(创建文件系统)
- 3️⃣挂载 (linux下面设备必须要挂载才能访问与使用,挂载相当于给设备设置了一个入口)
2)磁盘使用实战
#对 /dev/sdb 创建一个分区,使用全部空间,挂载到/mnt目录
#第一步:磁盘分区
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-208895, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895):
Using default value 208895
Partition 1 of type Linux and of size 101 MiB is set
Command (m for help):
Command (m for help): p
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb5ecdcf3
Device Boot Start End Blocks Id System
/dev/sdb1 2048 208895 103424 83 Linux
#第二步:格式化
make file system
[root@lichengbo-nb ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=6464 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=25856, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
#第三步:挂载
linux下面,设备(磁盘,磁盘分区,光盘)不挂载无法使用,挂载给设备设置入口
入口叫做挂载点 挂载点是目录
/mnt 是linux临时挂载点
[root@lichengbo-nb ~]# mount /dev/sdb1 /mnt/
[root@lichengbo-nb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 12M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/mapper/centos_lichengbo--xuexi-root 50G 2.1G 48G 5% /
/dev/sda1 1014M 138M 877M 14% /boot
/dev/mapper/centos_lichengbo--xuexi-home 47G 33M 47G 1% /home
tmpfs 394M 0 394M 0% /run/user/0
/dev/sdb1 98M 5.3M 93M 6% /mnt
-
补充指令
卸载分区(挂载点) mount 挂载 umount /mnt [root@lichengbo-nb ~]# umount /mnt/ [root@lichengbo-nb ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 2.0G 0 2.0G 0% /dev tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 2.0G 12M 2.0G 1% /run tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/mapper/centos_lichengbo--xuexi-root 50G 2.1G 48G 5% / /dev/sda1 1014M 138M 877M 14% /boot /dev/mapper/centos_lichengbo--xuexi-home 47G 33M 47G 1% /home tmpfs 394M 0 394M 0% /run/user/0
-
修改/etc/rc.local
-
存放命令,脚本会在开机的时候自动运行
-
第一次使用需要给/etc/rc.d/rc.local 加上执行权限
#开机自动挂载 方法一: mount /dev/sdb1 /mnt 写入到/etc/rc.local 方法二: 修改/etc/fstab #开机自动挂载的配置文件 #fstab格式 /dev/mapper/centos_lichengbo--xuexi-root / xfs defaults 0 0 UUID=4cb251ec-e843-48ab-887e-3a918462f619 /boot xfs defaults 0 0 /dev/mapper/centos_lichengbo--xuexi-home /home xfs defaults 0 0 /dev/mapper/centos_lichengbo--xuexi-swap swap swap defaults 0 0 配置一共是6列
#挂载生效
mount /dev/sdb1 /mnt/ #临时挂载,重启linux后挂载失效
#永久挂载
/data #新的目录
两种方法
3)小结
- 磁盘使用三部曲:分区、格式化、挂载
- 命令:分区fdisk、parted、gdisk,mkfs.xfs 挂载mount、umount
- 永久挂载:/etc/rc.local /etc/fstab
1.7 磁盘企业级分区方案
- 新安装的系统如何划分分区及设置容量。
1)物理机
#磁盘分区方案 01 通用 (运行一些不太重要的环境,没有用户的数据)
/boot分区 #用于引导系统启动,linux内核文件。 1GB即可(如果需要升级linux内核)
swap 分区 #用于内存不足的时候,swap空间临时充当内存使用。
#内存小于8G swap可以给内存的1.5-2倍,最大控制在8-16G
#大于8G seap 给8-16G
#在一些生成环境中为了极致的速度、性能。会关闭swap (与服务器默认没有swap)
/ 分区 #剩余多少给多少
#磁盘分区方案 02 通用(有重要数据的时候)
/boot分区 #用于引导系统启动,linux内核文件。 1GB即可(如果需要升级linux内核)
swap 分区 #用于内存不足的时候,swap空间临时充当内存使用。
#内存小于8G swap可以给内存的1.5-2倍,最大控制在8-16G
#大于8G seap 给8-16G
#在一些生成环境中为了极致的速度、性能。会关闭swap (与服务器默认没有swap)
/ 分区 #给40-100G
/data 数据分区 #重要数据放在/data目录、分区中。
2)云服务器
- 根据需求,规划好。所需要的磁盘空间。
- 如果后期添加,扩容云服务器都很方便。
/ 系统分区 40-100G /dec/vda
/data 数据分区 不限制
1.8 磁盘故障案例
1)磁盘空间不足案例no space left on device
🌟🌟🌟🌟🌟
-
因为大文件
1️⃣如何模拟
2️⃣如何排查
3️⃣如何解决
# 01 模拟 创建大文件 dd if=/dev/zero of=/usr/local/big bs=1M count=5000 dd 创建指定大小文件 if input file 输入文件 of output file 输出文件 bs block size 每次读取多少 count 次数 bs*count就是文件大小 #02 排查 - 目标:定位大文件在哪里,在那个目录,是什么文件名字。 整体查看下:是哪里磁盘空间不足(那个分区),根据有问题的分区,详细,一层一层排查,排除到具体的目录或文件 #第一步:整体查看下是哪里磁盘空间不足(那个分区) df -h #第二步:根据有问题的分区,详细,一层一层排查,排除到具体的目录或文件 du -sh /* [root@lichengbo-nb ~]# du -sh /* | grep G 6.5G /usr [root@lichengbo-nb ~]# du -sh /* | sort -rh 以人类可读形式进行排序 6.5G /usr 282M /var 105M /boot 61M /oldboy 33M /opt 33M /etc 12M /run 9.3M /tmp 96K /root 88K /home 4.0K /app #01 发现/分区占用空间大 du -sh /* | sort -rh #02 发现usr目录占用空间大 du -sh /usr/* | sort -rh #03发现/usr/local 占用空间大 du -sh /usr/local/* | sort -rh #04最终发现/usr/local/big文件最大 #05确认文件是否重要,确认是否可以删除
1.9因为inode用光了导致的磁盘空间不足.
-
原理:
- inode存放文件属性信息. inode数量是在格式化后固定.
- 如果耗尽也会提示磁盘空间不足
no space left on device
-
故障案例模拟
#模拟
创建小的磁盘分区. 进行挂载
在这个磁盘分区中,创建文件,占用inode.模拟inode耗尽.
#01通过dd来创建文件,格式化,挂载.
dd if=/dev/zero of=/tmp/inode bs=1k count=2000
#02格式化
[root@oldboy81-golden-lnb ~]# mkfs.ext4 /tmp/inode
mke2fs 1.42.9 (28-Dec-2013)
/tmp/inode is not a block special device.
Proceed anyway? (y,n) y
#03挂载
[root@oldboy81-golden-lnb ~]# mkdir -p /inode
[root@oldboy81-golden-lnb ~]# mount /tmp/inode /inode/
[root@oldboy81-golden-lnb /inode]# touch {01..250}
touch: cannot touch ‘246’: No space left on device
touch: cannot touch ‘247’: No space left on device
touch: cannot touch ‘248’: No space left on device
touch: cannot touch ‘249’: No space left on device
touch: cannot touch ‘250’: No space left on device
- 排查 与解决 🌟🌟🌟🌟🌟
如果出现磁盘空间不足:
1) df -h 查看 发现还有空间.
2) 创建文件仍然提示,磁盘空间不足. df -i 查看inode 使用情况. inode用光了.
[root@oldboy81-golden-lnb /inode]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos_oldboy--81--golden-root 50G 8.1G 42G 17% /
/dev/sda1 1014M 138M 877M 14% /boot
/dev/mapper/centos_oldboy--81--golden-home 47G 33M 47G 1% /home
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb 99M 5.4M 94M 6% /mnt
/dev/loop0 2.0M 34K 1.8M 2% /inode
[root@oldboy81-golden-lnb /inode]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 250468 438 250030 1% /dev
tmpfs 253483 1 253482 1% /dev/shm
tmpfs 253483 808 252675 1% /run
tmpfs 253483 16 253467 1% /sys/fs/cgroup
/dev/mapper/centos_oldboy--81--golden-root 26214400 65410 26148990 1% /
/dev/sda1 524288 326 523962 1% /boot
/dev/mapper/centos_oldboy--81--golden-home 24637440 46 24637394 1% /home
tmpfs 253483 1 253482 1% /run/user/0
/dev/sdb 52224 29 52195 1% /mnt
/dev/loop0 256 256 0 100% /inode
#解决
删除,大量小文件.
- 小结:
- 排查inode导致的磁盘空间不足
- 排查流程:
- df -h ;然后看下df -i inode 使用情况.
- 如何查找有大量小文件的目录.
找系统中目录大小大于1MB即可. find / -type d -size +1M
- 精确到具体问题的目录,看看目录内容. 与老大确认是否可以删除.
- 确认后再处理.
- 模拟故障作为熟悉项目.
#了解: 为何找系统中大于1mb目录.
# 目录中文件越多,目录本身大小越大.
# 10w个小文件,目录已经是2.3mb
[root@oldboy81-golden-lnb /oldboy]# ls many-small/ | wc -l
100001
[root@oldboy81-golden-lnb /oldboy]# ll -hd many-small/
drwxr-xr-x. 2 root root 2.3M Mar 18 10:04 many-small/
#找出系统中 大量小文件的目录: 思路02
显示系统中所有文件. 取出路径部分(目录).然后uniq 统计次数.
显示系统中所有文件
find / -type f
取出路径部分(目录)
dirname
然后uniq 统计次数
uniq
find /etc /var/ /usr /oldboy -type f |xargs dirname |uniq -c |sort -rn |head
find /etc/ /usr/ /var/ /oldboy -type f |xargs dirname |uniq -c |sort -rn | head
100001 /oldboy/many-small
1718 /usr/share/man/man3
1164 /usr/share/man/man1
966 /usr/bin
882 /usr/lib/python2.7/site-packages/sos/plugins
801 /usr/share/man/man8
566 /usr/share/vim/vim74/syntax
447 /usr/share/nmap/scripts
421 /usr/share/mime/application
360 /usr/lib64/python2.7/encodings
1.10 因为文件没有被彻底删除导致的磁盘空间不足案例
1) 什么是彻底删除?(文件删除原理)
- 文件删除条件:
- 硬链接数为0: 没有入口了(硬链接数为0,rm删除.)
- 进程调用数为0: 这个文件没有任何调用(服务软件/命令)
2) 故障模拟.
#模拟创建大文件.
seq 500000000 >>/var/log/big.log
dd
#模拟占用
tail -f /var/log/big.log
3) 排查与解决
#日常 磁盘空间不足排查 block
df -h
du -sh /* |sort -hr
du -sh /var/* |sort -hr
du -sh /var/log/* |sort -hr
\rm -f /var/log/lidao.log
#过了几天,发现磁盘空间仍然不足,文件的空间没有释放.
[root@oldboy81-golden-lnb ~]# ll /var/log/lidao.log
ls: cannot access /var/log/lidao.log: No such file or directory
[root@oldboy81-golden-lnb ~]#
df -h #查看 使用 18GB
du -sh /* #查看 使用不到 18GB
#怀疑文件没有被彻底删除,导致的文件越来越大.导致磁盘满了. df -h /du -sh 排查不到.
#解决:
结束(重启)对应的进程/服务
- 磁盘空间不足之文件未被彻底删除导致
#排查
df -h #磁盘满了
du -sh /* #计算,发现没满.
基本是文件未被彻底删除导致的故障.
lsof |grep delete #即可 lsof 显示系统中所有被打开的文件.
#delete表示文件没有入口,进程调用数不为0
yum install -y lsof
#解决
重启或关闭对应服务/进程
4) 小结
- 原理: 文件被删除删除原理(文件删除原理)
- 故障:
- 现象: df -h磁盘满,du -sh 磁盘没满. 怀疑文件未彻底删除导致的故障.
- 排查:
df -h,du -sh ; lsof |grep deleted
- 解决: 找出占用文件的服务/进程,重启.
1.11 磁盘空间不足案例总结 🌟🌟🌟🌟�
磁盘空间不足原因 | 现象 | 排查 | 解决 |
---|---|---|---|
常规大文件(大量文件) block不足. |
创建文件或使用服务 报错提示磁盘空间不足 no space left on device |
df -h ; du -sh 一层一层排 查. 最终精确到文件或目录 |
确认后删除 |
大量inode使用,inode不足. | 创建文件提示磁盘空间不足. df -h 磁盘没 满. | df -i ; 哪个分区inode满 了. 使用find找分区中大于 1MB目录 |
确认后删除目录中大量 小文件 |
文件未彻底删除导致的磁盘 空间不足. | 提示磁盘空间不足. df -h 真的不足. du -sh 看还有剩余. | lsof |grep delete | 重启对应的服务/进程. |
待讲解 to be continued |
2.磁盘管理体系之swap
2.1 swap 概述
- swap 交换分区. 内存不足的时候临时充当内存.
2.2 swap手动创建
- 目录: 熟练掌握手动创建swap方法.
1) 案例01 通过dd创建swap并添加到系统中 🌟🌟🌟🌟🌟
#01 dd创建500mb文件
#02 500mb文件成为swap (创建文件系统)
#03 激活swap(让他加入到系统中) (挂载)
#01 dd创建500mb文件
dd if=/dev/zero of=/tmp/500mb bs=1M count=500
#02 500mb文件成为swap (创建文件系统)
mkswap /tmp/500mb
#03 激活swap(让他加入到系统中) (挂载)
chmod 600 /tmp/500mb
swapon /tmp/500mb
free -h
#04 永久生效
01) 方法01 /etc/rc.local
swapon /tmp/500mb
02) 方法02 /etc/fstab
/dev/mapper/centos_oldboy--81--golden-swap swap swap defaults 0 0
#/tmp/500mb
UUID=756762b6-a234-4b59-999f-1e5efaa54a1d swap swap defaults 0 0
#05 关闭swap
swapoff /tmp/500m
2) 案例02 通过创建磁盘分区创建swap 了解
#01 fdisk/parted 进行分区
#02 500mb文件成为swap (创建文件系统)
#03 激活swap(让他加入到系统中) (挂载)
#01 fdisk/parted 进行分区
#02 mkswap
[root@oldboy81-golden-lnb ~]# mkswap /dev/sdc1
Setting up swapspace version 1, size = 104408 KiB
no label, UUID=87a565c9-a37d-4233-8820-26a8fa0ebd40
#03 激活
[root@oldboy81-golden-lnb ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 342M 1.2G 9.5M 453M 1.4G
Swap: 2.0G 0B 2.0G
[root@oldboy81-golden-lnb ~]# swapon /dev/sdc1
[root@oldboy81-golden-lnb ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 342M 1.2G 9.5M 453M 1.4G
Swap: 2.1G 0B 2.1G
[root@oldboy81-golden-lnb ~]# swapon -s
Filename Type Size Used Priority
/dev/sdc1 partition 104408 0 -3
/dev/dm-1 partition 2097148 0 -2
2.3 应用场景及建议 🌟 🌟
- 建议高并发,内存足够的时候,可以不开启swap.
- 对于其他场景,不确定,就可以创建些swap.
2.4 企业故障案例:
- 背景:
- 企业生产环境运行java程序(Tomcat)软件,突然发现大量占用swap.
- 如何处理:
- 临时增加swap,防止系统宕机.
- 后续根据日志,软件日志排查原因.
- 结果:
- 分析日志原理,找出程序代码问题
3. 磁盘管理体系之性能测试
3.1 磁盘核心性能指标 🌟 🌟 🌟 🌟🌟
磁盘关键性能指标 | |
---|---|
随机的读写次数(iops) | io读写 per second 磁盘每秒的读写次数 |
吞吐量 (Throughput) 连续读写速度 | 磁盘最大读写速度 |
延迟 (随机读写延迟) | |
容量 | 磁盘/硬盘容量. |
3.2 测试
# dd
# fio (连续读写,随机读写,读写延迟)
yum install libaio libaio-devel fio -y
#测试顺序读
fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting
-filename=/dev/sda -name=Read_PPS_Testing
#测试顺序写
fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting
-filename=/dev/sda -name=Write_PPS_Testing
#测试随机读 iops
fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -
group_reporting -filename=/dev/sda -name=Rand_Read_Testing
#测试随机写
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -
group_reporting -filename=/dev/sda -name=Rand_Write_Testing
#测试延迟 随机读
fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -
filename=/dev/sda -name=Rand_Read_Latency_Testing
参数 | 说明 |
---|---|
-direct=1 | 表示测试时忽略I/O缓存,数据直写。 |
-iodepth=128 | 表示使用异步I/O(AIO)时,同时发出I/O数的上限为128。 同时发出多少个io请求.randwrite |
-rw=randwrite | 指定fio命令工作模式。(顺序、随机、读、写)(random writes)。 其它测试可以设置为: random随机 randread(随机读random reads) randwrite read(顺序读sequential reads) write(顺序写sequential writes) randrw(混合随机读写mixed random reads and writes) |
-ioengine=libaio | 表示测试方式为libaio(Linux AIO,异步I/O)。应用程序使用I/O通常有两种方式:同步同步的I/O一 次只能发出一个I/O请求,等待内核完成才返回。这样对于单个线程iodepth总是小于1,但是可以透过多 个线程并发执行来解决。通常会用16~32根线程同时工作将iodepth塞满。异步异步的I/O通常使用libaio 这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。 |
-bs=4k | 表示单次I/O的块文件大小为4 KiB。默认值也是4 KiB。 测试随机io的时候bs推荐4k 测试顺序io(吞吐量)bs=1M(1024k) |
-size=1G | 表示测试文件大小为1 GiB。 |
-numjobs=1 | 表示测试线程数为1。 |
-runtime=1000 | 表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写 完。 |
-group_reporting | 表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。 |
- filename=/dev/your_device | 指定的设备名,例如 /dev/sda /dev/vda |
- name=Rand_Write_Testing | 表示测试任务名称为Rand_Write_Testing,可以随意设定。 |
4.磁盘管理体系之文件系统-了解
- 目标: 认识文件系统即可,认识常见系统的默认文件系统.
- 文件系统: 组织和存放磁盘中文件的方式.
- Linux:
- XFS (CentOS 7) 默认的文件系统.
- EXT4 (CentOS 6及之前的文件系统.)
- Ext3 (CentOS 5.x)
- Ext2 (裸奔状态文件系统.) Btrfs (小文件)
- Windows: Fat32 NTFS
5. 磁盘管理体系-总结
- 磁盘选型
- Raid级别
- Raid应用场景.
- 磁盘分区: fdisk/parted/gdisk进行分区即可.
- 磁盘分区格式化挂载.
- 永久挂载(当前及重启后都生效.)
- /etc/rc.local
- /etc/fstab (每一列的含义)
- 磁盘分区方案
- 故障案例: 磁盘空间不足故障案例,原因,排查,解决.
- 故障案例: 企业生产环境运行java程序(Tomcat)软件,突然发现大量占用swap.需要临时添加swap
- 添加swap.
- 磁盘性能衡量指标: 容量,吞吐量(顺序读写),iops, 延迟 dd,fio
- 文件系统(了解)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码