IT技术博客大学习 共学习 共进步

进程运行于不同的 CPU 核

生活在別處 2012-11-02 13:14:28 浏览 5,825 次

用 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. Linux如何统计进程的CPU利用率 (阅读 16,041)
  2. Oracle MTS模式下 进程地址与会话信息 (阅读 14,187)
  3. Linux内存点滴 用户进程内存空间 (阅读 12,946)
  4. 解剖CPU (阅读 9,044)
  5. 深入理解Nginx之调试优化技巧 (阅读 8,103)
  6. 查看 CPU, Memory, I/O and NetFlow (阅读 7,903)
  7. Linux上进程的表示以及入门 (阅读 7,642)
  8. Linux下进程绑定多CPU运行 (阅读 7,102)
  9. 如何查看Linux 硬件配置信息 (阅读 7,104)
  10. 分析进程内存分配情况,解决程序性能问题 (阅读 6,683)