【论文分享】Non-Blocking Writes to Files(操作系统层面优化write()方法的时间开销)

Non-blocking Writes to Files (FAST '15)

Daniel Campello and Hector Lopez, Florida International University; Luis Useche, Google Inc.; Ricardo Koller, IBM T. J. Watson Research Center; Raju Rangaswami, Florida International University

image-20220526202106690

在现有的操作系统体系结构下,对文件进行读写操作有直接IO和间接IO两种方式,由于磁盘的读写速度较慢,因此操作系统通常默认使用间接IO,通过在内核态内存空间加入Page Cache,读写操作直接修改和访问Page Cache,操作系统自行控制Page Cache和磁盘的同步时机,减少了对磁盘的读写,在大部分场景下提高了读写的效率。然而引入Page Cache也会带来一个新的问题,如果Page Cache中本身没有映射你要写入的空间,操作系统需要先将这块空间映射到Page Cache,然后才能继续进行写入操作,这样就增添了额外的时间开销。而论文提出了一种方法,通过调整操作系统写入的逻辑,优化了这一开销。

本文主要根据作者的演讲ppt,对论文进行分析。

image-20220526183411827

写入操作有同步和异步两种,同步操作需要等Page Cache更新完后,write()才返回,异步操作中write()会直接返回,内核线程会替代完成等待Page Cache更新完成的动作,但是Page Cache实际完成更新的时间并不会因此减少。

image-20220526190927468

对于同步的情况来说,这是最常用的编程方法,如果写入的地址没有在Page Cache中,操作系统会对存储后端发起fetch的请求,然后将这块空间与Page Cache映射起来。步骤3、4实际上是操作系统对异常的处理(类似于内存子系统中的缺页处理)。这段时间的开销应该想办法给它抹去。

否则在Page Cache命中率较低的情况下,会极大的影响系统IO的效率。

image-20220526191709122

对于一些软件或文件服务写操作的统计发现,平均而言,63.12%的写操作涉及部分页面的覆盖;根据页面缓存的大小,这些覆盖可能会导致不同程度的页面检索。

image-20220526191954257

文章提出了一种异步的解决方案,当发现Page Cache中并未存在想写入的空间时,会直接将要写入的数据写入另一个位置,write()就返回了。当Page Cache中映射好地址后,再将数据写入Page Cache中。

这个做法使得write()方法不再需要等待操作系统对Page Cache映射关系的修改,提升了应用层软件的写操作的时间开销。也间接提高了存储后端的带宽使用情况。

image-20220526192805269

文章认为3、6这个过程在某些情况下,并不是一定需要执行的,因为写入的数据可以先往Patch里写就好,不用第一时间写入Page Cache中。只有当读取操作发生时,才需要将数据同步至Page Cache,因为读取操作是从Page Cache中读取数据的。

image-20220526193251881

因此提出了延迟抓取(Lazy Fetch)的策略,当read()被调用,且Page Cache不存在时,才page fetch。好处是分配的页面内存只在必要时才取用;缺点是资源的使用是不可预测的,可能是突发性的。

image-20220526194010781

上面介绍了两种page fetch的策略,异步实时抓取和演示抓取。具体的同步机制也有两种做法。

image-20220526195723262

一种是用户态阻塞式的等待Page Cache fetch完成,一种是异步使用专门的线程进行等待。

image-20220526195933933

作者在Linux环境下修改VFS来实现非阻塞式写入,使用了三种工作负载来评估方法的优越性。

image-20220526200318186

image-20220526200333226

image-20220526200347089

三种方案在存在写操作的环境下均有提升,其中延时抓取的方式的提升效果是最好的。提出的方法基本不会影响读的效率。

image-20220526200631111

这个环境下的结果也说明了,提出的方案能够极大的降低写入操作的延时,基本不会对读操作有啥不良影响。

image-20220526200759810

最后一个环境也说明了,不论是在磁盘还是在固态中,都能用不错的提升。

image-20220526200858308

现有的工作也尝试在优化写操作的延时,不论是库函数自带的非阻塞IO,还是POSIX AIO,它们都有特定的编程规范,因此无法直接优化已存在的程序。但是本文工作是在操作系统层面进行优化,因此可以使得原有程序的IO操作直接得到提升。

image-20220526201307354

结论

  • 在许多情况下,操作系统会在异步写入时阻塞进程。
  • 证明了这种阻塞是不必要的,而且不利于性能的提高
  • 任何种类的现代操作系统的通用解决方案
  • 不需要修改应用程序
  • 评估表明非阻塞式写入如何在广泛的工作负载中有效地减少写入延迟

一点想法

作者的方法能够往很多加了一层缓存来提升效率的解决方案上套,比如对内存进行写操作导致的缺页异常,也能够引入一个新的硬件,将写入的数据先存在该硬件,应用层程序继续往后执行,等操作系统完成换页后再将数据写入内存。

如果大家对文章内容有疑问或建议,欢迎评论区留言,我们可以一起讨论,共同提高
转载请标明原作者:https://blog.csdn.net/qq_36622751

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值