netback于kthread遇到cpu affinity问题

最近的升级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上执行。

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

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

时间: 2025-01-17 16:12:58

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

netback中kthread遇到的cpu affinity问题

最近在升级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上呢,l

CPU affinity 亲和力

具体博客见链接 这篇博客内容如下: 1. 逻辑CPU个数和物理CPU个数的关系.逻辑CPU个数=物理CPU* CPU cores *2    (其中,CPU cores 表示每个物理CPU上有几个核,比如四核CPU:2 表示是否使用超线程(Hyper thread) 2. 如何通过命令行查找逻辑CPU和物理CPU. 3. 什么是CPU affinity:一种调度属性(scheduler property), 它可以将一个进程"绑定" 到一个或一组CPU上. 4. taskset 命令用

c语言设置cpu affinity (设置程序需要使用的cpu内核) cpu mask

最近打算写个小程序, 需要控制使用的是哪个 cpu 内核,所以做了一些调查, 整理一下分享给大家. ps: 因为毕业季很久没有写博客了, 以后继续. 顺便鄙视一下那些转载不声明出处的, by watkins.song pps: 最近有了个新的id, 因为在Oracle, wei.x.song, 不知到以后用哪个id比较酷一点 主要参考: http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html/ http://stac

android cpu affinity

暂时无法获取当前线程运行在哪个CPU上,待调查... int omask = 0; int nmask = 0xF0; static void affinity() { int err; int syscallres = syscall(__NR_sched_getaffinity, gettid(), sizeof(omask), &omask); if (syscallres) { err = errno; LOGE("Error in the syscall getaffinity

Linux中CPU亲和性(affinity)

0.准备知识 超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片, 让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率. 我们常听到的双核四线程/四核八线程指的就是支持超线程技术的CPU. 物理CPU:机器上安装的实际CPU, 比如说你的主板上安装了一个8核CPU,那么物理CPU个数就是1个,所以物理CPU个数就是主板上安装的CPU个数. 逻辑CPU:一般情况,我

linux top cset schedtool 对于多核CPU,如何限制进程在一个CPU上运行

对于多核CPU,如何限制进程在一个CPU上运行呢? 如何察看某个进程在哪个CPU上运行: 在控制台中输入: #top -d 1 之后按下f.进入top Current Fields设置页面: 选中:j: P          = Last used cpu (SMP) 则多了一项:P 显示此进程使用哪个CPU. 经过试验发现:同一个进程,在不同时刻,会使用不同CPU Core.这应该是Linux Kernel SMP处理的. 本程序通过这个方法查看,将会在多个CPU上运行. 想要让它在一个CPU

关于CPU亲和性的测试

今天看到运维的同事在配置nginx的CPU亲和性时候,运维同事说他在所有的机器上都是按照8核的方式来配置worker进程的CPU亲和性的. 但我觉得就是有点不太对劲,就查了一下nginx的处理worker_cpu_affinity的源代码,发现nginx并不会在发现配置错误的时候拒绝启动worker进程,而是仅仅打印一条错误日志“sched_setaffinity() failed”. 如果设置亲和性失败则按照SMP负载策略进行处理,linux的SMP负载均衡是基于进程数的,每个cpu都有一个可

分布式通讯优化篇 – IRQ affinity

在一次C500K性能压测过程中,发现一个问题:8 processor的CPU,负载基本集中在CPU0,并且负载达到70以上,并通过mpstat发现CPU0每秒总中断(%irq+%soft)次数比较高. 基于对此问题的研究,解决和思考,便有了这篇文章,希望大家能够喜欢,也欢迎大家留言讨论. 在正文开始之前,我们先来看两个跟性能相关的基本概念:中断与上线文切换(在实际场景中,发现90%以上的同学无法解释清楚,希望这篇文章能给你带去比较深刻的理解). 中断         Hardware inter

CPU负载观察及调优方法

红帽6实现无滴答 tick less interrupt-driven 由软中断进行驱动 在SMP多CPU架构中,传统上多CPU对于内存的访问是总线方式.是总线就会存在资源争用和一致性问题,而且如果不断的增加CPU数量,总线的争用会愈演愈烈,这就体现在4核CPU的跑分性能达不到2核CPU的2倍,甚至1.5倍!理论上来说这种方式实现12core以上的CPU已经没有太大的意义.Intel的NUMA解决方案,放弃总线的访问方式,将CPU划分到多个Node中,每个node有自己独立的内存空间.各个nod