io多线程 性能 扯犊子

搜素到的各种扯犊子、、、、、、、

io多线程,会降低磁盘的读写?这里的磁盘,只单快磁盘,非网络驱动器。

io多线程真的会降低磁盘性能么?
线程只是讲数据挂入到缓冲区,磁盘系统,或者操作系统,会对请求重新排序,应用层的多线程,会影响到底层磁盘的读写么?
个人觉得影响有限。。。。。。,不过没测试过。http://www.sosol.com.cn/html/2009/200911/2009114_175989_15.html
这个是一个测试,可以用来参考

理论是这样的,线程的上下文切换,费用低廉;
但是磁盘上的上下文切换,需要再次寻道,这个费用比较昂贵的,一般以ms记.
普通台式机磁盘寻到一般是8.5ms,那种万转的可能是4ms左右.

磁盘上面上下文切换越多,就会有越多的寻道,效率就会越低.

奇希捷http://www.bloxpo.com/的硬盘多线程IO效率居然不降低的,

难道寻道不要时间??

库函数有一层库缓冲
操作系统有一层page cache
磁盘还有一层磁盘缓冲

线程写入一块数据,并不意味着磁盘会进行上下文切换。
传统磁盘永远是一圈圈的转动,线程只是将数据挂在系统的脏区,
上面比较的应该是磁盘的排序的能力(如果磁盘有这个功能的话。)

实际上上面的多线程速度稍慢,只是因为线程切换的开销,多线程,跟磁盘io,
我觉得没有你想象中的那种关系。单线程,将一个文件随即写磁盘(将文件切为100份,随即写其中一份,每次不同),效果可能比多线程更糟糕。线程写入一块数据,并不意味着磁盘会进行上下文切换。


在实验室测试服务器单线程和10个线程分别写同一个目录下的10个68.5M大小文件的多线程(2141ms)的写入速度比单线程(3356.8ms)快约40%

页高速缓存

        Linux内核通过页高速缓存来加快磁盘操作。当系统存在大量的空闲内存时,内核会把空闲内存的一部分做为页高速缓存。当某个磁盘块被缓存之后,对于这个 磁盘块的读写就相当于内存操作。读操作时直接读对应的page,写操作时将内容写入对应的page,然后将该page标记为脏页,会有后台线程 flush(linux 2.6内核)完成将脏页同步回磁盘。flush在脏页比例大于某个阈值,或者修改超过一定时间之后进行写回。




总结:可以看出,当测试文件增多时,在单线程情况下,性能没有降低。但多线程情况下,性能降低的很明显,由于IO阻塞导致CPU基本被吃满。所以 在实际编码过程中,如果遇到文件读写操作,最好用一个单独的线程做,其它线程可以分配给计算/网络IO等其它地方。而且要注意多个进程之间的文件IO的影 响,如果多个进程分别做顺序IO,其实全局来看(如果是一块磁盘),就变成了随机IO,也会影响系统性能。

猜你喜欢

转载自m635674608.iteye.com/blog/2043681
今日推荐