我有一个golang程序,它通过https将大量数据上传到OpenStack Object Storage。它依赖于golang标准库"net/http"
来完成工作。我想使用trickle
对数据上传进行速率限制,但使用涓流运行我的代码似乎没有任何影响(好像我根本没有使用涓流)。
为什么会这样?涓流或golang有一些限制,阻止他们一起工作吗?是否有一些我没有考虑过的问题?
这是我的设置:
我知道trickle
仅适用于动态链接的可执行文件(请参阅涓流文档的第一段),因此我使用go build -compiler gccgo mycode.go
和{{1}的输出编译了我的代码是:
ldd myexecutable
我在Ubuntu Linux 16.04上运行它。我在命令运行时使用slurm
查看网络流量。该机器没有运行任何其他网络密集型作业,因此我确信我看到了我的代码生成的流量。
当我跑步时
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)
我发现我的TX网络流量峰值大约为12000KB / s(网络可以处理的最大值),而不是遵守我的2500KB / s的限制。
任何人都可以想到为什么会发生这种情况或者我可以尝试解决这个问题吗?
答案 0 :(得分:5)
Trickle依赖于使用LD_PRELOAD通过libc将所有与网络相关的调用替换为自己的实现。这就是为什么trickle不能用于静态二进制文件。
Go直接创建自己的系统调用,不使用libc接口,因此不使用由trickle提供的互连函数。