Linux运维篇|磁盘-IO命令

磁盘分区

`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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值