|
先说统信
再说麒麟系统
linux的读写系统调用提供了一个O_DIRECT标记,可以让尝试绕过缓存,直接对磁盘进行读写。(这哪是麒麟系统发明的新东西,明明就是linux自带的)
为啥是尝试绕过?当直接落盘失败时还要通过缓存去落盘。
为了能实现直接落盘,使用direct IO限制多多,文件偏移得对齐到磁盘block。内存地址得对齐到磁盘block,读写size也得对齐到磁盘block。
在大文件传输的场景下,零拷贝技术并不是最优选择;因为在零拷贝的任何一种实现中,都会有「DMA将数据从磁盘拷贝到内核缓存区——Page Cache」这一步,但是,在传输大文件(GB 级别的文件)的时候,PageCache 会不起作用,那就白白浪费 DMA 多做的一次数据拷贝,造成性能的降低,即使使用了 PageCache 的零拷贝也会损失性能 这是因为在大文件传输场景下,每当用户访问这些大文件的时候,内核就会把它们载入 PageCache 中,PageCache 空间很快被这些大文件占满;且由于文件太大,可能某些部分的文件数据被再次访问的概率比较低,这样就会带来 2 个问题:
PageCache 由于长时间被大文件占据,其他「热点」的小文件可能就无法充分使用到 PageCache,于是这样磁盘读写的性能就会下降了
PageCache 中的大文件数据,由于没有享受到缓存带来的好处,但却耗费 DMA 多拷贝到 PageCache 一次
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|