Что происходит, когда интернет-соединение быстрее скорости записи в хранилище?

28

Что произойдет, если попытаться загрузить файл со скоростью 800 МБ / с (100 МБ / с) на жесткий диск со скоростью записи 500 МБ / с (62,5 МБ / с)? Будет ли система ограничивать скорость загрузки?

ymulki
источник
5
Это и было с момента создания сетей, это совершенно обычная ситуация, когда вы находитесь в быстрой сети, как в университете в нерабочее время.
Питер - Восстановить Монику
4
Так как вы можете программировать, вы можете легко наблюдать это сами. Напишите простой TCP-сервер и клиент (вы должны быть в состоянии найти примеры для библиотеки сокетов на выбранном вами языке), позвольте серверу доставлять данные настолько быстро, насколько это возможно, и модифицируйте клиент так, чтобы он считывал эти данные только с указанной скоростью. (сон между чтениями). Убедитесь, что данные получены без изменений. Вы даже можете наблюдать пакеты, отправленные с Wireshark или аналогичные.
Карстен С
3
Имея опыт, описанный в посте @ PeterA.Schneider, я могу вам сказать, что вы должны учитывать буферы оперативной памяти операционной системы. Пока они не заполнены, вы можете эффективно хранить загруженные данные со скоростью ОЗУ. (Обычно в тысячах мегабайт в секунду.)
Никто
@Nobody И, конечно, всегда есть абсурдные каналы, которые составляют магистраль Интернета, которые передают данные так быстро, что ОЗУ вашего типичного компьютера даже не успевает!
Cort Ammon - Восстановить Монику
Ваш компьютер будет генерировать ICMP-запрос, сообщающий о его замедлении. Тем не менее, на этих скудных скоростях вы могли бы также получить SSD или M.2 SSD, и теперь ваша скорость записи настолько высока, что 100 Мбит / с будет легко. Некоторые M.2 имеют скорость записи 1500 МБ / с. Поместите 2 или более в RAID, и вы можете многократно увеличить эту скорость. Обычный SSD может быть 300-450 МБ / с в зависимости от емкости и марки. storagereview.com/samsung_960_pro_m2_nvme_ssd_review
кибернард

Ответы:

41

Многие протоколы, включая TCP, который является наиболее широко используемым протоколом в Интернете, используют так называемое управление потоком. Управление потоком просто означает, что TCP гарантирует, что отправитель не перегружает получателя, отправляя пакеты быстрее, чем он может очистить свой буфер. Идея состоит в том, что узел, принимающий данные, отправит некоторую обратную связь узлу, отправляющему данные, чтобы сообщить ему о своем текущем состоянии. Таким образом, двусторонняя обратная связь позволяет обеим машинам оптимально использовать свои ресурсы и предотвращать любые проблемы из-за несоответствия в их оборудовании.

https://en.wikipedia.org/wiki/Flow_control_(data)

Сигма
источник
2
... Идеально. Bufferbloat означает, что вполне вероятно, что несколько коммутаторов будут хранить и ожидать пересылки постоянно растущей стопки пакетов (что может быть несколько смягчено протоколом передачи, который требует периодических ACK для продолжения).
Эрик Тауэрс
3
Вы могли бы упомянуть, что это отличает TCP (эй, у него есть контроль в его имени) от UDP, который с радостью продолжит отправку, независимо от емкости потребителя.
Питер - Восстановить Монику
5
@Fabian Это то, что происходит все равно все время. Кэш жесткого диска ОС позволяет «отправлять» данные на жесткий диск намного быстрее, чем они могут быть записаны, заполняя кэш в оперативной памяти и записывая на диск как можно быстрее. Таким образом, в зависимости от объема (неиспользованного) ОЗУ на вашем компьютере, ОС может буферизировать от нескольких десятков до сотен МБ файла в ОЗУ, прежде чем он достигнет диска. Однако размер кэша является компромиссом, поскольку данные, которые приложение может считать уже сохраненными на диске, могут не сохраняться в течение определенного времени, что может привести к неожиданной потере данных в случае сбоя (питания) или аналогичного.
JimmyB
2
@Fabian: это вы можете увидеть в диалоге копирования файлов в Windows, начиная с 8.1. В расширенном режиме он показывает скорость передачи, и вы можете заметить, что первая половина секунды или около того очень быстрая, и если файл больше, чем тот, который мог быть передан во время этого, то скорость значительно падает, чтобы постоянная скорость. Эта высокая скорость в начале была связана с кешем. После его заполнения скорость уменьшается.
вс
1
@EricTowers Нет, bufferbloat происходит только тогда, когда узким местом является сетевое соединение. (Вы можете увидеть форму буфера на жестком диске, которая замедлит другие операции с жестким диском, но не повлияет на другие сетевые подключения)
user253751
12

