我有一个linux应用程序(用C编写),它不断地创建和删除网络命名空间。通常,创建/删除周期大约需要300。
在性能调查期间,我对程序进行了测试,以找出哪个系统调用占用的时间最多。从strace输出来看,对于unshare的第一次调用在我的系统上只需要4ms,而后续调用则需要近200 4ms。
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。
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。
发布于 2015-03-03 19:30:26
Linux对于调试/分析系统调用非常有用。
请参阅下列条款
ftrace (http://lwn.net/Articles/410200/)为快速调试提供了一个方便的前端。然而,对于细粒度的调试,本机ftrace接口更好,也相当容易。
什么对我有用--
注意,步骤1和步骤2不是强制性的,但它有助于过滤来自out的大量噪声,并获取与您正在调查的内容相关的数据。
总之,ftrace规则!
https://stackoverflow.com/questions/28818452
复制相似问题