Linux 多核下绑定进程到不同 CPU(CPU Affinity)

上个星期介绍了在 Linux 多核下如何绑定硬件中断到不同 CPU,其实也可以用类似的做法把进程手动分配到特定的 CPU 上,平时在 Linux 上运行的各种进程都是由 Linux 内核统一分配和管理的,由进程调度算法来决定哪个进程可以开始使用 CPU、哪个进程需要睡眠或等待、哪个进程运行在哪个 CPU 上等。如果你对操作系统的内核和进程调度程序感兴趣的话,不妨看看那本经典的 Operating Systems Design and Implementation(Linus Torvalds 就是看了这本书受到启发写出了 Linux),从简单的 Minix 入手,hack 内核是件很有意思的事情,VPSee 以前修改过 Minix 内核的进程调度,学到了内核方面的很多东西。另外推荐一本课外读物:Just for Fun,Linus Torvalds 写的一本自传。

Linux 给我们提供了方便的工具用来手动分配进程到不同的 CPU 上(CPU Affinity),这样我们可以按照服务器和应用的特性来安排特定的进程到特定的 CPU 上,比如 Oracle 要消耗大量 CPU 和 I/O 资源,如果我们能分配 Oracle 进程到某个或多个 CPU 上并由这些 CPU 专门处理 Oracle 的话会毫无疑问的提高应用程序的响应和性能。还有一些特殊情况是必须绑定应用程序到某个 CPU 上的,比如某个软件的授权是单 CPU 的,如果想运行在多 CPU 机器上的话就必须限制这个软件到某一个 CPU 上。

安装 schedutils

在 CentOS/Fedora 下安装 schedutils:

# yum install schedutils

在 Debian/Ubuntu 下安装 schedutils:

# apt-get install schedutils

如果正在使用 CentOS/Fedora/Debian/Ubuntu 的最新版本的话,schedutils/util-linux 这个软件包可能已经装上了。

计算 CPU Affinity 和计算 SMP IRQ Affinity 差不多:

0x00000001    (CPU0)
0x00000002    (CPU1)
0x00000003    (CPU0+CPU1)
0x00000004    (CPU2)
...

使用 schedutils

如果想设置进程号(PID)为 12212 的进程到 CPU0 上的话:

# taskset 0x00000001 -p 12212

评论 (5 Comments)

  1. http://www.wordpress.gd/
    这个站和你是一家的么?看着好像啊,还都是卖VPS的

  2. 不是,发现抄袭了本站好多文章和风格,传说中的山寨?呵呵,习惯了:D

  3. wordpress gd 我晕 在 C大论坛被 禁言啦 变成乞丐啦 ,怎没又跑到这里来 呼喊啦 ,真让俺想起 一句话 一直在模仿 —-从未被超越 真是悲哀

  4. 0x00000001 (CPU0)
    0x00000002 (CPU1)
    0x00000003 (CPU0+CPU1)
    0x00000004 (CPU2)

    这个怎么查看出来的

  5. 学习了,linus看了Operating Systems Design and Implementation然后写的linux,其实我们中国也有很多有才华的人,关键是大家要联合起来,这样才能共同进步,塑造一种文化。

发表评论