我是Grand Central Dispatch的忠实粉丝,我最近一直在寻找dispatch_io_*
调用系列。很容易看到这个API对于网络I/O(慢速,高延迟)有用。也就是说,dispatch_io_create_with_path
的存在意味着在本地文件系统上使用。 (是的,我知道路径也可能指向远程网络文件系统上的资源,但无论如何...)在使用它时,我发现使用dispatch_io_*
似乎带来相当大的开销,与使用简单阻止I/O调用(read
,write
等)。这种减速似乎主要来自内核同步原语,因为块在队列之间来回编组。在我一直在玩的示例工作负载(非常多的I/O限制)下,速度可能会下降10倍。首先,它看起来像dispatch_io
永远不会是一个赢得健谈(小颗粒)I/O。dispatch_io很好地解决了哪些本地存储I/O模式?
我认为,在具有单一本地物理存储卷的单机的常见情况下,I/O请求将在设备级别被有效串行化。从那里,我发现自己有了这两个想法:
- 如果您的工作负载是CPU限制的,那么根据定义,您可以比读取/写入数据更快。
- 如果使用
dispatch_io
,您的工作负载是I/O限制(在这种情况下 - 一个本地物理卷),则无法使您的磁盘以更快的速度为您提供数据。
从那里,我想也许这个API的甜蜜点可能在中间 - 一个工作负载之间的CPU和I/O绑定,但在这一点上我有点儿认为自己到了一个角落,所以我想我会问StackOverflow。
我会接受描述具有这些先决条件(即单机,单本地物理磁盘)的“真实世界”工作流程的第一个答案,其中使用dispatch_io
会显着提高性能。