php-affinity:修改php进程cpu亲和性

PHP Jenner 8619℃ 0评论

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

  • 频繁的并行运算
  • 线程可伸缩性测试(通过增加cpu核心数量模拟线性扩展)
  • 运行时间敏感的,决定性的进程

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

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

  • 调用系统命令,修改当前进程cpu亲和性
  • 编写php扩展,封装系统调用。

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

提供了如下三个函数:

  1. setaffinity – 设置cpu亲和性
  2. getaffinity – 获取cpu亲和性
  3. getcpucores – 获取cpu核心数量

API如下:

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

    return true;
}

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


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

参考文献:

  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
  3. http://www.cnblogs.com/LubinLew/p/cpu_affinity.html

原创文章,转载请注明: 转载自始终不够

本文链接地址: php-affinity:修改php进程cpu亲和性

转载请注明:始终不够 » php-affinity:修改php进程cpu亲和性

喜欢 (4)