高负荷的io操作一般而言多用线程是有好处,但你这里碰到了磁盘最大读写速度的瓶颈,所以在这种场景下过多的线程反而没太大意义。如果你的文件有5TB(求种子~~~),那么硬盘一般而言就不是普通的了,可能是企业级用的,这种你最好多试几次判断下极限在哪。但一般情况下而言,18000个文件共5TB,你一个线程跑也慢不到哪去。
谢谢啦!18000和5TB虚构的。 有几个问题不吝赐教:
1、怎么科学合理的“试几次判断下极限在哪”
2、8TB SSD固态硬盘,多线程向同硬盘拷贝,瓶颈应该不容易达到吧?
@王庆东mas: 这个和你ssd的性能以及你是否做了4k对齐有关。你先用ssd benchmark测下读写性能。8tb的ssd这个应该不是家用的了,性能应该在400M/s以上吧(顺序读)。
这个极限和传统的hdd还不同,那个还有寻道时间,ssd这块基本就忽略吧(相差一般在百倍),而且你又是大文件(建立在你18000和5tb的基础上,如果条件不同可能差异会很大),单线程可能就基本把io给打满(具体可以通过性能管理器或者任务管理器中看),如果还有余量的话你就可以增加线程来看极限在哪。
另ssd也不是完全没有瓶颈的,我公司有专门的文件服务器,用ssd卡(企业级),在高负荷的时候也经常打满。
@Daniel Cai: 谢谢
多线程文件没有意思。在一块硬盘上的时候。单线程文件顺序写才是最快的。还有如果你的磁盘打满了(不管你时什么方式的读写)。系统一样慢。
打满是啥意思? 转速很小的情况下吗?
多线程读,是读得快,但是你硬盘的速度跟不上有啥用呢?而且内存很容易就满了,电脑就卡了呗。
能说专业点吗?谢谢了
@王庆东mas: 来自百度
多线程就是多个指令序列同时执行,能同时占有多个CPU核心,提高整体运算速度。
不过不建议用多线程复制,多个线程同时访问同一个物理设备,同时只有一个线程能获得这个设备的控制权,其他线程都在等待。因此文件复制的瓶颈在disk i/o,不在CPU,多线程不能提高disk i/o的性能,反而有可能增加磁盘的寻道时间。
怎么会没有意义呢,如果你的电脑挂了3000多个硬盘,那么多线程COPY还是有意义的。
不同的线程复制不同的硬盘,一个CPU对付一千个硬盘。
但如果是D盘:folder1目录下8T 个文件 复制到D盘:folder2目录下呢?这样多线程怎么派上用场呢? 谢谢
@王庆东mas: 所以大家说了这么多,你还是没明白多线程是干啥的?
请问一个女人生一个孩子十个月,十个女人生十一个孩子需要几个月?
(排除多胞胎情况)
最后上一张谷歌大神的图:
@爱编程的大叔: 谢谢
将数据转成2进制,用单线程控制
说明你的操作系统线程已经可能不堪重负,线程越多不一定越快(何况乎硬盘)。
实际优化要根据你的实际情况,硬盘文件的情况,大文件还是小文件,单硬盘还是多硬盘。单硬盘的话哪怕cpu再强——线程开再多也没用(即使ssd跟内存速度也不再一个数量级),因为硬盘本身的寻址就是瓶颈。速度取决于最短板的硬件——所谓水桶就这样。
谢谢!小文件和大文件 可以解释吗?