42
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

1分で実現できる有用な技術Advent Calendar 2014

Day 5

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

Posted at

この記事は「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

42
39
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?