IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

进程运行于不同的 CPU 核

生活在別處 2012-11-02 13:14:28 累计浏览 5,957 次
本机暂存

用 Gearman 搭建 Map/Reduce ,GearmanManager 来管理所有的 workers。启动多个 gearman-manager daemon,为了充分利用服务器资源,使其运行于不同的 CPU 内核上。

假设启动 10 个gearman-manager daemon,CPU 是 4核。

[root@www ~]# ps aux | grep gearman-manager | awk {'print $2;'} | sort -k1,1 | head -3 | xargs -n 1 taskset -cp 0
[root@www ~]# ps aux | grep gearman-manager | awk {'print $2;'} | sort -k1,1 | tail -3 | xargs -n 1 taskset -cp 1
[root@www ~]# ps aux | grep gearman-manager | awk {'print $2;'} | sort -k1,1 | sed -n '4,7p' | xargs -n 1 taskset -cp 2

上面命令是将前 3 个 deamon 运行于 CPU#0 (CPU 第一个核 上,从 0 开始计数),中间 4个运行于 CPU#2,最后三个运行于 CPU#1。

Backgrounds: 榨干服务器:让进程运行在指定的CPU


两个名词:
SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多 CPU),各 CPU 之间共享内存子系统以及总线结构。 [MORE...]
CPU affinity:中文唤作「CPU亲和力」,是指在 CMP 架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。[MORE...]


  1. 在Linux上修改进程的「CPU亲和力」
    在Linux上,可以通过 taskset 命令进行修改。以 CentOS 为 例,taskset 在 util-linux-2.13-pre7 包中。下载源代码,编译安装即可。
    对运行中的进程,可用如下命令将 CPU #1, #2, #3 分配给 PID 为 12345 的进程:


    [root@www ~]# taskset -cp 1,2,3 12345

    对于已经在运行中 MySQL 的服务,用上面命令修改其运行于哪颗 CPU 内核上是无效的。而是需要在启动时指定:

    [root@www ~]# taskset -c 1,2,3 /usr/local/mysql/bin/mysqld_safe &

    其它进程,也可类似处理 (Nginx 除外,见下文)。之后用 top 命令,回车后输入 1 查看所有 CPU 的使用情况:

  2. Nginx 绑定 CPU
    上文说 Nginx 除外,是因为 Nginx 提供了更确切的配置,在其配置文件 conf/nginx.conf 中,有如下一行:


    worker_processes  1;

    这用来配置 Nginx 启动几个工作进程,默认为 1。Nginx 还支持 worker_cpu_affinity 配置项,即 Nginx 可以为 每个工作进程绑定 CPU。例:

    worker_process 3;
    worker_cpu_affinity 0010 0100 1000;

    001001001000是掩码,分别代表第 2,3,4 颗 CPU 核。重启 Nginx,3 个工作进程就可以各自用各自的 CPU 。

  3. 深入

    • 如果自己写代码,要把进程绑定到 CPU,可用 sched_setaffinity 函数,在 Linux上,这会触发一次 系统调用

    • 如果父进程设置了affinity,之后其创建的子进程会继承父进程的affinity属性(其实用 taskset 启动进程就是一次fork+exec)。

  4. @Xitong Linode 默认只在 CPU#0 上工作,多半是由 Xen 的配置决定的。只要内核支持 SMP,默认都是尽可能将负载分摊在多个 CPU 上。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 新浪微博笔试题:找出共有2个以上标签的用户对 (累计阅读 5,997)
  2. Gearman Server 使用 MySQL UDFs 来管理和保持队列 (累计阅读 5,887)
  3. Hadoop的map/reduce作业输入非UTF-8编码数据的处理原理 (累计阅读 5,644)
  4. 利用开源的Gearman框架构建分布式图片处理平台[原创] (累计阅读 5,320)
  5. tcmalloc的内存管理 (累计阅读 5,319)
  6. 用hadoop hive协同scribe log用户行为分析方案 (累计阅读 5,074)
  7. 使用hadoop进行大规模数据的全局排序 (累计阅读 4,603)
  8. 利用Gearman来实现远程监控与管理 (累计阅读 4,282)
  9. Spark:一个高效的分布式计算系统 (累计阅读 4,249)
  10. Gearman分布式远程过程处理框架 (累计阅读 4,125)