用于文件open()的Linux多线程性能增强

时间:2010-07-28 17:36:56

标签: performance file-io linux-kernel

1 个答案:

答案 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()

映射所需磁盘的各个部分