答案 0 :(得分:1)
不确定这是否是您的问题之一,但它可能有用。
令我印象深刻的是,在单个SATA磁盘上优化数千个随机读取时,执行非阻塞I / O并不是那么容易在linux中以干净的方式进行,没有额外的线程。 / p>
(目前)无法在块设备上发出非阻塞read()
;即,它将阻止磁盘需要的5毫秒寻道时间(5毫秒是永恒的,3 GHz)。将O_NONBLOCK
指定为open()
仅用于向后兼容,CD刻录机或其他东西(这是一个相当模糊的问题)。通常,open()
不会阻塞或缓存任何内容,它主要是为了获取文件的句柄以便稍后执行某些数据I / O.
就我的目的而言,mmap()
似乎让我尽可能接近磁盘的内核处理。使用madvise()
和mincore()
我能够充分利用磁盘的NCQ功能,这可以通过改变未完成请求的队列深度来证明,结果与所花费的总时间成反比。发出10k读数。
由于64位内存寻址,使用mmap()
将整个磁盘映射到内存完全没问题。 (在32位平台上,您需要使用mmap64()
)