我正在尝试运行 nuttcp
在 Docker 容器中测量其 UDP 吞吐量。但是,每当我启动客户端实例时,服务器实例就会崩溃并显示以下错误消息:Segmentation fault (core dumped)
.
我找到了this bug report对于 Debian,它说 nuttcp
崩溃,因为文件 /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
),但由于我安装了 nuttcp
与 apt-get
我不知道如何应用该补丁。有谁知道如何解决这个问题?
最佳答案
Docker 容器在自己的 network namespace 中运行.在命名空间内,您无法访问所有 TCP 系统参数;有一个similar issue在 Docker bugtracker 中,其中指出“[t]hose 没有丢失容器中的文件。这与安全性和内核版本有关。”就是这样,不幸的是,没有办法解决这个问题。
我能想到的一种解决方案是在主机的网络命名空间中启动容器,使用 --net=host
启动时的标志。但是,如果您的明确目标是测量 Docker 网络堆栈的网络吞吐量,那么这可能不是您的选择。
或者,您可以按照 this tutorial 自己修补 nuttcp。关于如何将自定义补丁应用到 Debian 软件包。这基本上归结为以下几点:
apt-get source <package>
安装源包apt-get build-dep <package>
安装构建依赖项dpatch
将补丁应用于源代码debuild -b -uc -us
构建修改后的包dpkg -i <package>.deb
安装修改后的包关于ubuntu - 无法在 Docker 中运行 nuttcp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36681628/