如何识别linux系统调用取消共享(CLONE_NEWNET)中的性能瓶颈
我有一个linux应用程序(用C编写),它不断地创建和删除网络名称空间。通常,创建/删除周期大约需要300毫秒 在性能调查期间,我对程序运行了strace,以找出哪个系统调用占用的时间最多。从strace的输出来看,在我的系统上,似乎第一次调用unshare只需要4ms,而随后的调用需要接近200ms如何识别linux系统调用取消共享(CLONE_NEWNET)中的性能瓶颈,c,linux,performance,system-calls,linux-namespaces,C,Linux,Performance,System Calls,Linux Namespaces,我有一个linux应用程序(用C编写),它不断地创建和删除网络名称空间。通常,创建/删除周期大约需要300毫秒 在性能调查期间,我对程序运行了strace,以找出哪个系统调用占用的时间最多。从strace的输出来看,在我的系统上,似乎第一次调用unshare只需要4ms,而随后的调用需要接近200ms strace -p <pid> -T unshare(CLONE_NEWNET) = 0 <0.004150> unshare(CLON
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>
strace-p-T
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
程序的结构使其在周期开始时(内部控制周期)创建网络名称空间,并在周期结束时删除名称空间
为了进行实验,我修改了我的应用程序,在控制周期结束时不删除网络名称空间——只创建新的网络名称空间,但从不删除它们。这大大提高了性能,而且我在对取消共享系统调用的后续调用中没有任何延迟。每次取消共享系统调用需要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>
strace-p-T
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
取消共享(克隆新网络)=0
显然,删除网络名称空间会以某种方式影响/延迟后续网络名称空间的创建
这到底是怎么回事?我如何进一步调试它
我使用的是linux内核3.12.9-301.fc20.x86_64。linux ftrace对于调试/评测系统调用非常有用 请参阅以下文章 ftrace cmd()为快速调试提供了方便的前端。然而,对于细粒度调试,本机ftrace接口更好而且相当容易 对我有用的东西--
总之,比赛规则 要评测linux内核内部工作,您可以尝试
perf
sampling profiler(debian/ubuntu中linux工具
包的一部分;内核部分在大多数linux发行版中都是启用的。只需perf-record./your_-test
或perf-record-g./your_-test
(从根目录)将看到内核的函数。您可能还对ftrace跟踪感兴趣,以查看精确的时间。ftrace包装器简介:(幻灯片73,76-由Gregg制作)或trace cmd
()感谢您的参考!!!它帮助了很多。我使用“ftrace”获取内核调试跟踪(为SyS\u setns和SyS\u unshare函数添加了过滤器)。这表明问题是由于自旋锁(可能是net_互斥锁)导致的延迟。好奇的灵魂,我想你可以添加你的ftrace/trace cmd体验作为你问题的答案。