-
多线程,多CPU,线程有优先级高的,cpu也有频率高的。绑定大核就是让优先级高的线程、进程优先运行在频率高的几个cpu上
linux也提供了对应的接口:通过sched_setaffinity 设置 CPU 亲和力的掩码,从而将该线程或者进程和指定的CPU绑定
CPU_ZERO() 清空一个集合
CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉. -
sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中 -
我们知道应用做dex2oat的过程占用全部cpu的线程
看看google 源码里绑定大核的过程
art\dex2oat\dex2oat.cc
// Set CPU affinity from a string containing a comma-separated list of numeric CPU identifiers.
static void SetCpuAffinity(const std::vector<int32_t>& cpu_list) {
#ifdef __linux__
int cpu_count = sysconf(_SC_NPROCESSORS_CONF);
cpu_set_t target_cpu_set;
CPU_ZERO(&target_cpu_set);
for (int32_t cpu : cpu_list) {
if (cpu >= 0 && cpu < cpu_count) {
CPU_SET(cpu, &target_cpu_set);
} else {
// Argument error is considered fatal, suggests misconfigured system properties.
Usage("Invalid cpu \"d\" specified in --cpu-set argument (nprocessors = %d)",
cpu, cpu_count);
}
}
if (sched_setaffinity(getpid(), sizeof(target_cpu_set), &target_cpu_set) == -1) {
// Failure to set affinity may be outside control of requestor, log warning rather than
// treating as fatal.
PLOG(WARNING) << "Failed to set CPU affinity.";
}
#else
LOG(WARNING) << "--cpu-set not supported on this platform.";
#endif // __linux__
}
- 总结下来几步
1、cpu_set_t target_cpu_set;
2、CPU_ZERO(&target_cpu_set); 清空一个集合
3、CPU_SET(cpu, &target_cpu_set); //1 2 3 .. 设置集合
4、sched_setaffinity(getpid(), sizeof(target_cpu_set), &target_cpu_set) ;设置亲和力
linux内核的三种调度方法:
1,SCHED_OTHER 分时调度策略,
2,SCHED_FIFO实时调度策略,先到先服务
3,SCHED_RR实时调度策略,时间片轮转
- 也有缺点
其他没绑核的进程,又负载高的 应用容易崩溃
网友评论