如何识别linux系统中的性能瓶颈调用unshare(CLONE_NEWNET)

时间:2015-03-02 20:00:10

标签: c linux performance system-calls linux-namespaces

我有一个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。

1 个答案:

答案 0 :(得分:1)

Linux ftrace对于调试/分析系统调用非常有用。

参考以下文章

  1. http://lwn.net/Articles/365835/
  2. http://lwn.net/Articles/366796/
  3. ftrace-cmd(http://lwn.net/Articles/410200/)为快速调试提供了方便的前端。但是,对于细粒度调试,本机ftrace接口更好,更容易。

    什么对我有用 -

    1. 检测代码以仅在感兴趣的区域中启用/禁用跟踪点。这主要涉及写作&#34; 1&#34; (启用)或&#34; 0&#34; (禁用)提交&#34;追踪&#34;在debug-fs下。
    2. 将应用程序pid插入文件&#34; set_ftrace_pid&#34;在debug-fs下。
    3. 在set_trace_filter中添加一个或多个系统调用。可用符号出现在debug-fs下的available_filter_function文件中。
    4. 使用您最喜欢的跟踪器来提交current_tracer。我使用了function_graph。
    5. 请注意,步骤1和2不是强制性的,但它有助于从外部过滤大量噪音,并获取与您正在调查的内容相关的数据。

      总之,ftrace规则!!!