niyue

调试宣言

In other on 2月 3, 2023 at 8:20 上午

Julia Evans是我很喜欢的一个漫画家。他画的漫画很多是关于编程的,所以比较感同身受。他的漫画技巧其实一点也不高超,画的都是我也能画出来的那种火柴棍小人。他的编程技能我估计也不是很高超,毕竟不是职业程序员。不过他是少数能把编程里面的一些问题和体验用漫画很好表达出来的一位创作家,按现在的说法可以算是复合型人才。

你可以在https://wizardzines.com找到他的很多作品,比如《Linux容器是如何工作的》这种。他的所有作品中,我觉得最感同身受同时也看了不止一次的漫画是一副叫做debugging manifesto的作品。甚至在工作中遇到困难时,看看这幅作品我觉得都有机会能够想出一些新的解决思路,因此,我自己动手把这幅作品画了一个中文改(抄)造(袭)版放在这里。

用ChatGPT做paper prototyping

In programming on 1月 15, 2023 at 9:25 上午

ChatGPT是一个很有意思的技术,我最近看到一些人推荐说可以把chatGPT和软件开发流程做一些结合的想法,于是我也做了一些尝试。

我昨天把Kafka KIP-848整个设计文档都丢给ChatGPT读了一遍,然后开始问它问题,很多术语和可能的实现方向它都能立刻给出答案,结合自己的判断其实能很快深入实现层面。感觉和ChatGPT非常适合用来做快速的不用写代码只是方向探索性的原型设计和验证。

一次对话

比如我和它讨论文档里面的”Reconciliation Loops”,它能告诉我zookeeper/cassandra/etcd都用到了

当我有进一步实现层面的想法的时候,它也能快速告诉我可能的方案和问题

甚至当我有更复杂的改进想法的时候,它也能够应答告诉我这里可能碰到的一些问题

因为它的无所不知,所以你可以非常快的去提出一些可能的其他的设计和实现方案,比如我考虑是不是可以用关系数据库而不是etcd去实现这里的功能,它也能应答:

它甚至提出了使用SQLite的WAL mode而不是使用它之前说的触发器来解决这个问题,可以说是点子非常多了,这个对于原型设计过程中去找寻可能的思路是非常有帮助的。你甚至可以问它做出这种设计的原因是什么:

必要的时候也可以使用一些事实去验证它是不是在一本正经的胡说八道:

总结

结合ChatGPT的大量信息,我们能快速得到和验证很多开发过程中延伸的想法,只要我们保持自己的判断以及用额外的一些渠道去验证这些想法,其实可以把ChatGPT作为一个很好的快速原型的工具来使用。

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