【问题标题】:Why doesn't the trickle utility affect my dynamically-linked golang program?为什么滴流实用程序不会影响我动态链接的 golang 程序?
【发布时间】:2016-11-02 18:12:08
【问题描述】:

我有一个 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 限制。

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

【问题讨论】:

  • Go 直接进行系统调用;它不通过 libc。
  • @JimB 你是说trickle 依赖于使用libc 的包装程序吗?
  • 是的。它可以工作的唯一方法(以及它不能在静态可执行文件上工作的原因)是它使用预加载对象(通过 LD_PRELOAD)用它自己的替换标准 libc 套接字调用。
  • 谢谢!我很遗憾这不起作用,但我很欣赏快速响应。如果您想让您的 cmets 成为完整的答案,我很乐意将其标记为已接受。

标签: linux http go trickle


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-14
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多