为什么涓stream实用程序不会影响我的dynamic链接的golang程序?

我有一个golang程序,通过https将大量数据上传到OpenStack Object Storage。 它依靠golang标准库"net/http"来完成这项工作。 我想使用trickle来限制数据上传,但使用滴stream运行我的代码似乎没有任何效果(好像我没有使用滴stream)。

为什么会这样呢? 涓stream或golang有一些限制,阻止他们一起工作? 有没有我没有考虑过的问题?

这是我的设置:

我知道trickle只适用于dynamic链接的可执行文件(请参阅涓stream文档的第一段),所以我编译了我的代码,使用go build -compiler gccgo mycode.goldd 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查看networkingstream量,因为我的命令运行。 该机器不运行任何其他networking密集型工作,所以我相信我看到了由我的代码生成的stream量。

当我跑步

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

我看到我的TXnetworkingstream量峰值达到约12000KB / s(networking可以处理的最大值),而不是尊重我的2500KB / s的限制。

任何人都可以想到为什么会发生这种情况,或者我可以尝试解决这个问题?

Trickle依靠LD_PRELOAD来通过libc替换所有与网络相关的调用。 这就是为什么涓流不适用于静态二进制文件。

Go直接创建所有自己的系统调用,而不使用libc接口,所以不使用由trickle提供的内部函数。