1
si 2020-10-27 21:35:46 +08:00
不是还有内存吗
|
3
si 2020-10-27 21:38:40 +08:00
只要还有内存,磁盘 IO 不影响。
|
4
cmdOptionKana 2020-10-27 21:45:03 +08:00
我猜最终会产生一个 “写错误” 结束下载。
|
5
miniwade514 2020-10-27 21:46:29 +08:00
@si 网络下载是先写进内存,后写入磁盘的?(网上没搜到确切的资料)
|
6
opengps 2020-10-27 21:47:19 +08:00
一般来说不是
有些时候,可以按照一楼的说法,比如某些被缓存的 web 页面,确实会从内存取值避开硬盘,也可能特意设计了缓存来避免硬盘 io 。 不过先想到 io 满了说的有点不够准确,因为你的下载最先用光的更多可能是硬盘的读写带宽,而不是读写流的开关 |
7
si 2020-10-27 21:51:09 +08:00 1
@miniwade514
如果内存耗尽,那看系统怎么处理了。系统可能直接结束进程。Windows 、Linux 一般都是用磁盘做页面文件、交换分区。假如不结束进程的话,这种情况会影响。 基本上 CPU 和其他硬件的 IO 大部分都是经过内存。网络、磁盘这些都是通过内存中转。 |
8
msg7086 2020-10-28 00:53:47 +08:00 3
如果你采用直写方式打开文件,那么写文件的时候就会减慢速度,让你不可能达到超过磁盘 IO 的下载速度。
比如你每秒写入 10 个 1MB 的数据,但是磁盘只能跑到 5MB/s,那么每个磁盘 write() call 会用掉 0.2 秒,也就意味着每 0.2 秒程序才会去从网络上接收下一个 1MB 的包,也就导致下载速度不会超过 5MB/s 了。 如果是缓冲写入的话,磁盘 write()会直接写入内存,然后让内存缓冲慢慢刷进硬盘。如果内存满了,那么 write()要等内存空间,而内存空间要等内存数据刷出,数据刷出还是要等硬盘。所以最终又回到了每个 write()用掉 0.2 秒的状态。 |
9
sonxzjw 2020-10-28 08:32:51 +08:00
看程序写的机制,一般会有那么一点会写内存里,但基本上磁盘 io 满了下载写此般都会下降
|
10
shenlanAZ 2020-10-28 09:17:29 +08:00
在一个阻塞的模型下 如果你的磁盘 IO 无法给你调度这 10M/s, 那么直到你的下载请求写满 buffer, 下载将会被磁盘 IO 被限制住。
|
11
SmiteChow 2020-10-28 10:21:10 +08:00 1
不是,内核 buffer 未及时落盘会阻塞导致 tcp 丢包->重传
|
12
kuro1 2020-10-28 11:26:30 +08:00
buffer 会满
|
13
realpg 2020-10-28 23:14:23 +08:00
看你的下载软件源代码
|