字符设备和块设备的性能差异

事出同事对于某个设备的压力测试。一个存储设备在被当作块设备之后创建一个ext4的文件系统。相较对于裸设备,也就是字符设备而言,测试最大的写入带宽居然有两个数量级的下降!但测试读取却没有如此明显的性能损失,非常蹊跷。

首先从块设备和字符设备来说,其实这都是驱动程序暴露给Linux kernel的访问接口。简而言之,这两种设备的区别如下:

  • 块设备(block device)读写访问的最小单元是block,也就“块”。字符设备(character device,或条带设备)访问的最小单元是“byte”即“字符”。(这就是句废话,看名字就能理解)
  • 块设备支持乱序访问,而字符设备只能顺序访问。

块设备好比将一个柜子装上若干的抽屉,每个抽屉的空间就是块。每次去找数据只要找到对应的抽屉即可,当然每次都等抽屉装满的效率不会很高。字符设备好比数据随意堆叠,好处是数据可以随时扔进柜子,但找数据的时候就必须翻箱倒柜。

典型的块存储设备是硬盘,而典型的字符存储设备是磁带。有个例子就是tar命令以及不少的文件压缩算法当初就是是给磁带这类的字符设备设计的。tar格式的这个特性导致了从一个压缩包里提取某个文件的时候,由于文件处于字符设备的位置不同,导致耗时很难预估(也就是说,压缩软件的进度条很多都是安慰性的)。

当然,还有一类对象存储,这里就不涉及了。

除去由于驱动程序的问题导致的性能衰减之外,主要是区别1导致了性能的下降。

对于类似的坑,其实很早之前我已经踩过。贴一张旧图,摘自之前的一篇帖《读写SSD的注意事项》

SSD Pormormance Chart

 

可以看的出,当时的块设备的系统设定为每个块4K大小,而当时同事的测试方式每次写入的数据小到可以用bit来衡量。如此小的修改会让系统不断的等待block结束一遍数据对齐。同时,从当初这张图表上就可以看的出,这个两位数的写性能的下降真是一点也不夸张。

总结:块设备有了字符设备没有的乱序访问,而字符设备在写入的时候不需要等待块对齐。对于小于一个块的数据修改操作,字符设备的性能大大于块设备。

推荐阅读:
事出前些日子有人咨询我:“在某
时延 latency(亦称为延
似乎每次开头都要讲述一下计算机

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据