磁盘分区
`lsblk` 命令可以列出所有可用或指定的块设备信息,块设备信息通常指磁盘及其分区。输出包含设备名称、大小、类型和挂载点等信息。
lsblk
[root@node-1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 223.1G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 213.9G 0 part /
└─sda3 8:3 0 1G 0 part /boot/efi
sdb 8:16 0 14.6T 0 disk
└─sdb1 8:17 0 13.9T 0 part /locals
对`/dev/sdb` 剩下的空间在进行分区
parted /dev/sdb
unit MB # 设置单位为 MB
print
输出当前的分区情况
[root@node-1 ~]# parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: AVAGO MR9361-8i (scsi)
Disk /dev/sdb: 16.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 15.3TB 15.3TB xfs primary
(parted)
Disk /dev/sdb 总共16.0个T,目前分了15.3TB,剩下0.7TB
对sdb剩下的磁盘空间进行部分分区,如下所示
(parted) mkpart
Partition name? []? primary
File system type? [ext2]? xfs
Start? 15.3TB
End? 15.6TB
(parted) quit
Information: You may need to update /etc/fstab.
[root@node-1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 223.1G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 213.9G 0 part /
└─sda3 8:3 0 1G 0 part /boot/efi
sdb 8:16 0 14.6T 0 disk
├─sdb1 8:17 0 13.9T 0 part /locals
└─sdb2 8:18 0 690.4G 0 part
在指定的分区上创建一个 XFS 文件系统
mkfs.xfs /dev/sdb2
-
格式化分区: 该分区(
/dev/sdb2
)将被格式化为 XFS 文件系统。这意味着所有现有的数据将被擦除,新的 XFS 文件系统结构将被写入。 -
创建文件系统元数据: 在分区上创建 XFS 文件系统的元数据,包括超级块、inode、位图等,这些元数据用于管理文件系统中的数据和空间。
将新创建的磁盘分区挂载到某个目录上使用。`blkid`查询磁盘的UID信息。
# 输入
blkid
# 输出
/dev/sda2: UUID="77adfe2b-3888-4295-a8a9-f542172f325b" BLOCK_SIZE="4096" TYPE="xfs" PARTUUID="b9e95bb8-02"
/dev/sda1: UUID="6237d7e6-abed-47e8-8a01-c07365c9c352" BLOCK_SIZE="4096" TYPE="xfs" PARTUUID="b9e95bb8-01"
/dev/sda3: UUID="DC24-57D1" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="b9e95bb8-03"
/dev/sdb1: UUID="128131e8-940a-4006-ad87-80701a1243de" BLOCK_SIZE="512" TYPE="xfs" PARTLABEL="primary" PARTUUID="6873d799-9be2-4a66-a140-2b7145198a61"
/dev/sdb2: UUID="fbc53b9b-2eee-4923-a910-6f9fc0e9f118" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="primary" PARTUUID="ec881e93-2537-4f98-9518-79692c03731c"
编辑机器启动磁盘挂载配置
vi /etc/fstab
UUID=fbc53b9b-2eee-4923-a910-6f9fc0e9f118 /mnt-stroage xfs defaults,noatime 0 0
将左边的磁盘 挂载到/mnt-storage目录
执行挂载命令
systemctl daemon-reload
mount -a
查看挂载结果,可以看到/mnt-storage目录路径已经挂载到/dev/sdb2上,可以通过/mnt-storage挂载点对磁盘增删查改。
[root@node-1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 223.1G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 213.9G 0 part /
└─sda3 8:3 0 1G 0 part /boot/efi
sdb 8:16 0 14.6T 0 disk
├─sdb1 8:17 0 13.9T 0 part /locals
└─sdb2 8:18 0 690.4G 0 part /mnt-stroage
磁盘IO的监控命令
iotop命令
iotop 是一个交互式的 I/O 监控工具,它可以显示当前系统中正在进行 I/O 操作的进程。你可以使用以下命令安装 iotop:
sudo yum install iotop
参数说明 选项或参数 说明 -h, --help 显示帮助信息 -o, --only 只显示有I/O活动的进程或线程 -b, --batch 以非交互模式运行,不显示控制键提示 -n NUM, --iter=NUM 以非交互模式运行,指定更新次数 -d SEC, --delay=SEC 指定更新间隔,单位为秒 -p PID, --pid=PID 只显示指定进程ID的I/O活动 -u USER, --user=USER 只显示指定用户的I/O活动 -P, --processes 只显示进程,不显示线程 -a, --accumulated 显示累计的I/O活动,而不是每秒的I/O活动 -k, --kilobytes 以KB为单位显示I/O活动,而不是字节 -t, --time 在每行的开头显示当前时间 -q, --quiet 减少输出的信息量
执行命令 `iotop` 来查看哪些进程在消耗大量的IO资源。
Total DISK READ : 0.00 B/s | Total DISK WRITE : 217.53 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 306.93 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1705183 be/4 root 0.00 B/s 0.00 B/s 0.00 % 95.42 % [kworker/u129:1+flush-8:16]
3425438 be/4 root 0.00 B/s 2.47 K/s 0.00 % 4.38 % loki -config.file=/etc/loki/loki.yaml
62465 be/4 root 0.00 B/s 7.41 K/s 0.00 % 2.46 % tikv-server --pd=http://tidb-default-pd:237~--config=/etc/tikv/tikv.toml [raftstore-1-1]
1256 be/4 root 0.00 B/s 0.00 B/s 0.00 % 2.27 % [xfsaild/sdb1]
61081 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.56 % pd-server --data-dir=/var/lib/pd --name=tid~.component.svc:2379 --config=/etc/pd/pd.toml
2489 be/4 root 0.00 B/s 2.47 K/s 0.00 % 0.00 % dockerd --data-root=/var/lib/docker --log-o~s:2 --dns-opt timeout:2 --dns-opt attempts:2
2822 be/4 root 0.00 B/s 9.88 K/s 0.00 % 0.00 % dockerd --data-root=/var/lib/docker --log-o~s:2 --dns-opt timeout:2 --dns-opt attempts:2
17685 be/4 root 0.00 B/s 7.41 K/s 0.00 % 0.00 % dockerd --data-root=/var/lib/docker --log-o~s:2 --dns-opt timeout:2 --dns-opt attempts:2
75150 be/4 346 0.00 B/s 2.47 K/s 0.00 % 0.00 % java -Xms4096m -Xmx4096m -Xmn512m -Dnacos.s~KShiopDGsaKwnI nacos.nacos [http-nio-8848-e]
75151 be/4 346 0.00 B/s 2.47 K/s 0.00 % 0.00 % java -Xms4096m -Xmx4096m -Xmn512m -Dnacos.s~KShiopDGsaKwnI nacos.nacos [http-nio-8848-e]
3835213 be/4 346 0.00 B/s 2.47 K/s 0.00 % 0.00 % java -Xms4096m -Xmx4096m -Xmn512m -Dnacos.s~KShiopDGsaKwnI nacos.nacos [http-nio-8848-e]
`iotop`命令输出字段的含义
- Total DISK WRITE:表示所有进程在某个时间段内向磁盘写入的总数据量,反映系统整体的 I/O 活动。
- Actual DISK WRITE: 表示实际写入到磁盘的数据量,考虑了操作系统的缓存和写入优化机制。
- DISK READ:磁盘读速率,显示进程每秒从磁盘读取的数据量,单位通常为 KB/s 或 MB/s。
- DISK WRITE:磁盘写速率,显示进程每秒向磁盘写入的数据量,单位通常为 KB/s 或 MB/s。
- IO: 显示了进程的 I/O 使用百分比,采样时间内该进程有多少时间用于处理IO请求。
在每个采样周期内,iotop 计算每个进程用于处理 I/O 操作的时间。这包括等待磁盘读写完成的时间、数据传输的时间等。
进程IO 99%代表着什么,是如何计算的?
1. 采样周期
iotop 会以固定的间隔(通常是1秒)采样进程的活动。
2. I/O 时间
在每个采样周期内,iotop 计算每个进程用于处理 I/O 操作的时间。这包括等待磁盘读写完成的时间、数据传输的时间等。
如果一个进程在1秒的采样周期内有0.99秒的时间用于I/O操作,那么 IO 列显示的值为 99%。
说明进程处理任务的时间都卡在了IO读写这一块。磁盘写入是有性能问题的。磁盘IO可能有阻塞。
Acutal Disk Write 有可能会大于Total Disk Write,是为什么?
1.操作系统缓存和同步
操作系统通常会使用缓存来提升 I/O 性能,但在某些情况下,系统可能会强制将缓存数据写入磁盘。这些同步操作可能会导致实际写入的数据量增加。例如:
- fsync 系统调用会强制将缓存中的所有数据写入磁盘,以确保数据一致性。
- 定期的缓存刷新机制也会导致额外的写入操作。
2.RAID机制
在使用 RAID(独立磁盘冗余阵列)或复杂的存储系统时,实际写入的数据量可能会增加,因为:
- RAID 5 或 RAID 6 需要计算和写入奇偶校验信息。
- RAID 1(镜像)会将同一数据写入多个磁盘。
- 存储系统可能执行内部的写入优化和冗余操作。
iostat命令
iostat 可以统计磁盘写入和读取速率、延迟、磁盘占用率等信息。
# 每隔5s统计一次 一共统计10次
iostat -x -d 5 10
这将显示详细的磁盘统计信息,包括每个挂载点的使用情况。
输出参数含义:
- Device:设备名称
- r/s:每秒读请求数量
- rKB/s:每秒读请求速率,单位为KB
- r_await:读请求延迟
- w/s: 每秒写请求数量
- wKB/s:每秒写请求速率,单位为KB
- w_await: 写请求延迟
- %util:表示在采样周期内,设备的 I/O 请求所占用的时间百分比。简单来说,它是设备忙碌时间的比例,反映了磁盘或其他块设备的利用情况。
分析重点:
- %util 这是一个非常重要的指标。一般来说,%util 接近100%可能表明磁盘已经达到其处理能力的上限,进一步的I/O请求可能会排队等待,从而影响性能。
- await 当这个值较高时,可能表示磁盘I/O延迟较大,需要关注请求的平均等待时间。
- r/s 和 w/s 这两个参数显示了读写请求的数量,过多的请求可能会导致磁盘瓶颈。
- rKB/s 和 wKB/s 这两个参数显示了每秒的读写数据量。磁盘可以达到多少的读写。
%util
的计算依赖于 Linux 内核中的一个名为 jiffies
的计时器。内核会跟踪设备在每个时间点上是否忙碌,并计算出忙碌时间的总和。
如果一个设备的 %util
接近 100%,这意味着该设备几乎一直在忙碌,可能已经成为系统的瓶颈。这时可能需要优化 I/O 操作或升级硬件。
假设在 1 秒(1000 毫秒)的时间内,设备总共忙碌了 500 毫秒,那么:
这意味着设备在这 1 秒内有 50% 的时间在处理 I/O 操作。
高 %util
不一定表示问题:如果设备 I/O 负载高且应用程序的响应时间仍在可接受范围内,那么高 %util
并不一定是问题
磁盘IO的测试命令
fio命令
fio (Flexible I/O Tester) 是一个强大的 I/O 工具,用于模拟文件系统和块设备的负载测试。它能够帮助系统管理员和开发人员评估存储设备和文件系统的性能,诊断潜在的性能瓶颈。
fio 提供了丰富的参数选项,允许用户定义复杂的 I/O 负载模式,以便对存储系统进行深入的性能测试。
fio -name=seqwrite -filename="./fio_test" -ioengine=libaio -direct=1 -bs=4k -size="5G" -runtime=120 -numjobs=1 -thread -rw=write
fio -name=seqwrite -filename="./fio_test" -ioengine=libaio -direct=1 -bs=1M -size="5G" -runtime=120 -numjobs=1 -thread -rw=write
常用参数
- --rw:指定 I/O 模式,如 read、write、randread、randwrite、randrw。
- --bs:块大小,指定每次 I/O 操作的数据块大小,如 4k、8k。
- --size:文件大小,指定测试文件的总大小,如 1G、10G。
- --numjobs:作业数,指定并发运行的作业数。
- --runtime:运行时间,指定测试运行的时间长度。
- --ioengine:I/O 引擎,指定 I/O 操作的引擎,如 sync、libaio、mmap。
- --direct:直接 I/O,设置为 1 表示绕过操作系统缓存,直接进行磁盘 I/O 操作。
bs大数据块写入的速度要快于bs小数据块的写入
输出结果如下:
[root@standalone-amd64-t4-33-44 locals]# fio -name=seqwrite -filename="./fio_test" -ioengine=libaio -direct=1 -bs=1M -size="5G" -runtime=120 -numjobs=1 -thread -rw=write
seqwrite: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=1
fio-3.29
Starting 1 thread
Jobs: 1 (f=0): [f(1)][100.0%][w=473MiB/s][w=473 IOPS][eta 00m:00s]
seqwrite: (groupid=0, jobs=1): err= 0: pid=2184645: Wed Jun 19 16:21:38 2024
write: IOPS=469, BW=470MiB/s (493MB/s)(5120MiB/10896msec); 0 zone resets
slat (usec): min=40, max=323, avg=60.14, stdev=11.81
clat (usec): min=1030, max=34921, avg=2066.35, stdev=769.68
lat (usec): min=1085, max=34986, avg=2126.65, stdev=769.81
clat percentiles (usec):
| 1.00th=[ 1827], 5.00th=[ 1860], 10.00th=[ 1893], 20.00th=[ 1909],
| 30.00th=[ 1926], 40.00th=[ 1958], 50.00th=[ 1958], 60.00th=[ 1975],
| 70.00th=[ 1975], 80.00th=[ 2311], 90.00th=[ 2343], 95.00th=[ 2376],
| 99.00th=[ 2376], 99.50th=[ 2835], 99.90th=[11469], 99.95th=[17957],
| 99.99th=[34866]
bw ( KiB/s): min=438272, max=507904, per=100.00%, avg=481182.48, stdev=15536.16, samples=21
iops : min= 428, max= 496, avg=469.90, stdev=15.17, samples=21
lat (msec) : 2=75.57%, 4=23.98%, 10=0.18%, 20=0.23%, 50=0.04%
cpu : usr=1.17%, sys=1.82%, ctx=5123, majf=0, minf=1
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,5120,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
WRITE: bw=470MiB/s (493MB/s), 470MiB/s-470MiB/s (493MB/s-493MB/s), io=5120MiB (5369MB), run=10896-10896msec
Disk stats (read/write):
sdb: ios=0/25099, merge=0/26, ticks=0/30135, in_queue=30135, util=99.11%
重点看输出的参数
write: IOPS=469, BW=470MiB/s (493MB/s)(5120MiB/10896msec); 0 zone resets
IOPS=469:表示每秒 469 次 I/O 操作。
BW=470MiB/s:表示写入速度为 470Mb/s(总的写入量/写入的时间计算得到),一共写入5G,花费10896msec时间
dd 命令
dd 用于低级别的复制和转换文件或设备数据。它被广泛用于备份和恢复、创建启动盘、测试磁盘性能等操作。以下是 dd 命令的详细描述和一些常见用法的解释。
dd 命令的基本语法如下:
dd if=<input file> of=<output file> [options]
- if(input file):指定输入文件或设备。
- of(output file):指定输出文件或设备。
- bs=:设置读写时使用的块大小。例如,bs=4k 表示以 4 KB 为单位进行读写操作。
- count=:指定要复制的块数,与 bs 结合使用。例如,count=1000 表示复制 1000 个块。
- skip=:从输入文件中跳过指定数量的块,然后再开始复制。
- seek=:在输出文件中跳过指定数量的块,然后再开始写入。
- conv=:指定数据转换选项,例如 noerror(忽略错误继续),sync(用零填充每个输入块),notrunc(不截断输出文件)等。
使用方法
1. 复制文件
将一个文件复制到另一个文件:
dd if=inputfile of=outputfile
2.创建一个特定大小的文件
创建一个 1 GB 的文件
dd if=/dev/zero of=bigfile bs=1M count=1024
- bs=1M:设置块大小为 1 MB。
- count=1024:复制 1024 个块。
3.备份和恢复磁盘
将整个硬盘设备 /dev/sda 备份到一个镜像文件:
dd if=/dev/sda of=/path/to/backup.img bs=4M
从镜像文件恢复硬盘:
dd if=/path/to/backup.img of=/dev/sda bs=4M
4.测试磁盘性能
通过写入大文件来测试磁盘写入速度:
dd if=/dev/zero of=/path/to/testfile bs=1G count=5 oflag=direct
- oflag=direct:使 dd 绕过操作系统缓存,直接写入磁盘。
通过读取大文件来测试磁盘读取速度:
dd if=/path/to/testfile of=/dev/null bs=1G count=1 iflag=direct