これは少し混乱しています。 ESXi 5.5では、28台の仮想マシンが実行されており、各仮想マシンに6つのvcpuが割り当てられています。これらは具体的にはロードされず、各Javaプロセス以外の他のプロセスは実行しません。これらのいずれかを実行して個々のCPU出力を表示すると、デフォルトでは次のようになります。
top - 21:00:15 up 6 days, 12:52, 1 user, load average: 0.89, 0.85, 0.82
Tasks: 110 total, 1 running, 108 sleeping, 0 stopped, 1 zombie
Cpu0 : 3.7%us, 0.3%sy, 0.0%ni, 96.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 38.4%us, 3.0%sy, 0.0%ni, 51.9%id, 0.0%wa, 1.3%hi, 5.4%si, 0.0%st
Cpu2 : 2.7%us, 0.3%sy, 0.0%ni, 96.6%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Cpu3 : 3.7%us, 0.7%sy, 0.0%ni, 95.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 3.4%us, 0.3%sy, 0.0%ni, 96.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Cpu5 : 4.0%us, 0.7%sy, 0.0%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 12168008k total, 7323476k used, 4844532k free, 405332k buffers
Swap: 4194296k total, 0k used, 4194296k free, 1198540k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20543 root 18 0 5704m 303m 18m S 64.6 2.6 555:03.29 java
25873 root 15 0 90152 3336 2604 S 0.3 0.0 0:00.02 sshd
25952 root 15 0 12760 1276 944 R 0.3 0.0 0:00.01 top
各サーバーで、Cpu1は負荷を示す唯一のCPUです。他のCPUには決して移動しません。 2週間前にこれを知りました。その後、すべてが再起動され、まだ同じように動作します。このプロセスには好みが設定されていません。
# taskset -p $(pgrep java)
pid 20543's current affinity mask: 3f
次のように省電力モードではない状態の個々のスレッドを観察すると、次のようになります。
# cd /proc/$(pgrep java)/task
# while true; do awk '($3 != "S") { print "LWPID: " $1 " CPU: " $39}' */stat; sleep 5; echo -; done
彼らは様々なCPUにジャンプしているようです。
# cat /etc/redhat-release
CentOS release 5.7 (Final)
# uname -a
Linux ----- 2.6.18-274.18.1.el5 #1 SMP Thu Feb 9 12:45:44 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
# java -version
java version "1.7.0_13"
Java(TM) SE Runtime Environment (build 1.7.0_13-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
# top --version
top: procps version 3.2.7
なぜ常に単一のCPUに現れるのかを知っている人はいますか?
答え1
マシンは、実際に負荷を分散する必要がないときに1つのCPUしか起動しないように選択できます。
すべてのプロセスはアイドル時間のあるウェイクアップCPUを見て、それを好みます。