问题描述:
刚开始设置的cpu亲和度是0x10 也就是cpu4上。log发现过了200ms cpu亲和度变成了0xFF
知识点:
CPU 亲和度是指操作系统调度程序将特定进程或线程分配给特定 CPU 核心的能力。这种调度策略旨在优化性能和资源利用率,通过将特定任务分配给特定的 CPU 核心,以最大程度地减少 CPU 缓存的切换和通信开销,从而提高系统整体性能。
CPU 亲和度可以以不同的方式实现:
1.硬亲和度(Hard Affinity)
:在硬亲和度调度中,操作系统严格遵循将特定进程或线程绑定到特定 CPU 核心的规则。这意味着操作系统将任务限制在特定的 CPU 上执行,不会在不同的 CPU 之间进行迁移。硬亲和度通常通过特定的系统调用或 API 来实现。
2.软亲和度(Soft Affinity)
:在软亲和度调度中,操作系统给出了一个建议,但并不强制要求将特定任务绑定到特定的 CPU 核心。操作系统可能会尽力将任务调度到建议的 CPU 上执行,但仍然有可能在不同的 CPU 之间进行迁移,特别是在负载均衡或性能优化的情况下。
CPU 亲和度的应用场景包括需要最大化单个任务的性能、减少缓存失效、降低线程通信开销等。然而,过度使用 CPU 亲和度可能会导致系统不平衡,使得某些 CPU 核心负载过重,而其他核心处于空闲状态。因此,在实际应用中需要权衡考虑,并根据特定的需求和系统特征来选择适当的调度策略。
问题分析:
猜测cpu可能中途掉线了被重新分配,对应的log如下process %d (%s) no longer affine to cpu
对应的kernel代码如下
kernel/msm-4.19/kernel/sched/core.c
static int select_fallback_rq(int cpu, struct task_struct *p, bool allow_iso)
{
/*
* Don't tell them about moving exiting tasks or
* kernel threads (both mm NULL), since they never
* leave kernel.
*/
if (p->mm && printk_ratelimit()) {
printk_deferred("process %d (%s) no longer affine to cpu%d\n",
task_pid_nr(p), p->comm, cpu);
}
}
修改策略:
1、修改绑定的cpu策略,不绑定单独的核数 防止掉线
2、修改cpu簇最小在线数量为cpu数量
查看cpu在线数的
adb shell cat /sys/devices/system/cpu/cpu*/online
查看最小
adb shell “cat /sys/devices/system/cpu/cpu*/core_ctl/min_cpus”
查看最大
“/sys/devices/system/cpu/cpu*/core_ctl/max_cpus”
设置cpu在线
echo 0 > sys/devices/system/cpu/cpu4/online
echo 1 > sys/devices/system/cpu/cpu4/online