V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HorizonZy
V2EX  ›  程序员

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

  •  
  •   HorizonZy · 2020-10-27 21:34:15 +08:00 · 2773 次点击
    这是一个创建于 1494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    13 条回复    2020-10-28 23:14:23 +08:00
    si
        1
    si  
       2020-10-27 21:35:46 +08:00
    不是还有内存吗
    HorizonZy
        2
    HorizonZy  
    OP
       2020-10-27 21:37:54 +08:00
    @si 如果内存够大的话,一直都是 10M/s 吗?如果内存快要耗尽了,此时还是 10M/s 吗
    si
        3
    si  
       2020-10-27 21:38:40 +08:00
    只要还有内存,磁盘 IO 不影响。
    cmdOptionKana
        4
    cmdOptionKana  
       2020-10-27 21:45:03 +08:00
    我猜最终会产生一个 “写错误” 结束下载。
    miniwade514
        5
    miniwade514  
       2020-10-27 21:46:29 +08:00
    @si 网络下载是先写进内存,后写入磁盘的?(网上没搜到确切的资料)
    opengps
        6
    opengps  
       2020-10-27 21:47:19 +08:00
    一般来说不是
    有些时候,可以按照一楼的说法,比如某些被缓存的 web 页面,确实会从内存取值避开硬盘,也可能特意设计了缓存来避免硬盘 io 。
    不过先想到 io 满了说的有点不够准确,因为你的下载最先用光的更多可能是硬盘的读写带宽,而不是读写流的开关
    si
        7
    si  
       2020-10-27 21:51:09 +08:00   ❤️ 1
    @miniwade514
    如果内存耗尽,那看系统怎么处理了。系统可能直接结束进程。Windows 、Linux 一般都是用磁盘做页面文件、交换分区。假如不结束进程的话,这种情况会影响。
    基本上 CPU 和其他硬件的 IO 大部分都是经过内存。网络、磁盘这些都是通过内存中转。
    msg7086
        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 秒的状态。
    sonxzjw
        9
    sonxzjw  
       2020-10-28 08:32:51 +08:00
    看程序写的机制,一般会有那么一点会写内存里,但基本上磁盘 io 满了下载写此般都会下降
    shenlanAZ
        10
    shenlanAZ  
       2020-10-28 09:17:29 +08:00
    在一个阻塞的模型下 如果你的磁盘 IO 无法给你调度这 10M/s, 那么直到你的下载请求写满 buffer, 下载将会被磁盘 IO 被限制住。
    SmiteChow
        11
    SmiteChow  
       2020-10-28 10:21:10 +08:00   ❤️ 1
    不是,内核 buffer 未及时落盘会阻塞导致 tcp 丢包->重传
    kuro1
        12
    kuro1  
       2020-10-28 11:26:30 +08:00
    buffer 会满
    realpg
        13
    realpg  
       2020-10-28 23:14:23 +08:00
    看你的下载软件源代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2522 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:09 · PVG 09:09 · LAX 17:09 · JFK 20:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.