LinuxでCPUのコア数を確認する方法|物理コア・スレッド数を簡単チェック!

Linux

Linuxサーバーや開発マシンを使っているとき、
「このマシンって何コア?」
「ハイパースレッディングは有効?」
とCPUの詳細が気になることはありませんか?

実際に多くの場面でCPU情報の確認が必要になります:

「並列処理のスレッド数を最適化したい」
「仮想マシンにどれくらいのCPUを割り当てるべき?」
「サーバーのパフォーマンス調査で詳細なCPU情報が必要」
「コンパイル時のmake -jで最適な並列数を知りたい」
「Dockerコンテナのリソース制限を設定したい」

この記事では、LinuxでCPUのコア数・スレッド数を確認するコマンドから、物理コア数と論理コア数の違い、実用的な活用方法まで、初心者の方にもわかりやすく解説します。

スポンサーリンク

CPUアーキテクチャの基本知識

物理コアと論理コアの概念

物理コア(Physical Core)
CPUチップ内に実際に搭載されている独立した演算処理ユニットです。
各物理コアは完全に独立してプログラムを実行できます。

論理コア(Logical Core / Thread)
OSから認識される仮想的なプロセッサーユニットです。
物理コアにハイパースレッディング技術が適用されると、1つの物理コアが2つの論理コアとして認識されます。

ハイパースレッディング技術

Intel Hyper-Threading Technology (HTT)

  • 1つの物理コアで2つのスレッドを同時に処理
  • 実行ユニットを効率的に共有
  • 理論的には最大50%のパフォーマンス向上
  • CPU使用率の向上とレスポンス改善

AMD Simultaneous Multithreading (SMT)

  • Intelのハイパースレッディングと同様の技術
  • Ryzenシリーズで2つのスレッド/コア
  • より洗練されたリソース管理

CPU構成要素の階層

典型的なCPU構成

ソケット (Socket)
├── CPU パッケージ
    ├── 物理コア 1
    │   ├── 論理コア 1
    │   └── 論理コア 2 (HTT有効時)
    ├── 物理コア 2
    │   ├── 論理コア 3
    │   └── 論理コア 4 (HTT有効時)
    └── ...

用語の整理

用語説明
ソケットCPUが物理的に接続される場所デュアルソケット = CPU×2
物理コア実際の演算ユニット4コアCPU = 4つの物理コア
論理コアOSが認識するプロセッサー4コア8スレッド = 8論理コア
スレッド論理コアと同義並列実行可能なタスク数

LinuxでCPUコア数を確認する基本コマンド

lscpuコマンド(推奨)

基本的な使用方法

lscpu

出力例の詳細解説

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              16
On-line CPU(s) list: 0-15
Thread(s) per core:  2
Core(s) per socket:  8
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
Stepping:            12
CPU MHz:             3600.000
CPU max MHz:         4900.0000
CPU min MHz:         800.0000
BogoMIPS:            7200.00
Virtualization:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            12288K

重要な項目の説明

項目意味活用方法
CPU(s)論理CPU総数並列処理の最大スレッド数
Thread(s) per coreコアあたりスレッド数HT/SMTの有効確認
Core(s) per socketソケットあたり物理コア数真のマルチコア性能
Socket(s)CPUソケット数マルチプロセッサー構成
NUMA node(s)NUMAノード数メモリアクセス最適化

/proc/cpuinfoファイルの活用

基本的な確認方法

cat /proc/cpuinfo

論理CPU数の確認

grep -c "^processor" /proc/cpuinfo

物理コア数の確認

grep "^core id" /proc/cpuinfo | sort -u | wc -l

CPUソケット数の確認

grep "^physical id" /proc/cpuinfo | sort -u | wc -l

より詳細な分析

# 物理CPU IDごとのコア数を確認
grep -E "^(processor|physical id|core id)" /proc/cpuinfo | 
awk '
/^processor/ { proc = $3 }
/^physical id/ { phys = $4 }
/^core id/ { core = $4; print proc, phys, core }
' | sort -k2,3 -n

nprocコマンド(シンプル)

基本的な使用方法

nproc

利用可能CPU数の確認

nproc --all

オンラインCPU数の確認

nproc --online

高度なCPU情報確認方法

dmidecodeを使用したハードウェア詳細情報

プロセッサー情報の詳細確認

sudo dmidecode -t processor

出力例

