为什么 trickle 实用程序不影响我的动态链接 golang 程序?

Why doesn't the trickle utility affect my dynamically-linked golang program?

我有一个 golang 程序,可以通过 https 将大量数据上传到 OpenStack 对象存储。它依赖于 golang 标准库 "net/http" 来完成这项工作。我想使用 trickle 来限制数据的上传速率,但是 运行 使用 trickle 来调整我的代码似乎没有任何效果(就好像我根本没有使用 trickle 一样) .

为什么会这样? trickle 或 golang 是否有一些限制阻止它们一起工作?有没有我没有考虑到的陷阱?

这是我的设置:

我知道 trickle 仅适用于动态链接的可执行文件(请参阅 trickle 文档的第一段),因此我使用 go build -compiler gccgo mycode.go 和 [=16= 的输出编译了我的代码] 是:

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 查看网络流量作为我的命令 运行s。该机器未 运行 任何其他网络密集型作业,因此我确信我看到了我的代码生成的流量。

当我运行

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

我看到我的 TX 网络流量飙升至大约 12000KB/s(网络可以处理的最大值),而不是遵守我的 2500KB/s 的限制。

谁能想到为什么会发生这种情况或我可以尝试如何解决它?

Trickle 依赖于使用 LD_PRELOAD 将所有通过 libc 的网络相关调用替换为自己的实现。这就是 trickle 不适用于静态二进制文件的原因。

Go直接进行了所有自己的系统调用,没有使用libc接口,所以没有使用trickle提供的中间定位函数。