求测试linux下最大io读写的方法
在linux下,现在有个项目是这样的,我要用到多线程,获取很多路视频,然后保存到本地硬盘...
我现在就是想测试下系统最大同时读写多少路效率是最高的呢??
我自己写了一个简答的测试程序,就是同时开多路线程来同时进行io读写,比如我同时开16路线程;8路线程读,读的都是同一个文件;8路线程写,分别写到8个文件中,没做同步互斥...为什么我测出来的io读写速率只有10M/s左右,我用hdparm命令测试,理论上应该达到100多M/s的样子......怎么才能获取更高效的读写速率呢?????
求有经验的指导...!感激不尽!!
------解决方案--------------------你的读写是什么做测试的,读测试需要把数据丢掉哦,写的话是要从内存中取数才快哦。
------解决方案--------------------什么要用多个线程读一个文件?你认为会快吗?相当于本来只需要一次读硬盘的,就变成8次了。速度肯定慢多了
------解决方案--------------------大文件读写可以用mmap,内存映射
------解决方案--------------------就是你要测试一个写
你写要测试,那写的数据哪里来,肯定是找内存里的垃圾数据,如果你重文件里来,那不就不能反映速度了
比如你读测试
你读出来的数据不能管他,如果你又写一个地方,那不又浪费了时间和IO,不能反映真实速度。
而且一般不测不多线程读多个文件,一般就是测试下大文件,小文件。
------解决方案--------------------传统硬盘单线程写4BK每write最快,避免文件间频繁交替写引起寻道损耗,尽量在内存缓存足够多的数据后顺序写出,
------解决方案--------------------
在读一个文件的情况下,8个线程同时读为什么速度慢?
八个线程都去读文件,相当于对同一个文件读了八次,
既然文件是同一个文件,就是说数据都是一样的,那么
只需要将文件的内容读进内存中,然后共享,让八个线程
都能访问这部分数据,这样一方面只用复制一次文件的数据,
一方面少维护了7个线程,效率肯定高很多。
实际工作中,会获取多个视频流,8路线程同时分别读8个不同的文件会不会快一点?
如果有多个文件需要访问,肯定是不能用单线程模型进行文件阻塞读写了。这个时候
使用多线程,每个数据通路都有两个线程,一个是in,一个是out
文件.in1--in1->内存1---out1-->文件.out1
文件.in2--in2->内存2---out2-->文件.out2
...
但是这样的话,程序会变得很复杂,你要非常小心的处理线程间的同步,和互斥问题,我也不是很赞成这样的做法。
针对楼主的问题,我觉得可以使用I/O多路转接
在系统内分配一块内存做缓冲器,(如果有8路数据,就分成八个缓冲区)
输入线程只需要一个,这个线程用多路转接的方式读取数据,将数据读入相应的缓冲区,
然后通知相应的线程此时缓冲区有可用数据
------解决方案--------------------假设是一个单核系统有多个线程同时写磁盘,那么不管开多少线程,
在系统内部其实都是线性的写磁盘,并且
线程之间还有调度开销。
磁盘的读写速度是由磁盘本身决定的,如果磁盘速度是100M/s,
那么单线程情况下,相当于独享100M/s。
多线程同时写的话,就相当于要共享100M/s。
------解决方案--------------------该说的我都都说了,会不会做是楼主从不聪明的问题。
------解决方案--------------------你用的什么写? write 还是 fwrite ?
fwrite 比 write 效率高些吧
------解决方案--------------------楼主,你能不能把你的代码发出来看一下,就看看你怎么用多线程写的。