Handle 0x0001, DMI type 4, 48 bytes
Processor Information
    Socket Designation: LGA1151
    Type: Central Processor
    Family: Core i7
    Manufacturer: Intel(R) Corporation
    ID: EC 06 09 00 FF FB EB BF
    Signature: Type 0, Family 6, Model 158, Stepping 12
    Flags:
        FPU (Floating-point unit on-chip)
        VME (Virtual mode extension)
        ...
    Version: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
    Voltage: 1.0 V
    External Clock: 100 MHz
    Max Speed: 4900 MHz
    Current Speed: 3600 MHz
    Status: Populated, Enabled
    Upgrade: Socket LGA1151
    L1 Cache Handle: 0x0005
    L2 Cache Handle: 0x0006
    L3 Cache Handle: 0x0007
    Serial Number: Not Specified
    Asset Tag: Not Specified
    Part Number: Not Specified
    Core Count: 8
    Core Enabled: 8
    Thread Count: 8
    Characteristics:
        64-bit capable
        Multi-Core
        Execute Protection
        Enhanced Virtualization
        Power/Performance Control

topとhtopでのリアルタイム確認

topコマンドでの確認

top
# 1キーを押すとCPUコアごとの使用率を表示

htopでの視覚的確認

htop
# より視覚的にCPUコアの状況を確認可能

sstoolsパッケージの活用

lstopo(Hardware Locality)

# インストール(Ubuntu/Debian)
sudo apt install hwloc

# CPUトポロジーの視覚的表示
lstopo --of console
lstopo --of png --output cpu-topology.png

実用的な活用例

並列処理の最適化

makeコマンドでの並列ビルド

# 論理CPU数を取得してmakeで使用
NPROC=$(nproc)
make -j${NPROC}

# 物理コア数のみを使用(推奨)
CORES=$(lscpu | grep "Core(s) per socket" | awk '{print $4}')
make -j${CORES}

Dockerでのリソース制限

# 利用可能CPU数の確認
docker run --rm alpine nproc

# CPU制限の設定
docker run --cpus="2.5" myapp

# 特定CPUコアの指定
docker run --cpuset-cpus="0,1" myapp

プログラミングでの活用

Python での並列処理

import multiprocessing
import os

# 論理CPU数を取得
logical_cores = multiprocessing.cpu_count()
print(f"論理CPU数: {logical_cores}")

# 環境変数からCPU数を取得
nproc_count = int(os.popen('nproc').read().strip())
print(f"nproc結果: {nproc_count}")

# 物理コア数を取得(概算)
physical_cores = logical_cores // 2  # HTT有効の場合
print(f"物理コア数(推定): {physical_cores}")

Cプログラムでの取得

#include <unistd.h>
#include <stdio.h>

int main() {
    long nprocs = sysconf(_SC_NPROCESSORS_ONLN);
    printf("利用可能CPU数: %ld\n", nprocs);
    
    long nprocs_conf = sysconf(_SC_NPROCESSORS_CONF);
    printf("設定済みCPU数: %ld\n", nprocs_conf);
    
    return 0;
}

仮想化環境での考慮事項

VMware環境での確認

# VMwareツールの情報
vmware-toolbox-cmd stat cpu

# ホストOSのCPU情報
dmidecode -t system

Docker環境での確認

# コンテナ内のCPU制限確認
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us

# 実際の制限値計算
quota=$(cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us)
period=$(cat /sys/fs/cgroup/cpu/cpu.cfs_period_us)
if [ $quota -gt 0 ]; then
    echo "CPU制限: $(echo "scale=2; $quota / $period" | bc)"
else
    echo "CPU制限: なし"
fi

トラブルシューティング

よくある問題と対処法

コア数が期待値と異なる

原因と確認方法

# 1. CPU周波数スケーリングの確認
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 2. CPUホットプラグの状態確認
ls /sys/devices/system/cpu/cpu*/online
cat /sys/devices/system/cpu/cpu*/online

# 3. BIOSでのCPU設定確認
sudo dmidecode -t processor | grep -E "(Core Count|Thread Count)"

ハイパースレッディングの有効/無効確認

確認コマンド

# 方法1: lscpuで確認
lscpu | grep "Thread(s) per core"

# 方法2: /proc/cpuinfoで詳細確認
echo "物理コア数: $(grep "^core id" /proc/cpuinfo | sort -u | wc -l)"
echo "論理CPU数: $(grep -c "^processor" /proc/cpuinfo)"

# 方法3: CPUフラグの確認
grep -o "ht" /proc/cpuinfo | wc -l

仮想化環境での制限

確認方法

# KVM/QEMU環境
lscpu | grep Hypervisor
dmesg | grep -i hypervisor

# コンテナ環境
systemd-detect-virt
cat /proc/1/cgroup

パフォーマンス測定

CPU性能テスト

# sysbenchを使用したCPUベンチマーク
sudo apt install sysbench
sysbench cpu --threads=$(nproc) run

# 物理コア数のみでテスト
PHYSICAL_CORES=$(lscpu | grep "Core(s) per socket" | awk '{print $4}')
sysbench cpu --threads=${PHYSICAL_CORES} run

ストレステスト

# stress-ngを使用
sudo apt install stress-ng

# 全CPUコアでストレステスト
stress-ng --cpu $(nproc) --timeout 60s

# 物理コアのみでテスト
stress-ng --cpu ${PHYSICAL_CORES} --timeout 60s

セキュリティとCPU情報

脆弱性の確認

SpectreとMeltdown対策の確認

# カーネルの脆弱性対策状況
cat /sys/devices/system/cpu/vulnerabilities/*

# より詳細な確認
grep -r . /sys/devices/system/cpu/vulnerabilities/

CPUマイクロコードの確認

# マイクロコードのバージョン確認
grep microcode /proc/cpuinfo | head -1

# intel-microcodeパッケージの状態(Intel CPU)
dpkg -l | grep microcode

自動化スクリプトの例

CPU情報収集スクリプト

包括的なCPU情報スクリプト

#!/bin/bash
# cpu_info.sh - CPU情報の包括的な収集

echo "=== CPU基本情報 ==="
echo "論理CPU数: $(nproc)"
echo "物理CPU数: $(lscpu | grep 'CPU(s):' | head -1 | awk '{print $2}')"
echo "ソケット数: $(lscpu | grep 'Socket(s):' | awk '{print $2}')"
echo "物理コア数/ソケット: $(lscpu | grep 'Core(s) per socket:' | awk '{print $4}')"
echo "スレッド数/コア: $(lscpu | grep 'Thread(s) per core:' | awk '{print $4}')"

echo -e "\n=== CPU詳細 ==="
echo "アーキテクチャ: $(lscpu | grep 'Architecture:' | awk '{print $2}')"
echo "CPUモデル: $(lscpu | grep 'Model name:' | cut -d':' -f2 | sed 's/^ *//')"
echo "最大周波数: $(lscpu | grep 'CPU max MHz:' | awk '{print $4}') MHz"
echo "最小周波数: $(lscpu | grep 'CPU min MHz:' | awk '{print $4}') MHz"

echo -e "\n=== キャッシュ情報 ==="
lscpu | grep cache

echo -e "\n=== 仮想化サポート ==="
VIRT_SUPPORT=$(lscpu | grep 'Virtualization:' | cut -d':' -f2 | sed 's/^ *//')
if [ -n "$VIRT_SUPPORT" ]; then
    echo "仮想化: $VIRT_SUPPORT"
else
    echo "仮想化: サポートなし"
fi

echo -e "\n=== 脆弱性対策状況 ==="
if [ -d /sys/devices/system/cpu/vulnerabilities ]; then
    for vuln in /sys/devices/system/cpu/vulnerabilities/*; do
        echo "$(basename $vuln): $(cat $vuln)"
    done
else
    echo "脆弱性情報は利用できません"
fi

監視用スクリプト

CPU使用率監視スクリプト

#!/bin/bash
# cpu_monitor.sh - CPU使用率の継続監視

INTERVAL=5
LOGFILE="cpu_usage.log"

echo "CPU監視開始 ($(date))" >> $LOGFILE

while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')
    LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}')
    
    echo "[$TIMESTAMP] CPU使用率: ${CPU_USAGE}%, 負荷平均:${LOAD_AVG}" >> $LOGFILE
    
    # 高負荷時のアラート
    if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
        echo "警告: CPU使用率が80%を超えています (${CPU_USAGE}%)"
    fi
    
    sleep $INTERVAL
done

まとめ

LinuxでのCPU情報確認の要点

コマンド用途取得情報推奨度
lscpu包括的な情報確認全CPU情報★★★
nproc論理CPU数のみ論理プロセッサー数★★★
/proc/cpuinfo詳細分析プロセッサー詳細★★
dmidecodeハードウェア詳細BIOS/ハードウェア情報★★

実用的な活用指針

  • 並列処理最適化:物理コア数を基準にスレッド数を決定
  • 仮想化設計:論理CPU数と物理リソースの関係を把握
  • パフォーマンス調査:CPU構成とボトルネックの関係を分析
  • セキュリティ対策:脆弱性対策の実装状況を定期確認

設定時の注意事項

  • ハイパースレッディングの有効性は用途により判断
  • 仮想化環境では実際のリソース制限を考慮
  • セキュリティアップデートの適用状況を定期確認
  • 監視ツールでのリアルタイム状況把握

コメント

タイトルとURLをコピーしました