如何识别linux系统调用取消共享(CLONE_NEWNET)中的性能瓶颈

如何识别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

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

在性能调查期间,我对程序运行了strace,以找出哪个系统调用占用的时间最多。从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>
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接口更好而且相当容易

    对我有用的东西--

  • 插入代码以仅在感兴趣的区域启用/禁用跟踪点。这主要涉及将“1”(启用)或“0”(禁用)写入调试fs下的文件“跟踪on”
  • 将应用程序pid插入调试fs下的文件“set_ftrace_pid”
  • 在set_trace_筛选器中添加一个或多个系统调用。可用符号出现在调试fs下的文件可用过滤器函数中
  • 使用您喜爱的跟踪器来归档当前的\u跟踪器。我用了函数图
  • 请注意,第1步和第2步不是强制性的,但它有助于从外部过滤大量噪音,并获得与您正在调查的内容相关的数据


    总之,比赛规则

    要评测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体验作为你问题的答案。