Help us understand the problem. What is going on with this article?

Linuxでプロセスが利用可能なcpu数を数える

More than 5 years have passed since last update.

この記事は「1分で実現できる有用な技術 Advent Calendar 2014」の5日目の記事です。

Linuxカーネルが認識している論理cpu数を数えるのは↓みたいな感じでも良いのですがプロセスが利用できる数とは違うので多少注意が必要です。これはプロセスに対してリソースの制限がかけられている場合があるからですね。

grep processor /proc/cpuinfo | wc -l

ということで、そんな時にnproc(1)です。このコマンドなら現在のプロセスで使えるcpu数を知ることができます。

では実際に動かして見てみます。 下のコードはまず何もリソース制限がない状態でnprocコマンドを実行。その後に利用可能なcpuを設定してnprocを実行しています。ここではfork前にリソース制限をしてそれが子プロセスに引き継がれています。

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void do_nproc(void)
{
    printf("execute nproc command\n");
    system("nproc");
}

void set_affinity(void)
{
    cpu_set_t set;
    CPU_ZERO(&set);
    CPU_SET(0, &set);
    CPU_SET(2, &set);

    sched_setaffinity(0, sizeof(set), &set);
}

int main(int argc, char **argv)
{
    pid_t pid;

    do_nproc();

    set_affinity();

    pid = fork();
    if (!pid) { // child
        cpu_set_t child_set;
        CPU_ZERO(&child_set);

        do_nproc();
        printf("sched_getaffinity\n");
        sched_getaffinity(0, sizeof(child_set), &child_set);
        printf("number of cpus: %d\n", CPU_COUNT(&child_set));

        _exit(0);
    } else if (pid > 0) {
        waitpid(pid, NULL, 0);
    } else {
        perror("fork");
    }

    return 0;
}

実行結果はこうなります。最初は8個のcpuが見えるけど、sched_setaffinity()でcpu数を制限したあとは2個しか見えなくなります。sched_getaffinity()はおまけです。

masami@saga:~$ ./a.out
execute nproc command
8
execute nproc command
2
sched_getaffinity
number of cpus: 2

nprocコマンドの実装については φ(..)メモメモ ncproc(1)はどうやってcpu数を数えているのかで解説したので興味のある方はこちらもどうぞm(__)m

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away