Ограничить скорость загрузки tcp в Golang

Я хотел бы иметь возможность ограничить пропускную способность TCP-соединения в моем коде. В этом вопросе есть некоторые подсказки, но не совсем то, что мне нужно. Я пытался взломать код src стандартной библиотеки go (пакет net/tcp), используя аналогичный подход, но потерпел неудачу. Моя основная идея состоит в том, чтобы как-то медленно записывать данные из системного вызова во внутренний буфер, тем самым заставляя ОС отбрасывать tcp-пакеты.


person Aleksey Kanaev    schedule 12.11.2017    source источник
comment
Даже если вы медленно читаете из локального буфера TCP, ядро ​​все равно может получить до /proc/sys/net/ipv4/tcp_rmem (третье число — максимальный размер буфера в байтах) за раз. Для долгоживущего соединения вы можете усреднить его с течением времени (буфер заполняется всплеском, потребляется медленно, буфер перезаполняется и т. д.). Чтобы действительно ограничить пропускную способность, вам нужно сделать это на уровне ОС, а не в Go. См. unix.stackexchange.com/a/28203/40168 .   -  person Graham King    schedule 14.11.2017


Ответы (1)


Как сказано в комментарии, проще всего сделать это на уровне ОС с помощью инструмента WonderShaper. Если вы посмотрите на скрипт 'wondershaper', он использует команду '/sbin/tc' из '< пакет href="https://github.com/shemminger/iproute2" rel="nofollow noreferrer">iproute2. Я понимаю, что это не совсем то, что вы хотели бы сделать, но вы можете перейти на более низкий уровень, выполнив команды «tc» в исходном коде с помощью os.exec(). Внедрение вашего собственного алгоритма «управления трафиком» может быть слишком трудоемким и не необходимым для вашей цели.

person Joseph Paul    schedule 27.01.2018