当前位置:嗨网首页>书籍在线阅读

02-用户缓冲IO

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.1 用户缓冲I/O

需要对普通文件执行很多轻量级I/O请求的程序通常会采用用户缓冲I/O。用户缓冲I/O是在用户空间而不是内核中完成的,它可以在应用程序中设置,也可以调用标准库,对用户而言“透明”执行。正如在第2章中所提到的,出于性能考虑,内核通过延迟写、合并相邻I/O请求以及预读等操作来缓冲数据。通过不同的方式,用户缓冲也是旨在提升性能。

以用户空间程序dd的使用为例:

80.png 由于设置了参数 bs=1, dd命令会从设备/dev/zero(提供值全为0的文件流的虚拟设备)中拷贝2MB的数据到文件 pirate中,每次操作拷贝一个字节,共执行2 097 152次操作。也就是说,该程序大约会执行两百万次的读写操作——每次一个字节。

再来看看另一种使用方式,同样是拷贝2MB的数据,每次操作1 024字节的数据块

81.png 该操作也是拷贝相同的2MB字节数据到相同的文件中,但是和前一种方式相比,它的读写操作次数仅仅是前一种的1/1 024。正如表3-1所示,其性能提升是非常明显的。表中记录了(通过三种不同的指标)四次dd调用命令,这四次操作区别仅仅是块大小不同。Real time(实际时间)是总共花费的时间,user time(用户时间)是在用户空间执行程序代码所花费的时间,system time(系统时间)是指进程在内核空间执行系统调用的时间。

表3-1 块大小对性能的影响

| 块 大 小 | Real time | User time | System time | | :----- | :----- | :----- | :----- | :----- | :----- | | 1 字节 | 18.707 秒 | 1.118秒 | 17.549秒 | | 1 024字节 | 0.025秒 | 0.002秒 | 0.023秒 | | 1 130字节 | 0.035秒 | 0.002秒 | 0.027秒 |

和每次读写1字节相比,每次读取1 024字节的数据块的性能有显著提升。但是,该表也表明了使用更大的块大小(意味着系统调用次数更少),如果块大小不是磁盘块大小的整数倍,会导致性能变差。虽然每次读写1 130字节,调用次数更少,但是由于不是磁盘块大小整数倍导致不对齐操作(即系统需要“修补”),因此比每次读写1 024字节效率更低。

为了利用性能提升的优势,需要预先了解物理块大小。表3-1所示的结果表明块大小一般是1 024、1 024的整数倍或1 024的约数。对于/dev/zero,最优的块大小是4 096字节。