我有一个linux应用程序(用C编写),它不断创建和删除网络命名空间。通常,创建/删除周期大约需要300毫秒。
在性能调查期间,我对程序进行了操作,以找出哪个系统调用占用了大部分时间。从strace输出看来,对我的系统来说,首次调用unshare只需要4ms,但后续的调用时间接近200ms。
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-3ms。
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。
答案 0 :(得分:1)
Linux ftrace对于调试/分析系统调用非常有用。
参考以下文章
ftrace-cmd(http://lwn.net/Articles/410200/)为快速调试提供了方便的前端。但是,对于细粒度调试,本机ftrace接口更好,更容易。
什么对我有用 -
请注意,步骤1和2不是强制性的,但它有助于从外部过滤大量噪音,并获取与您正在调查的内容相关的数据。
总之,ftrace规则!!!