美文网首页
绑大核(基于google源码分析)

绑大核(基于google源码分析)

作者: 赛非斯 | 来源:发表于2022-02-28 17:10 被阅读0次
  • 多线程,多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实时调度策略,时间片轮转

  • 也有缺点
    其他没绑核的进程,又负载高的 应用容易崩溃

相关文章

网友评论

      本文标题:绑大核(基于google源码分析)

      本文链接:https://www.haomeiwen.com/subject/juilrrtx.html