CPU
Central Processing Unit
CPU(Central Processing Unit)は、コンピュータの「頭脳」にたとえられる、命令を実行するパーツです。メモリからプログラムの命令を受け取り、解読・演算・制御を連続して行うことで、システム全体の動作を取り仕切ります。
🐾 猫で例えると?
鼻先の猫じゃらしに集中するアメショ。「いつ、どの向きに手を出そうか」と頭をフル回転させているようです。この「情報を受けて、次の動きを決める頭脳役」をCPUに見立てます。実際のCPUは、プログラムの命令に従って計算やデータの受け渡しを行います。
💻 IT現場における「CPU」とは?
CPUは命令を実行しますが、アプリの速度はストレージ、通信、メモリ待ちにも左右されます。CPU使用率100%は、計算処理で能力を使い切っている正常な状態の場合もあります。応答時間の悪化や待ち行列、コア別の使用率を合わせ、CPUが全体の処理を遅くしている箇所(ボトルネック)なのかを確かめます。
⚠️ CPUの仕組みと注意点
現代のCPUは、複数の「コア」を持つマルチコアプロセッサが主流です。これは、頭脳が複数あるようなもので、複数の処理を同時にこなす(並列処理)ことが可能です。しかし、プログラム側が並列処理に対応した設計(マルチスレッドなど)になっていなければ、1つのコアだけが限界まで働き、他のコアは遊んでいるという非効率な状態に陥ります。
処理の負荷と熱問題
重いデータ処理や無限ループなどが発生すると、CPUはフル稼働し、発熱します。サーバーでもPCでも、熱暴走を防ぐためにサーマルスロットリング(意図的な性能低下)が働くため、リソースを無駄に食い潰すアルゴリズムは避けるべきです。
# Python 3。ファイルとして保存して実行する例
from concurrent.futures import ProcessPoolExecutor
def heavy_computation(number):
return sum(i * i for i in range(number))
if __name__ == "__main__":
numbers = [100_000, 100_000, 100_000, 100_000]
with ProcessPoolExecutor(max_workers=2) as executor:
results = list(executor.map(heavy_computation, numbers))
print(results) この例は別プロセスへ計算を分け、結果を取り出して完了を確認します。処理が小さいと、プロセス起動やデータ受け渡しの費用が上回り、順番に実行するより遅くなることもあります。並列化の効果は実際の入力で測定しましょう。
🛠️ CPUを賢く使うためのポイント
CPUを使い続ける処理と、通信などの完了を待つ処理を分けて、設計や監視の方法を選びます。
- 終了条件を確認する: 待機を含まない無限ループはCPUを使い続けます。ただし、1つのループがただちに全コアを使い切り、OS全体を止めるとは限りません。ループのあるプロセスと影響範囲を確認します。
- 非同期処理を活用する: ネットワーク通信やファイル読み込みなど、待ち時間が発生する処理(I/Oバウンド)は、CPUを占有しないよう非同期で実装します。
- 適切なスケーリング: クラウド環境では、CPU負荷が高まった際に自動的にサーバーの台数を増やす(オートスケール)設定をしておくことで、急なアクセス増によるダウンを防ぎます。
猫じゃらしへ集中するアメショのように、CPUが忙しい場面にも理由があります。アプリが遅いときは、CPU使用率と応答時間を一緒に見て、計算に時間がかかっているのか、通信やストレージを待っているのかを切り分けましょう。