php-affinity 通过设置cpu亲和性,可以将进程绑定到一个cpu核心上。一般在如下场景我们可能会希望修改进程的cpu亲和性:

  •  频繁的并行运算

  •  线程可伸缩性测试(通过增加cpu核心数量模拟线性扩展)

  •  运行时间敏感的,决定性的进程

NginxSwoole等开源软件,都提供了设置cpu亲和性的方法。nginx官方建议worker数量等同于cpu核心数量也是为了将一个进程绑定到一个cpu核心上,同时避免进程切换带来的开销。

Php本身并没有提供设置cpu亲和性的函数,我们可以通过两种方式实现:

  •  调用系统命令,修改当前进程cpu亲和性

  •  编写php扩展,封装系统调用。

php-affinity是使用c编写的php扩展,项目地址:https://github.com/huyanping/php-affinity

/**
* set CPU affinity
*
* @param $cpu_id
* @return bool
*/
Functionsetaffinity($cpu_id){
$num= getcpucores();
if($cpu_id>= $num){
    returnfalse;
}
$set= system_call($cpu_id);
if($set=== -1){
    returnfalse;
}

returntrue;
}

/**
* get CPU affinity
*
* @return bool
*/
functiongetaffinity(){
$cpu_id= system_call();
if($cpu_id=== -1){
    returnfalse;
}
return$cpu_id;
}


/**
* get number of CPU
*
* @return bool
*/
functiongetcpucores(){
$nums= system_call();
if($nums=== -1){
    returnfalse;
}
return$nums;
}

提供了如下三个函数:

  1. setaffinity &nDash; 设置cpu亲和性

  2. getaffinity – 获取cpu亲和性

  3. getcpucores – 获取cpu核心数量

API 如下:

参考文献:

  1. https://zh.wikipedia.org/wiki/%E5%A4%84%E7%90%86%E5%99%A8%E4%BA%B2%E5%92%8C%E6%80%A7

  2. http://www.ibm.com/developerworks/cn/linux/l-affinity.html


Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务