最近的升级netback, 在测试过程中,查找vm全双工压力,rx的pps波动很厉害,见rx kthread尽管cpu affinity它是0-7 (dom0 8vcpu), 但往往,她去了物理破坏cpu在。

rx kthread的cpu绑定到其它cpu上,rx pps上去了,而且稳定了,显然rx 的pps波动就是由于cpu scheduling,被调度到不同的cpu导致。

有个疑问,为什么cpu scheduling的时候,会把rx kthread调度到si%最高的cpu上呢,load balance的机制没有发挥作用嘛?

先来看下代码。rx kthread的实现是一个wait_event, 等包从网卡上收过来调用vif 的start_xmit。触发wake_up。

也就是说包从网卡上来,并在那个cpu上触发软中断,然后wake_up 我们这个rx kthread起来干活。

那么是说rx kthread 跟wake_up的那个cpu有关?

xiantao大牛,发我看了下他们非常早就发现的一个kvm上vm thread调度的问题,https://lkml.org/lkml/2010/4/11/108。 本质上应该是同一个问题。

简单跟踪了下代码,try_to_wake_up的时候会调用sched_fair.c的select_task_rq_fair来挑选一个cpu,作为woken task的执行cpu。假设sched_feature.h里面定义了

AFFINE_WAKEUPS 那么want_affine=1,之后就出现一个affine_sd, 表示有亲缘性的scheduling_domain, 然后调用wake_affine,里面会对上一次执行的cpu和当前wake_up

的cpu。进行一些load相关的比較,来选择是基于prev_cpu还是wake_up cpu来选择一个idle sibling (select_idle_sibling)

在我们的场景下。want_affine=1, wake_affine=1, select_idle_sibling(wake_up cpu)。而且wake_up cpu也是idle。尽管软中断非常高,可是没有其它的线程调度。一直都在idle上下文触发软中断。

上述条件满足下,try_to_wake_up得到的新cpu就是wake_up cpu。 极少情况下, wake_affine=0, 新的cpu就还是prev_cpu,等于没有migration。

做过一个实验,把sched_features.h 里面的AFFINE_WAKEUPS  =0, 那么want_affine =0 。就不会走到上面的逻辑。最后基本上就没有migration,一直在prev_cpu上执行。

没有了之前波动,性能提升。

版权声明:本文博主原创文章,博客,未经同意不得转载。

netback于kthread遇到cpu affinity问题的更多相关文章

  1. CPU affinity 进程和线程的亲缘性

    设置Processor Affinity 作用: 1.进程和线程的亲缘性(affinity),使进程或线程在指定的CPU(核)上运行.(比如程序A,在第4个核心上运行) 2.设置进程 或者 线程, 使 ...

  2. Linux CPU affinity

    在Linux中,我们知道可以通过nice.renice命令改变进程的执行优先级,优先级高的进程优先执行,从而一定程度上保证重要任务的运行. 除了nice.renice外,可以通过CPU  affini ...

  3. cpu affinity (亲和性)

    来源:http://www.ibm.com/developerworks/cn/linux/l-affinity.html#download 管理处理器的亲和性(affinity) 为什么(3 个原因 ...

  4. CPU Affinity

    Reference: [1] http://www.linuxjournal.com/article/6799 Soft vs. Hard CPU Affinity There are two typ ...

  5. android cpu affinity

    暂时无法获取当前线程运行在哪个CPU上,待调查... int omask = 0; int nmask = 0xF0; static void affinity() { int err; int sy ...

  6. linux进程、线程与cpu的亲和性(affinity)

    参考:http://www.cnblogs.com/wenqiang/p/6049978.html 最近的工作中对性能的要求比较高,下面简单做一下总结: 一.什么是cpu亲和性(affinity) C ...

  7. Linux中CPU亲和性(affinity)

    0.准备知识 超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片, 让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和 ...

  8. 【操作系统之十二】分支预测、CPU亲和性(affinity)

    一.分支预测 当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕 ...

  9. CPU绑定操作

    使用virsh vcpuinfp命令查看虚拟机VCPU和物理CPU的对应关系 [root@svn ~]# virsh vcpuinfo 16 VCPU: 0 CPU: 3 状态: running CP ...

随机推荐

  1. HDU 1661 Assigments 贪心法题解

    Problem Description In a factory, there are N workers to finish two types of tasks (A and B). Each t ...

  2. windows phone (14) 简单了解Ellipse元素和Rectangle元素

    原文:windows phone (14) 简单了解Ellipse元素和Rectangle元素  System.Windows.Shapes命名空间中包含了显示矢量图形的元素分别为ellipse和re ...

  3. C#属性总结

    1.私有字段和公有字段的比较 类中的私有字段只能在类的内部访问,而对类的公有字段的访问却不受限制. 在以前,为了封装,程序中会尽量少使用公有字段,因为使用公有字段的话,会让程序失去控制权.所以程序中会 ...

  4. android选择和裁剪图像拍摄的图像

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39994913 近期从曾经的项目中扒下来一个经常使用的模块.在这里有必要记录一下的. ...

  5. poj 3399 Product(数学)

    主题链接:http://poj.org/problem?id=3399 Product Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  6. 线段树(单点更新and成段更新)

    线段树需要的空间. 区间为1-->n 假设是一棵完全二叉树,且树高为i. 完全二叉树性质:第i层最多有2^(i-1)个结点. 那么 2^(i-1) = n;     i = log2(n)  + ...

  7. 重新想象 Windows 8 Store Apps (8) - 控件之 WebView

    原文:重新想象 Windows 8 Store Apps (8) - 控件之 WebView [源码下载] 重新想象 Windows 8 Store Apps (8) - 控件之 WebView 作者 ...

  8. 【HDU】5256 系列转换(上涨时间最长的序列修饰)

    假设a[i]和a[j]我想的一样,满足条件的需要是 a[j] - a[i] > j - i 也就是说,a[i] - i < a[j] - j 例1 4 2 不满意,所以1和2必须有必要之间 ...

  9. 使用Intel HAXM 加速你的Android模拟器

    Android 模拟器一直以运行速度慢著称, 本文介绍使用 Intel HAXM 技术为 Android 模拟器加速, 使模拟器运行度媲美真机, 彻底解决模拟器运行慢的问题. Intel HAXM ( ...

  10. java多线程Future和Callable类的解释与使用

    一,描写叙述 ​在多线程下编程的时候.大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取每一个线程中返回的数据然后再做统一处理,在这种需求下,Future与Callable的组合就派 ...