Mac: Slowing Down Your Disk Speed by 60x

Use macOS's built-in tool `dmc` to simulate slow disk performance for testing. It offers various profiles to adjust speed easily.

分享

Sometimes in the development process, we need to simulate slow disk conditions to verify if our code can still function on low-performance machines. Typically, we would use cgroup or Docker for this purpose, but it can be cumbersome on a MacBook. However, there's a built-in tool on macOS that can help us achieve this: dmc.

Using dmc

macOS comes with dmc, which we can explore using dmc -h.

➜  /tmp dmc -h
usage: dmc 
# commands:
  start  (profile_name|profile_index [-boot])
  stop 
  status  [-json]
  show profile_name|profile_index
  list
  select  (profile_name|profile_index)
  configure      [    ]
  help | -h

It offers various disk profiles to choose from:

➜  /tmp 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

Each profile corresponds to different speed modes, such as:

➜  /tmp dmc show 0
Profile: Faulty 5400 HDD
 Type: HDD
 Access time: 52222 us
 Read throughput: 50 MB/s
 Write throughput: 50 MB/s
 I/O Queue Depth: 16
 Max Read Bytes: 16777216
 Max Write Bytes: 16777216
 Max Read Segments: 128
 Max Write Segments: 128
➜  /tmp dmc show 7
Profile: PCIe 3 SSD
 Type: SSD
 Access time: 3 us
 Read throughput: 3072 MB/s
 Write throughput: 2560 MB/s
 I/O Queue Depth: 256
 Max Read Bytes: 67108864
 Max Write Bytes: 67108864
 Max Read Segments: 256
 Max Write Segments: 256

Using it is straightforward. Suppose our disk is mounted on /tmp/data, and we want to set it to level 0. We simply execute:

sudo dmc start /tmp/data 0

Then, to verify the status:

➜  /tmp dmc status /tmp/data
Disk Mount Conditioner: ON
Profile: Custom
 Type: HDD
 Access time: 52222 us
 Read throughput: 50 MB/s
 Write throughput: 50 MB/s
 I/O Queue Depth: 16
 Max Read Bytes: 1048576
 Max Write Bytes: 1048576
 Max Read Segments: 128
 Max Write Segments: 128

Verification

We can validate using the fio tool:

➜  /tmp fio --filename=./data/test1 -direct=1 --rw=write --ioengine=posixaio --bs=1m --iodepth=32 --size=1G --numjobs=1 --runtime=60 --time_base=1 --group_reporting --name=test-seq-read --log_avg_msec=1000 

Writing a 1GB file sequentially yields a speed of only 95.4MB/s, with IOPS at 91:

Run status group 0 (all jobs):
  WRITE: bw=91.0MiB/s (95.4MB/s), 91.0MiB/s-91.0MiB/s (95.4MB/s-95.4MB/s), io=5468MiB (5734MB), run=60073-60073msec

Now, with dmc turned off and the same command:

 /tmp sudo dmc stop /tmp/data
 /tmp fio --filename=./data/test1 -direct=1 --rw=write --ioengine=posixaio --bs=1m --iodepth=32 --size=1G --numjobs=1 --runtime=60 --time_base=1 --group_reporting --name=test-seq-read --log_avg_msec=1000 

The test results in 3211MB/s and IOPS of 3061, which represents the true speed of the disk:

  WRITE: bw=3062MiB/s (3211MB/s), 3062MiB/s-3062MiB/s (3211MB/s-3211MB/s), io=179GiB (193GB), run=60006-60006msec

In conclusion, dmc is quite handy in testing scenarios. I hadn't known about this software before; if you find it useful, give it a try.


  • Long Time Link
  • If you find my blog helpful, please subscribe to me via RSS
  • Or follow me on X
  • If you have a Medium account, follow me there. My articles will be published there as soon as possible.

阅读更多

那些意外变成特性的 Bug:当代码漏洞改写计算史

那些意外变成特性的 Bug:当代码漏洞改写计算史

那些意外变成特性的 Bug:当代码漏洞改写计算史. 比起草台班子将错就错的神话,面对异常数据时的观测定力才是真的 社交网络上常年流传着一类爽文:某家公司的程序员把代码写崩了,结果不仅没被开除,这个 Bug 反而成了拳头产品,妥妥的爽文主角剧本。 最常被搬出来的有三个:Audio Hijack 写错试用期拯救公。

By huizhou92