• linux:如何指定进程运行的CPU


    coolshell最新的文章《性能调优攻略》在“多核CPU调优”章节,提到“我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起。”。在文章中提到了Linux下的一个工具,taskset,可以设定单个进程运行的CPU。

    同时,因为最近在看redis的相关资料,redis作为单进程模型的程序,为了充分利用多核CPU,常常在一台server上会启动多个实例。而为了减少切换的开销,有必要为每个实例指定其所运行的CPU。

     

    下文,将会介绍taskset命令,以及sched_setaffinity系统调用,两者均可以指定进程运行的CPU实例。

    1.taskset

    taskset是LINUX提供的一个命令(ubuntu系统可能需要自行安装,schedutils package)。他可以让某个程序运行在某个(或)某些CPU上。

    以下均以redis-server举例。

    1)显示进程运行的CPU

    命令taskset -p 21184

    显示结果:

    pid 21184's current affinity mask: ffffff

    注:21184是redis-server运行的pid

          显示结果的ffffff实际上是二进制24个低位均为1的bitmask,每一个1对应于1个CPU,表示该进程在24个CPU上运行

    2)指定进程运行在某个特定的CPU上

    命令taskset -pc 3 21184

    显示结果:

    pid 21184's current affinity list: 0-23
    pid 21184's new affinity list: 3

    注:3表示CPU将只会运行在第4个CPU上(从0开始计数)。

    3)进程启动时指定CPU

    命令taskset -c 1 ./redis-server ../redis.conf

     

    结合这上边三个例子,再看下taskset的manual,就比较清楚了。

    OPTIONS
    -p, --pid
    operate on an existing PID and not launch a new task

    -c, --cpu-list
    specify a numerical list of processors instead of a bitmask. The list may contain multiple items, separated by comma, and ranges. For example, 0,5,7,9-11.

     

    2.sched_setaffinity系统调用

    问题描述

    sched_setaffinity可以将某个进程绑定到一个特定的CPU。你比操作系统更了解自己的程序,为了避免调度器愚蠢的调度你的程序,或是为了在多线程程序中避免缓存失效造成的开销,你可能会希望这样做。如下是sched_setaffinity的例子:

    /* Short test program to test sched_setaffinity
    * (which sets the affinity of processes to processors).
    * Compile: gcc sched_setaffinity_test.c
    *              -o sched_setaffinity_test -lm
    * Usage: ./sched_setaffinity_test
    *
    * Open a "top"-window at the same time and see all the work
    * being done on CPU 0 first and after a short wait on CPU 1.
    * Repeat with different numbers to make sure, it is not a
    * coincidence.
    */
     
    #include <stdio.h>
    #include <math.h>
    #include <sched.h>
     
    double waste_time(long n)
    {
        double res = 0;
        long i = 0;
        while(i <n * 200000) {
            i++;
            res += sqrt (i);
        }
        return res;
    }
     
    int main(int argc, char **argv)
    {
        unsigned long mask = 1; /* processor 0 */
     
        /* bind process to processor 0 */
        if (sched_setaffinity(0, sizeof(mask), &mask) <0) {
            perror("sched_setaffinity");
        }
     
        /* waste some time so the work is visible with "top" */
        printf ("result: %f
    ", waste_time (2000));
     
        mask = 2; /* process switches to processor 1 now */
        if (sched_setaffinity(0, sizeof(mask), &mask) <0) {
            perror("sched_setaffinity");
        }
     
        /* waste some more time to see the processor switch */
        printf ("result: %f
    ", waste_time (2000));
    }

    根据你CPU的快慢,调整waste_time的参数。然后使用top命令,就可以看到进程在不同CPU之间的切换。(启动top命令后按“1”,可以看到各个CPU的情况)。

     

    父进程和子进程之间会继承对affinity的设置。因此,大胆猜测,taskset实际上是首先执行了sched_setaffinity系统调用,然后fork+exec用户指定的进程。

    from:http://www.cnblogs.com/liuhao/archive/2012/06/21/2558069.html



  • 相关阅读:
    WPF自定义加载控件
    C# 动态调用Webservice
    C#程序执行Python脚本
    C#监控U盘插拔
    WPF—编程宝典P1
    详解S7源码3-COTP and TPKT
    详解S7源码(1)----Types
    详解S7源码2----Conversition
    P18 FlipPanel控件的讲解
    WPF编程宝典P18----ColorPicker 和FlipPanel的讲解
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332291.html
Copyright © 2020-2023  润新知