👻

マルチスレッド時のCPUについて

2022/08/14に公開

マルチスレッドプログラムでCPUはいくつ使えるの?

普段、Linux 上で ps コマンドなどを見ていると、よく1プロセスがCPU100%、つまり、1プロセスが同時に使えるCPUコアは1とみえがちだが実際には異なる。プロセスの中ではスレッドが動いており、このスレッドが複数ある処理をマルチスレッドと呼ぶ。具体的には、この各スレッドに対してCPU時間が割り当てられるのでマルチスレッドプログラムではそのプロセス単体のみでCPUを複数コア使う場合はある。(MySQLが良い例)

テストプログラム
class work extends Thread {
	int n=0;
	public void run() {
		while(1==1) {
			n++;
		}
	}
}
public class cputest {
	public static void main(String[] arg) {
		work[] w=new work[10];

		for ( int i=0;i<w.length;i++) {
			w[i]=new work();
			w[i].start();
		}
		for(int i=0;i<w.length;i++) {
			try {
				w[i].join();
			}catch(InterruptedException e) {
				System.out.println(e);
			}
		}
	}
}

このテストプログラム稼働時の ps コマンド結果。
2コアの環境で試験したが単一プロセスでも CPU 183 %。

# ps aux | grep -e cputest -e PID | grep -v grep
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     31519  193  2.2 3163716 40716 pts/1   Sl+  00:11   6:18 java cputest

スレッドごとの CPU 使用率も見ておくと、総計で100%超えてますね。
複数スレッドでサーバに搭載されているCPUコアを利用できる分使う。

# ps auxww -L | grep -e cputest -e PID | grep -v grep
USER       PID   LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     31519 31519  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31520  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31521  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31522  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31523  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31524  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31525  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31526  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31527  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31528  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31529  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31530  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31531  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31532  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31533  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31534  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31535  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:11   0:00 java cputest
root     31519 31536 19.3   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:45 java cputest
root     31519 31537 19.4   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:45 java cputest
root     31519 31538 19.3   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:45 java cputest
root     31519 31539 19.2   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:44 java cputest
root     31519 31540 19.2   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:44 java cputest
root     31519 31541 19.2   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:44 java cputest
root     31519 31542 19.3   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:45 java cputest
root     31519 31543 19.3   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:45 java cputest
root     31519 31544 19.3   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:45 java cputest
root     31519 31545 19.3   28  2.2 3163716 40716 pts/1   Rl+  00:11   0:45 java cputest
root     31519 32002  0.0   28  2.2 3163716 40716 pts/1   Sl+  00:12   0:00 java cputest

Discussion