日期:2014-05-16  浏览次数:20739 次

求测试linux下最大io读写的方法
在linux下,现在有个项目是这样的,我要用到多线程,获取很多路视频,然后保存到本地硬盘...
我现在就是想测试下系统最大同时读写多少路效率是最高的呢??
我自己写了一个简答的测试程序,就是同时开多路线程来同时进行io读写,比如我同时开16路线程;8路线程读,读的都是同一个文件;8路线程写,分别写到8个文件中,没做同步互斥...为什么我测出来的io读写速率只有10M/s左右,我用hdparm命令测试,理论上应该达到100多M/s的样子......怎么才能获取更高效的读写速率呢?????
求有经验的指导...!感激不尽!!
Linux 多线程 io读写

------解决方案--------------------
你的读写是什么做测试的,读测试需要把数据丢掉哦,写的话是要从内存中取数才快哦。
------解决方案--------------------
什么要用多个线程读一个文件?你认为会快吗?相当于本来只需要一次读硬盘的,就变成8次了。速度肯定慢多了
------解决方案--------------------
大文件读写可以用mmap,内存映射
------解决方案--------------------
就是你要测试一个写
你写要测试,那写的数据哪里来,肯定是找内存里的垃圾数据,如果你重文件里来,那不就不能反映速度了
比如你读测试
你读出来的数据不能管他,如果你又写一个地方,那不又浪费了时间和IO,不能反映真实速度。
而且一般不测不多线程读多个文件,一般就是测试下大文件,小文件。
------解决方案--------------------
传统硬盘单线程写4BK每write最快,避免文件间频繁交替写引起寻道损耗,尽量在内存缓存足够多的数据后顺序写出,
------解决方案--------------------
引用:
Quote: 引用:

什么要用多个线程读一个文件?你认为会快吗?相当于本来只需要一次读硬盘的,就变成8次了。速度肯定慢多了
因为实际工作中,会获取多个视频流,每一个视频流都会有一个线程专门处理它,所有需要开多个线程,我只是想模拟的测试一下看计算机能同时读写多少路性能最佳.....我对硬盘读写最底层的机制不是很懂,比如我开8路线程同时读一个文件怎么就慢了呢?8路线程同时分别读8个不同的文件会不会快一点?还有计算机在处理读写的时候是一个一个的读写的呢,还是并发的同时可以读写多个?希望能详细帮我说说这些问题,感激不尽啊.....


在读一个文件的情况下,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 效率高些吧
------解决方案--------------------
楼主,你能不能把你的代码发出来看一下,就看看你怎么用多线程写的。