Почему утилита струйки не влияет на мою динамически связанную программу golang?

У меня есть программа golang, которая загружает тонну данных в OpenStack Object Storage через https. Он опирается на стандартную библиотеку Голанга "net/http" делать работу. Я хотел бы использовать trickle чтобы ограничить скорость загрузки данных, но запуск моего кода с использованием триклека, похоже, не имеет никакого эффекта (как будто я вообще не использую трикл).

Почему это происходит? Есть ли какое-то ограничение струйки или голанга, которое мешает им работать вместе? Есть ли что-то, что я не учел?

Это моя установка:

я знаю это trickle работает только с динамически связанными исполняемыми файлами (см. первый абзац документации по ручке), поэтому я скомпилировал свой код с go build -compiler gccgo mycode.go и выход ldd myexecutable является:

linux-vdso.so.1 =>  (0x00007ffee27b8000)
libgo.so.9 => /usr/lib/x86_64-linux-gnu/libgo.so.9 (0x00007f46062bf000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f46060a9000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4605cdf000)
/lib64/ld-linux-x86-64.so.2 (0x000055aa4d0a4000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4605ac2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f46057b9000)

Я запускаю это на Ubuntu Linux 16.04. я использую slurm для просмотра сетевого трафика при выполнении моей команды. На машине не выполняются никакие другие работы с интенсивной сетью, поэтому я уверен, что вижу трафик, генерируемый моим кодом.

Когда я бегу

trickle -s -v -u2500 myexecutable ...args

Я вижу, что мой сетевой трафик TX увеличился до 12000 КБ / с (максимум, который может обрабатывать сеть) вместо того, чтобы соблюдать мой предел в 2500 КБ / с.

Кто-нибудь может подумать, почему это могло произойти или что я мог бы попытаться исправить?

1 ответ

Решение

Trickle использует LD_PRELOAD для замены всех вызовов, связанных с сетью, через libc своей собственной реализацией. Вот почему Trickle не работает со статическими двоичными файлами.

Go создает все свои собственные системные вызовы напрямую и не использует интерфейс libc, поэтому взаимозаменяемые функции, предоставляемые trickle, не используются.

Другие вопросы по тегам