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

问题描述

Trickle依赖于使用LD_PRELOAD来通过libc替换其自己的实现中与网络相关的所有调用。这就是为什么细流不适用于静态二进制文件

Go直接进行自己的所有系统调用,并且不使用libc接口,因此不使用细流提供的插入函数

解决方法

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

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

这是我的设置:

我知道这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网络流量激增到大约12000KB / s(网络可以处理的最大值),而不是遵守我的2500KB / s的限制。

谁能想到为什么会发生这种情况,或者我可以尝试解决此问题?