niyue

Archive for 2022年11月|Monthly archive page

disk mount conditioner模拟慢IO存储

In programming on 11月 26, 2022 at 5:13 下午

1. 背景

工作中偶尔会碰到一些系统环境的存储设备IO特别慢,尤其是云上一些存储,一般读取吞吐量在200MB/s,但是我一直使用MacBook作为本地开发的机器,它的磁盘真是飞快,即使是2019年的机器也能达到读取 2000MB/s的吞吐量,所以要想在本地环境下测试一些慢IO的性能测试就不很容易做到。

大概一年前的时候我用Docker里面的--device-read-bps的功能实现了一个基于容器的办法来在macOS下面模拟慢IO的存储设备。--device-read-bps背后使用了Linuxcgroups去做到这一点,不过通过Docker的话用户界面更友好一些。我把代码放在了https://github.com/niyue/slowio,大致的工作原理是:

macOS下应用程序 <==POSIX API==> samba shared volume <==samba==> samba server container in Docker <==cgroup limit==> 磁盘
  1. Docker会启动一个Samba的容器,这一容器受到了指定的读写IOPS以及读写带宽的限制
  2. macOS客户端会把Samba共享出来的卷挂载上来
  3. macOS上的应用访问Samba的共享卷的时候会受到通过Docker指定的读写的IOPS以及带宽的限制
  4. page cache under Docker for Mac’s Linux host needs to be cleared if you want to accurately measure this limit

这么做虽然可以工作,但是对于macOS上面的使用还是太复杂了,不仅得使用Docker,在里面部署Samba,还有一些明显的问题:

  1. 要注意清除Docker for Mac中的page cache,以保证这个限制是正确应用的
  2. Samba本身有自己的瓶颈(虽然一般模拟慢IO的时候不会超过这个瓶颈)
  3. 需要把文件拷贝到容器中去进行验证

2. dmc

我最近才发现macOS下面从High Sierra开始自带了一个叫做dmc (disk mount conditioner)的工具 [2],能够非常容易的做到模拟慢IO的存储,这里介绍一下这个工具的使用。

这个dmc到底是啥呢?按照它的manpage的介绍 [2],它是一个kernel里面内置的服务,通过它能够对特定的挂载点的磁盘IO访问进行降级,从而造成一种假象这个IO访问是在一种更慢的存储设备上进行的。它也能够让挂载点生成自己是一种不同的设备类型,列如SSD类型的磁盘可以被声称为HDD。一般存储设备的访问参数都会根据底层的设备类型而有所不同,这一设置也会对应变更各种参数,例如预读取的设置,磁盘IO的限流等。

它的功能使用其实很简单:

1. dmc list

dmc预置了8种不同的配置,通过dmc list可以列出。它们代表了一些典型的磁盘设备,对于我来说,我只要从中选择一种来使用就足够了。

> dmc list
  0: Faulty 5400 HDD
  1: 5400 HDD
  2: 7200 HDD
  3: Slow SSD
  4: SATA II SSD
  5: SATA III SSD
  6: PCIe 2 SSD
  7: PCIe 3 SSD

2. dmc show

对于每一种预置的设备来说,可以通过dmc show命令来查看它的参数。

❯ dmc show "7200 HDD"
Profile: 7200 HDD
 Type: HDD
 Access time: 17433 us
 Read throughput: 140 MB/s
 Write throughput: 140 MB/s
 I/O Queue Depth: 32
 Max Read Bytes: 33554432
 Max Write Bytes: 33554432
 Max Read Segments: 256
 Max Write Segments: 256

3. dmc start/stop

用户一般创建了一个目录作为挂载点之后,就可以通过dmc start以及dmc stop去设置这个挂载点的行为了。

sudo dmc start /tmp/data "7200 HDD"
sudo dmc stop /tmp/data

4. dmc status

设置完成之后,用户可以通过dmc status去查看某一挂载点的状态。

❯ dmc status /tmp/data
Disk Mount Conditioner: OFF
Profile: Custom
 Type: HDD
 Access time: 17433 us
 Read throughput: 140 MB/s
 Write throughput: 140 MB/s
 I/O Queue Depth: 32
 Max Read Bytes: 1048576
 Max Write Bytes: 1048576
 Max Read Segments: 256
 Max Write Segments: 256

就是这么简单。如果接下来想要验证下这个模拟是不是真的有效,可以通过使用fio [3]等存储测试的工具来验证。

3. 参考

[1] 华为云磁盘类型及性能介绍, https://support.huaweicloud.com/productdesc-evs/zh-cn_topic_0044524691.html

[2] dmc man page, https://manp.gs/mac/1/dmc

[3] fio, https://fio.readthedocs.io