что случилось бы?

  • Байты, которые не могут быть вовремя записаны на жесткий диск, будут временно где-то буферизованы; Весьма вероятно, что некоторые из них будут буферизованы в приложении, которое «преобразует» сетевой трафик в трафик жесткого диска (т. е. в вашем браузере), а в случае более продолжительной перегрузки - части нижнего уровня стека (т. е. сетевая подсистема ПК) также будет иметь буферы на более низких уровнях, которые будут заполняться до полного заполнения.
  • Информация о том, что данные поступают слишком быстро, затем каким-то образом передается обратно отправителю. В случае TCP / IP это будет означать, что есть часть протокола TCP, которая сообщает отправителю, что он должен прекратить отправку. На странице Википедии по TCP / IP лучше всего сказано:

    В его [TCP] ответственность входит сквозная передача сообщений независимо от базовой сети, а также контроль ошибок, сегментация, контроль потока, контроль перегрузки и ...

  • В конце концов, «система» (не обязательно компьютер получателя, но вся система, состоящая из отправителя, сети и получателя) косвенно «ограничит» скорость загрузки. Тем не менее, переменная скорости не существует. Как сетевой трафик, так и трафик HDD основаны на блоках, то есть задержки между этими блоками будут достаточно продолжительными (на стороне более быстрой сети), пока чистая «скорость» (пропускная способность) не станет в среднем такой же, как медленная скорость вашего HDD.

Будет ли система ограничивать скорость загрузки?

Не буквально. Несколько десятков лет назад компьютеры действительно общались с синхронными скоростями (то есть модемы с фиксированными настройками скорости). На некотором относительно низком уровне это также происходит сегодня; т. е. ваш DSL или кабельный модем, вероятно, будут иметь некоторую установленную скорость, с которой он обменивается данными со своим прямым физическим компонентом восходящей линии связи. Но в 2017 году все это достаточно сложно, что почти все компоненты довольно динамичны. В старые добрые времена модемы часто физически могли говорить только с определенной скоростью, и это даже нужно было установить перед набором номера. Существуют (были) некоторые сетевые протоколы, такие как ATM, которые пытались получить синхронную глобальную сеть, но они не так хорошо, по сравнению с TCP / IP.

Сегодня эффективная скорость обычно всегда неявно достигается путем буферизации, управления потоком и так далее.

Также обратите внимание, что в вашем примере может быть даже больше участников. Сетевой интерфейс может иметь больше работы (другие соединения с вашим ПК). Некоторая часть сети по пути может быть занята (член семьи просматривает или смотрит видео). Жесткий диск может выполнять 3 записи большого файла одновременно. Поэтому не имеет смысла специально устанавливать «скорость», которая может быть ограничена.

Anoe
источник
2

Загрузка файлов (обычно) происходит по протоколу TCP. В TCP отправитель не отправляет данные до тех пор, пока получатель не будет готов их получить.

Что произойдет, это то, что ваш компьютер зарезервирует некоторое количество оперативной памяти для временного хранения полученных данных перед записью их на жесткий диск (это называется буфером) Затем он запросит у отправителя достаточно данных для заполнения буфера. Получив данные, он начнет записывать данные из буфера на жесткий диск - однако он не будет запрашивать дополнительные данные, пока буфер почти заполнен.

Общий эффект заключается в том, что отправитель просто ждет, пока получатель не догонит его, прежде чем продолжить отправку.

user253751
источник