首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别linux系统调用unshare(CLONE_NEWNET)中的性能瓶颈

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

Stack Overflow用户
提问于 2015-03-02 20:00:09
回答 1查看 1.3K关注 0票数 3

我有一个linux应用程序(用C编写),它不断地创建和删除网络命名空间。通常,创建/删除周期大约需要300。

在性能调查期间,我对程序进行了测试,以找出哪个系统调用占用的时间最多。从strace输出来看,对于unshare的第一次调用在我的系统上只需要4ms,而后续调用则需要近200 4ms。

代码语言:javascript
复制
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 3ms。

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-03 19:30:26

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

请参阅下列条款

  1. http://lwn.net/Articles/365835/
  2. http://lwn.net/Articles/366796/

ftrace (http://lwn.net/Articles/410200/)为快速调试提供了一个方便的前端。然而,对于细粒度的调试,本机ftrace接口更好,也相当容易。

什么对我有用--

  1. 测试代码,以便仅在感兴趣的区域启用/禁用跟踪点。这基本上包括编写"1“(启用)或"0”(禁用)到调试-fs下的“跟踪-on”文件。
  2. 将应用程序pid插入到调试-fs下的"set_ftrace_pid“文件。
  3. 在set_trace_filter中添加一个或多个系统调用。可用的符号出现在调试-fs下的文件available_filter_function中。
  4. 使用您最喜欢的跟踪器来文件current_tracer。我用的是function_graph。

注意,步骤1和步骤2不是强制性的,但它有助于过滤来自out的大量噪声,并获取与您正在调查的内容相关的数据。

总之,ftrace规则!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28818452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档