- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 linux 应用程序(用 C 编写),它不断地创建和删除网络 namespace 。通常一个创建/删除周期大约需要 300 毫秒。
在性能调查期间,我对程序运行了 strace 以找出哪个系统调用花费的时间最多。从 strace 输出来看,似乎第一次调用 unshare 在我的系统上只需要 4 毫秒,但后续调用需要接近 200 毫秒。
strace -p <pid> -T
unshare(CLONE_NEWNET) = 0 <0.004150>
unshare(CLONE_NEWNET) = 0 <0.192055>
unshare(CLONE_NEWNET) = 0 <0.192872>
unshare(CLONE_NEWNET) = 0 <0.190303>
unshare(CLONE_NEWNET) = 0 <0.193062>
程序的结构使得在一个循环(内部控制循环)开始时,它创建一个网络命名空间并在循环结束时删除该命名空间。
为了实验,我修改了我的应用程序,使其在控制周期结束时不删除网络命名空间——只创建新的网络命名空间,但从不删除它们。这显着提高了性能,并且我在后续调用取消共享系统调用时没有任何延迟。每次取消共享系统调用需要 2-3 毫秒。
strace -p <pid> -T
unshare(CLONE_NEWNET) = 0 <0.003102>
unshare(CLONE_NEWNET) = 0 <0.002980>
unshare(CLONE_NEWNET) = 0 <0.003070>
unshare(CLONE_NEWNET) = 0 <0.003124>
unshare(CLONE_NEWNET) = 0 <0.002952>
显然,删除网络命名空间会以某种方式影响/延迟后续网络命名空间的创建。
这里可能发生了什么?我该如何进一步调试?
我使用的是 linux 内核 3.12.9-301.fc20.x86_64。
最佳答案
Linux ftrace 对于调试/分析系统调用非常有用。
引用以下文章
ftrace-cmd ( http://lwn.net/Articles/410200/ ) 为快速调试提供了一个方便的前端。然而,对于细粒度调试,原生 ftrace 接口(interface)更好,也相当简单。
什么对我有用——
请注意,第 1 步和第 2 步不是强制性的,但它有助于从外部过滤大量噪音并获取与您正在调查的内容相关的数据。
总而言之,ftrace 规则!!!
关于c - 如何识别 linux 系统调用 unshare(CLONE_NEWNET) 中的性能瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28818452/
我在 Windows(XP 32 位)上使用 TortoiseHG 1.1.1 附带的 Mercurial 1.6.4 中的 Mercurial 共享扩展。 更多信息请访问: https://www.
我想使用 PID、UTS、IPC 和 NET 的隔离命名空间启动一个进程。但是,在进程内部,要正确设置网络,必须在主机上使用 veth 适配器配置网络命名空间(以便它们出现在隔离进程中)。所以,我使用
我正在学习 Linux 核心,现在正在讨论命名空间主题。我尝试使用“unshare”命令只是为了掌握命名空间及其要点。问题是它没有,或者更有可能的是,我做错了什么。如果您能帮助我理解,我将不胜感激。我
这是我做的: $ sudo unshare -m --propagation unchanged sh # Run a shell with `unshare` in a separate mo
unshare() 和copy() 都是用来复制一个数组,但我看不出有什么区别。 最佳答案 取消分享 正如它在 Apple documentation 上所说的那样unshare 是为了确保数组的副本
这是我相当简单的代码: #define _GNU_SOURCE #include #include #include int main(){ int res= unshare(C
在我的第一个 Swift 项目中,我尝试复制一个数组及其对海关对象的引用。经过多次研究,我意识到最好的方法是使用 copy() 或 unshare()。但就我而言,这种方法不存在! 例如,我声明变量数
调用 fork 然后调用 unshare 会更容易,因为许多参数是通过 fork 复制的,否则将手动包装到 克隆。我的问题是,(1) 调用 clone 在单独的命名空间中 fork 一个新进程和 (2
这个命令序列有效: unshare --fork --pid --mount umount /proc mount -t proc proc /proc umount /dev/pts mount -
使用 unshare 创建持久命名空间你使用语法: touch /root/mynetns1 unshare --net==/root/mynetns1 使用 ip 创建持久命名空间你使用语法: ip
我有一个 linux 应用程序(用 C 编写),它不断地创建和删除网络 namespace 。通常一个创建/删除周期大约需要 300 毫秒。 在性能调查期间,我对程序运行了 strace 以找出哪个系
我正在试验 linux 命名空间。特别是 pid 命名空间。 我想我会用 bash 测试一些东西,但遇到了这个问题: unshare -p /bin/bash bash: fork: Cannot a
这个问题在这里已经有了答案: unshare --pid /bin/bash - fork cannot allocate memory (2 个答案) 关闭 4 年前。 我正在使用 Arch Li
我正在经历一个 article只需使用 linux 系统调用(如 chroot、unshare、nsenter 等)即可在不使用 docker 的情况下从头构建容器。 docker 是否在内部对这些系
我是一名优秀的程序员,十分优秀!