私は16個のCPUを搭載したUbuntuサーバーを持っています。 (nproc --all
見せてください16
)
test.sh
という名前のbashスクリプトを次のように作成しました。
#!/bin/bash
while :
do
echo xxx
done
私はそれを実行しました:./test.sh >/dev/null &
。
次に、コマンドtop
を使用してCPUの使用状況を監視しましたが、プロセスtest.sh
が原因で1つのCPUがほぼ100%使用されていたことがわかりました。
6411 me 20 0 11240 3052 2852 R 93.8 0.0 0:11.71 test.sh
%Cpu5 : 96.7 us, 3.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
ご覧のとおり、プロセスtest.sh
は5番目のCPUに割り当てられており、ほぼ100%使用されています。
CPUをより多く使用できるように、複数のCPUに重いプロセスを割り当てることは可能ですか? OSがプロセスtest.sh
を複数のCPUに割り当てなかったのはなぜですか?プロセスtest.sh
が十分に重くないためですか、それともOSがそうするために何らかの構成を行う必要がありますか?
単一のスレッドを複数のコアに分割することはできません。
プログラムは、複数のスレッド(コアごとに1つ)を持つように作成する必要があります。または、複数のプログラムが存在する必要があります。そうでない場合は、コアを使用しません。
より多くのコアを使用するプログラムを作成することは簡単ではなく、すべての問題を並列化できるわけではありません(複数のコアで実行するように作成する)。問題に本質的にシーケンシャルなコードが20%含まれている場合、プロセッサの数が無限であると、元の実行時間の20%より速くなることはありません(500%の速度向上)。次に、オーバーヘッド(スレッド間の通信)があります。
コア用のアプリケーションがない場合は、それを販売して、より安価なマシンを入手することをお勧めします。
各コアには、単一のスレッドを処理するために大量の並列処理がありますが、これは表示されません。現在、コアを追加するため、単一のコアをこれ以上高速化するのに苦労しています。これは最初はうまく機能します。
Unixシステム(Gnu/Linux、Ubuntuなど)は、2→4程度までの追加のコアをうまく使用します。 MicrosoftのWindowsは、ウイルススキャナー用のコア、デフラグツール用のコア、その他すべてのコアがある場合に改善されます。
その後、マルチコア用に設計されたアプリケーションがある場合にのみ違いが生じます。