不能 运行 nuttcp 在 Docker 里面

Cannot run nuttcp inside Docker

我正在尝试 运行 nuttcp 在 Docker 容器中测量它的 UDP 吞吐量。但是,每当我启动客户端实例时,服务器实例就会崩溃并显示以下错误消息:Segmentation fault (core dumped).

我发现 Debian 的 this bug reportnuttcp 崩溃是因为文件 /proc/sys/net/ipv4/tcp_adv_win_scale 不存在。我在 nettcp 正在工作的另一台机器上检查了该文件,发现该文件的唯一内容是 1。所以我尝试将此文件添加到我的 Docker 容器中,如下所示:

root@7d4c0f0ffe4f:/proc/sys/net/ipv4$ echo 1 > tcp_adv_win_scale
bash: tcp_adv_win_scale: No such file or directory

所以猜测不可能手动创建这个文件。错误报告还包括一个可以应用于源代码的补丁 (nuttcp-6.1.2.c),但由于我安装了 nuttcpapt-get,所以我不知道如何应用该补丁。

有人知道如何解决这个问题吗?

Docker 容器 运行 在它们自己的 network namespace. Inside a namespace, you do not have access to all TCP system parameters; there's a similar issue 中 Docker bugtracker,其中指出 "[t] 软管不是'容器中缺少文件。这与安全性和内核版本有关。" 就是这样,不幸的是,没有办法解决这个问题。

我能想到的一个解决方案是在主机的网络名称空间内启动容器,在启动时使用 --net=host 标志。但是,如果您的明确目标是测量 Docker 网络堆栈的网络吞吐量,那可能不适合您。

或者,您可以按照 this tutorial 如何将自定义补丁应用到 Debian 软件包来自行修补 nuttcp。这基本上可以归结为以下几点:

  1. 安装源码包apt-get source <package>
  2. 使用 apt-get build-dep <package>
  3. 安装构建依赖项
  4. 使用 dpatch
  5. 将补丁应用于源代码
  6. 使用 debuild -b -uc -us
  7. 构建修改后的包
  8. 并使用 dpkg -i <package>.deb
  9. 安装修改后的包