如果原来去下载一个资源的速度是 10M/s,但是因为我的机器磁盘 IO 被吃满了,此时我下载资源的速度还是 10M/s 吗

2020-10-27 21:34:15 +08:00
 HorizonZy
2792 次点击
所在节点    程序员
13 条回复
si
2020-10-27 21:35:46 +08:00
不是还有内存吗
HorizonZy
2020-10-27 21:37:54 +08:00
@si 如果内存够大的话,一直都是 10M/s 吗?如果内存快要耗尽了,此时还是 10M/s 吗
si
2020-10-27 21:38:40 +08:00
只要还有内存,磁盘 IO 不影响。
cmdOptionKana
2020-10-27 21:45:03 +08:00
我猜最终会产生一个 “写错误” 结束下载。
miniwade514
2020-10-27 21:46:29 +08:00
@si 网络下载是先写进内存,后写入磁盘的?(网上没搜到确切的资料)
opengps
2020-10-27 21:47:19 +08:00
一般来说不是
有些时候,可以按照一楼的说法,比如某些被缓存的 web 页面,确实会从内存取值避开硬盘,也可能特意设计了缓存来避免硬盘 io 。
不过先想到 io 满了说的有点不够准确,因为你的下载最先用光的更多可能是硬盘的读写带宽,而不是读写流的开关
si
2020-10-27 21:51:09 +08:00
@miniwade514
如果内存耗尽,那看系统怎么处理了。系统可能直接结束进程。Windows 、Linux 一般都是用磁盘做页面文件、交换分区。假如不结束进程的话,这种情况会影响。
基本上 CPU 和其他硬件的 IO 大部分都是经过内存。网络、磁盘这些都是通过内存中转。
msg7086
2020-10-28 00:53:47 +08:00
如果你采用直写方式打开文件,那么写文件的时候就会减慢速度,让你不可能达到超过磁盘 IO 的下载速度。
比如你每秒写入 10 个 1MB 的数据,但是磁盘只能跑到 5MB/s,那么每个磁盘 write() call 会用掉 0.2 秒,也就意味着每 0.2 秒程序才会去从网络上接收下一个 1MB 的包,也就导致下载速度不会超过 5MB/s 了。

如果是缓冲写入的话,磁盘 write()会直接写入内存,然后让内存缓冲慢慢刷进硬盘。如果内存满了,那么 write()要等内存空间,而内存空间要等内存数据刷出,数据刷出还是要等硬盘。所以最终又回到了每个 write()用掉 0.2 秒的状态。
sonxzjw
2020-10-28 08:32:51 +08:00
看程序写的机制,一般会有那么一点会写内存里,但基本上磁盘 io 满了下载写此般都会下降
shenlanAZ
2020-10-28 09:17:29 +08:00
在一个阻塞的模型下 如果你的磁盘 IO 无法给你调度这 10M/s, 那么直到你的下载请求写满 buffer, 下载将会被磁盘 IO 被限制住。
SmiteChow
2020-10-28 10:21:10 +08:00
不是,内核 buffer 未及时落盘会阻塞导致 tcp 丢包->重传
kuro1
2020-10-28 11:26:30 +08:00
buffer 会满
realpg
2020-10-28 23:14:23 +08:00
看你的下载软件源代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/719200

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX