ハードウェア基礎 #2 CPU — コア / スレッド / クロック / キャッシュ、そして vCPU の正体
#1 で、4 つのリソースのうち計算を担う部品が CPU だと整理しました。今回はその CPU を 1 段深く見ていきます。コア、スレッド、クロック、キャッシュという 4 つの言葉はインスタンスを選ぶたびに出会いますが、正確に何を指すのかは意外とぼやけています。最後にはクラウドのスペック表に書かれた vCPU が実際は何かまで押さえておきます。
ハードウェア基礎 シリーズでの今回の位置です。
- #1 コンピュータを動かす 4 つのリソース — CPU / メモリ / ストレージ / ネットワーク
- #2 CPU — コア / スレッド / クロック / キャッシュ、そして vCPU の正体 ← 今回
- #3 メモリ — RAM と階層構造、スワップが始まると起きること
- #4 ストレージ ① デバイス — HDD / SSD / NVMe と IOPS / スループット / レイテンシ
- #5 ストレージ ② 構成と接続 — RAID と DAS / NAS / SAN
- #6 ネットワーク — 帯域幅とレイテンシ、NIC からデータセンターまで
- #7 仮想化とコンテナ — 物理サーバー 1 台が複数台になる仕組み
- #8 クラウド — 所有から賃借へ、オンプレミスから IaaS / PaaS / SaaS まで
- #9 クラウドインスタンスのスペックの読み方 — ワークロードに合わせて選ぶ
CPU がすること #
CPU は同じ動作をひたすら繰り返します。メモリから命令を 1 つ取り出し (fetch)、何の処理かを解釈し (decode)、実行し (execute)、結果を書く (write) サイクルです。このサイクルを 1 秒に数十億回回します。
取り出し → 解釈 → 実行 → 結果を書く → 次の命令を取り出す → ...
(fetch) (decode) (execute) (write)性能を左右する問いは 2 つです。このサイクルを どれだけ速く 回すか (クロック)、そしてサイクルを回す働き手が 何人 いるか (コア・スレッド) です。
コアとスレッド #
コア — 本当の計算単位 #
コア (core) は命令サイクルを独立して回す計算装置です。コアが 4 個なら、異なる作業 4 つを同時に進められます。昔は CPU チップ 1 つにコアが 1 つでしたが、今はチップ 1 つにコアを複数入れた マルチコア が標準です。
コアが多いほど 同時に 処理できる仕事が増えます。Web サーバーがリクエスト 100 個を同時に受けるなら、コアが多いほど多くのリクエストを並べて処理します。
スレッドとハイパースレッディング #
スレッド (thread) は CPU が処理する 1 つの作業の流れです。コア 1 つは普通スレッド 1 つを処理しますが、ハイパースレッディング (Hyper-Threading) または SMT という技術を使うと、コア 1 つがスレッド 2 つを交互に処理します。
仕組みはこうです。1 つのスレッドがメモリを待って少し遊んでいる間、その空き時間に別のスレッドを差し込みます。コアが本当に 2 つになるわけではなく、遊ぶ時間を減らして稼働率を上げる方法です。
物理コア 4 個
└─ 各コアがスレッド 2 個を処理
= OS には「論理プロセッサ」8 個に見えるだから同じチップでも「4 コア 8 スレッド」のように書かれます。物理コアは 4 個、OS が見る論理プロセッサは 8 個という意味です。性能はコア 8 個分までは伸びません。仕事の性質によって、だいたい 20〜30% 程度の向上が見込めます。
クロック — 1 秒に何回 #
クロック (clock) は CPU がサイクルをどれだけ速く回すかを表します。単位はヘルツ (Hz) で、3.0GHz は 1 秒に 30 億回という意味です。
クロックが高ければコア 1 つが速くなります。ただしクロックだけで 2 つの CPU を比較することはできません。1 回のサイクルでどれだけ多くの仕事をするか (IPC)、キャッシュがどれだけ大きいか、コアが何個かがすべて違うからです。
| 比較 | クロックだけ見ると | 実際は |
|---|---|---|
| 旧型 4.0GHz vs 新型 3.0GHz | 旧型が速そう | 新型がサイクルあたり多く処理して速いことが多い |
| シングルスレッド作業 | クロックが高い方が有利 | おおむね正しい |
| 複数リクエスト処理 | クロックだけでは判断不可 | コア数の方が重要 |
要点は、クロックは コア 1 つの速さを測る 1 つの指標にすぎず、世代とコア数が違えばクロックの数字比較は意味が薄いということです。
キャッシュ — CPU の中の高速保存先 #
#1 で CPU はメモリよりずっと速いと述べました。CPU が毎回遅いメモリを待てばコアが遊びます。だから CPU の中に小さくて非常に速い保存先を置きます。これが キャッシュ (cache) です。
キャッシュは普通 3 段階です。
| 段階 | サイズ | 速度 | 位置 |
|---|---|---|---|
| L1 | 数十 KB | もっとも速い | コアごとに別 |
| L2 | 数百 KB ~ 数 MB | 速い | コアごとまたは共有 |
| L3 | 数 MB ~ 数十 MB | 普通 | 複数コアで共有 |
CPU は必要なデータを L1 から探します。あれば キャッシュヒット、なければ 1 段下りていき、最後までキャッシュになければ遅いメモリまで行きます。これが キャッシュミス です。キャッシュミスが頻繁だと、コアはメモリを待って速いクロックを遊ばせます。
だから同じコア数とクロックでも、キャッシュが大きい CPU の方が速い場合が多いです。よく使うデータがキャッシュの中にとどまる確率が高くなるからです。
vCPU の正体 #
クラウドのスペック表はコアではなく vCPU で書かれています。t3.medium は 2vCPU、c5.xlarge は 4vCPU という具合です。この vCPU は正確には何でしょうか。
ほとんどのクラウドで 1vCPU は物理コア 1 つではなくハイパースレッド 1 つ です。つまり物理コア 1 つがスレッド 2 つを処理すれば、そのコアは 2vCPU として売られます。
物理コア 1 個 (ハイパースレッディング ON)
├─ スレッド 1 → vCPU 1
└─ スレッド 2 → vCPU 2
4vCPU インスタンス = 普通は物理コア 2 個に相当だから「4vCPU」を物理コア 4 個と期待するとずれます。物理コア 2 個の方が正確な絵です。一部の高性能インスタンスやベアメタル種類は 1vCPU を物理コア 1 つとして提供することもあるので、正確な値はインスタンスのドキュメントで確認します。インスタンスの種類を総合して読む方法は #9 で扱います。
コアを増やしても速くならないとき #
#1 の誤解をもう一度押さえておきます。コアを増やせば常に速くなるという考えは、よく外れます。
1 つの作業が速くなるには、その作業が複数の断片に分かれて複数のコアで同時に回れる必要があります。ところが多くの作業には 分けられない直列区間 があります。前の段階の結果が出てから次の段階を始められる部分です。この区間はコアがいくら多くても 1 コアで順番に回るしかありません。
作業全体 = 直列 20% + 並列可能 80%
コア 1 個: ████████████████████ (100)
コア 4 個: ████ + ████ (直列 20 + 並列 20 = 40)
コア無限: ████ + ▏ (直列 20 + ほぼ 0 → 20 に収束)直列区間が 20% なら、コアを無限に増やしても 5 倍以上は速くなりません。これが アムダールの法則 です。
整理すると、コアを増やして得をするのは 2 つの場合です。互いに独立した リクエストを複数同時に 処理するとき (Web サーバーのように)、または 1 つの作業がうまく 並列化 されるときです。シングルスレッドだけで動く作業は、コア数よりコア 1 つの速さ (クロック・IPC・キャッシュ) が重要です。
よく出会う落とし穴 #
「CPU 使用率 100% なら無条件で増設」 #
CPU が本当に計算で 100% なのか、他のリソースを待って回っているのかを区別する必要があります。ディスクやネットワークを待つ間に使用率が高く見える場合もあるので、#1 の原則どおりボトルネックをまず測ります。
「vCPU 数 = 物理コア数」 #
ほとんどのインスタンスで vCPU はハイパースレッド単位です。4vCPU は普通物理コア 2 個です。CPU に敏感なワークロードなら、この差を踏まえて種類を選びます。
「バースタブル (t) インスタンスに一貫した性能を期待する」
#
t 系のようなバースタブルインスタンスは普段は一定水準だけ保証し、クレジットで少しだけ多く出します。クレジットが尽きると性能が制限されるので、CPU を継続的に使うワークロードには合いません。
「クロックの数字で世代の違う CPU を比較する」 #
世代が違うとサイクルあたりの処理量が変わり、クロック比較は外れます。クロックは同じ世代の中でだけ単純比較が通じます。
まとめ #
今回つかんだ絵です。
- コア は独立して計算する単位で、多いほど同時に処理する仕事が増えます。
- ハイパースレッディング (SMT) はコア 1 つがスレッド 2 つを交互に処理して稼働率を上げます。性能が 2 倍になるわけではありません。
- クロック はコア 1 つの速さの指標にすぎず、世代とコア数が違えば数字の比較は意味が薄いです。
- キャッシュ (L1・L2・L3) は遅いメモリを待つ時間を減らします。キャッシュミスが頻繁だと速いクロックも遊びます。
- クラウドの 1vCPU は普通ハイパースレッド 1 つ です。4vCPU はだいたい物理コア 2 個です。
- コアを増やして得をするには、作業が並列化されるかリクエストが複数である必要があります。直列区間 はアムダールの法則どおり限界を作ります。
次回 — メモリ #
CPU がどれだけ速くても、データが近くになければ待たなければなりません。その作業空間がメモリです。#3 メモリ — RAM と階層構造、スワップが始まると起きること では、RAM の正体、レジスタからディスクまで続くメモリ階層、そしてメモリが足りなくなったときにシステムが遅いディスクへ落ちて性能が崖のように落ちる過程を整理します。