登录
首页 >  Golang >  Go问答

滴流实用程序不影响我动态链接的golang程序?

来源:Golang技术栈

时间:2023-03-03 17:15:55 342浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《滴流实用程序不影响我动态链接的golang程序?》,这篇文章主要讲到golang等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

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

为什么会这样?涓流或 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 限制。

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

正确答案

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

Go 直接进行所有自己的 syscall,并且不使用 libc 接口,因此不使用trickle 提供的inter-positioned 函数。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表