1. 背景
工作中偶尔会碰到一些系统环境的存储设备IO特别慢,尤其是云上一些存储,一般读取吞吐量在200MB/s
,但是我一直使用MacBook作为本地开发的机器,它的磁盘真是飞快,即使是2019年的机器也能达到读取 2000MB/s
的吞吐量,所以要想在本地环境下测试一些慢IO的性能测试就不很容易做到。
大概一年前的时候我用Docker
里面的--device-read-bps
的功能实现了一个基于容器的办法来在macOS下面模拟慢IO的存储设备。--device-read-bps
背后使用了Linux
的cgroups
去做到这一点,不过通过Docker
的话用户界面更友好一些。我把代码放在了https://github.com/niyue/slowio,大致的工作原理是:
macOS下应用程序 <==POSIX API==> samba shared volume <==samba==> samba server container in Docker <==cgroup limit==> 磁盘
- Docker会启动一个Samba的容器,这一容器受到了指定的读写IOPS以及读写带宽的限制
- macOS客户端会把Samba共享出来的卷挂载上来
- macOS上的应用访问Samba的共享卷的时候会受到通过Docker指定的读写的IOPS以及带宽的限制
- page cache under Docker for Mac’s Linux host needs to be cleared if you want to accurately measure this limit
这么做虽然可以工作,但是对于macOS上面的使用还是太复杂了,不仅得使用Docker
,在里面部署Samba,还有一些明显的问题:
- 要注意清除Docker for Mac中的page cache,以保证这个限制是正确应用的
- Samba本身有自己的瓶颈(虽然一般模拟慢IO的时候不会超过这个瓶颈)
- 需要把文件拷贝到容器中去进行验证
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