Предположим, у вас есть программа, которая читается из сокета. Как вы поддерживаете скорость загрузки ниже определенного порогового значения?Как вы оцениваете ограничение операции ввода-вывода?
ответ
На прикладном уровне (с использованием API стиля сокетов Berkeley) вы просто смотрите часы и читаете или записываете данные со скоростью, на которую вы хотите ограничить.
Если вы только читаете 10kbps в среднем, но источник отправляет больше, чем это, то в конечном итоге все буферы между ним и вами будут заполняться. TCP/IP позволяет это, и протокол будет способствовать замедлению отправителя (на уровне приложения, вероятно, все, что вам нужно знать, это то, что на другом конце блокировка вызовов записи блокируется, неблокирующие записи будут терпеть неудачу и асинхронны записи не будут завершены, пока вы не прочтете достаточное количество данных, чтобы это разрешить).
На прикладном уровне вы можете быть приблизительным - вы не можете гарантировать жесткие ограничения, такие как «не более 10 килобайт будет пропускать заданную точку в сети за одну секунду». Но если вы будете следить за тем, что вы получили, вы можете получить среднее право в долгосрочной перспективе.
Предполагая сетевой транспорт, основанный на TCP/IP, пакеты отправляются в ответ на пакеты ACK/NACK, идущие в другую сторону.
Ограничивая скорость передачи пакетов, подтверждающих получение входящих пакетов, вы в свою очередь уменьшите скорость отправки новых пакетов.
Это может быть немного неточно, поэтому его возможно оптимально контролировать скорость потока вниз и адаптировать скорость ответа адаптивно, пока он не окажется в комфортном пороге. (Это произойдет очень быстро, однако вы отправляете dosens of acks a second)
Если вы читаете сокет, вы не контролируете используемую полосу пропускания - вы читаете буфер операционной системы этого сокета, и ничего, что вы говорите, заставит человека, пишущего в сокет, записать меньше данных (если, конечно, вы не разработали для этого протокол).
Все, что медленно читает чтение, это заполнить буфер и вызвать конечный останов в сети, но вы не можете контролировать, как и когда это происходит.
Если вы действительно хотите читать только так много данных, в то время, вы можете сделать что-то вроде этого:
ReadFixedRate() {
while(Data_Exists()) {
t = GetTime();
ReadBlock();
while(t + delay > GetTime()) {
Delay()'
}
}
}
Буферы имеют максимальные значения. Cache? Кэш не задействован. – 2008-09-18 18:08:14
Wget, кажется, управлять им с опцией --limit курса. Вот со страницы человека:
Обратите внимание, что Wget реализует предельный переспав соответствующее количество времени после того, как сети чтения, которые имели меньше времени, чем указано в скорости. В конце концов эта стратегия приводит к тому, что TCP-передача замедляется до приблизительно указанной ставкой. Однако это может занять некоторое время для . Этот баланс должен быть достигнут, поэтому не надо быть удивленным, если ограничение скорости не работает с очень маленькими файлами.
Как уже говорилось, ядро ОС управляет трафиком, и вы просто читаете копию данных из памяти ядра.Чтобы примерно ограничить скорость всего одного приложения, вам необходимо отложить чтение данных и разрешить входящие пакеты в ядре, что в конечном итоге замедлит подтверждение входящих пакетов и снизит скорость на одном сокете.
Если вы хотите замедлить весь трафик на машине, вам нужно пойти и настроить размеры входящих TCP-буферов. В Linux вы повлияли бы на это изменение, изменив значения в/proc/sys/net/ipv4/tcp_rmem (размеры буфера памяти для хранения) и другие файлы tcp_ *.
Это как при ограничении игры определенным количеством FPS.
extern int FPS;
....
timePerFrameinMS = 1000/FPS;
while(1) {
time = getMilliseconds();
DrawScene();
time = getMilliseconds()-time;
if (time < timePerFrameinMS) {
sleep(timePerFrameinMS - time);
}
}
Таким образом, вы убедитесь, что частота обновления игры будет не более FPS. Точно так же DrawScene может быть функцией, используемой для перекачки байтов в поток сокетов.
Чтобы добавить ответ BRANAN в:
Если вы добровольно ограничить скорость чтения на приемном конце, в конце концов очереди будет заполнить на обоих концах. Затем отправитель будет либо блокировать свой вызов send(), либо возвращать вызов send() с отправленной длиной меньше ожидаемой длины, передаваемой вызову send().
Если отправитель не готов к работе с этим случаем путем спящего режима и пытается повторно отправить то, что не вписывается в буферы ОС, у вас возникнут проблемы с подключением (отправитель может обнаружить это как ошибку) или потерять данные (отправитель может неосознанно отказаться от данных, которые не вписывались в буферы ОС).
Установка буферов для приема и приема небольших сокетов, скажем 1k или 2k, так что продукт задержки * пропускной способности = размер буфера. Возможно, вы не сможете получить его достаточно маленьким по быстрым ссылкам.
- 1. Как вы оцениваете/оцениваете архитектуру обмена сообщениями?
- 2. Как вы оцениваете программиста?
- 3. Как вы оцениваете ход вызова веб-службы?
- 4. Как вы оцениваете свои проекты?
- 5. Как вы оцениваете отчеты SRSS?
- 6. Как вы оцениваете производительность кеша?
- 7. Как вы оцениваете строку как выражение clojure?
- 8. Как вы оцениваете Oracle Portal как платформу?
- 9. При оценке дизайна, как вы оцениваете сложность?
- 10. Как вы оцениваете временную сложность этого алгоритма?
- 11. Как вы оцениваете качество своего объектного кода?
- 12. Как вы оцениваете масштаб шкалы CAKeyframe?
- 13. Как вы оцениваете эффективность приложений Silverlight?
- 14. Как вы оцениваете популярность языка программирования?
- 15. Как вы оцениваете результат нескольких задач
- 16. Как вы оцениваете эффективность хранимой процедуры?
- 17. Как вы оцениваете проекты веб-дизайна?
- 18. Как вы оцениваете надежность Open Street Maps?
- 19. Как вы оцениваете java.lang.String в clojure
- 20. Закорачивается, если вы оцениваете заявление дважды?
- 21. Как вы оцениваете ввод пароля как строку в java?
- 22. Ограничение операции Netsuite
- 23. В R, как вы оцениваете ... в вызывающей функции?
- 24. Как вы оцениваете функции из списка в MATLAB
- 25. Как Вы оцениваете тип Action <T>?
- 26. Как вы оцениваете пропускную способность нисходящего канала для каждого пользователя?
- 27. Как вы оцениваете проект EAI с использованием функции?
- 28. Как вы оцениваете модель ML, уже развернутую на производстве?
- 29. Как вы оцениваете улучшение интерфейса или снижение удобства использования?
- 30. Как вы оцениваете результаты работы базы данных в новом действии?
Не требует ли этого перехода к стеку TCP/IP низкого уровня и обходит стандартный уровень сокета? – Branan 2008-09-18 18:05:14