linuxとCPUアーキテクチャ
Linuxが人気である理由は、多数の異なる CPU アーキテクチャ上で実行されることがおそらく理由の 1 つです。 Linux カーネルには、汎用コードとドライバーに加えて、それぞれのCPUアーキテクチャ固有のコンポーネントが含まれています。これにより異なる仕様のCPU上でもシステムを起動させることが可能なのです。
CPU
Linuxは複数のコンピューターアーキテクチャ上で動作します。
(ここでのコンピューターアーキテクチャはCPUファミリアと同じ意味です。)
現在使用しているLinuxがどのCPUアーキテクチャであるかを把握するにはdmidecode
コマンドを使用します。
もし出力結果が得られない場合には、lscpu
コマンドを使用するのがよいでしょう。
[root@ac93e82b6845 myworking]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Address sizes: 46 bits physical, 48 bits virtual Byte Order: Little Endian CPU(s): 20 On-line CPU(s) list: 0-19 Vendor ID: GenuineIntel Model name: 12th Gen Intel(R) Core(TM) i7-12700 CPU family: 6 Model: 151 Thread(s) per core: 2 Core(s) per socket: 10 Socket(s): 1 Stepping: 2 BogoMIPS: 4224.00 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse ss e2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop _tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline _timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi 2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni u mip waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm serialize flush_l1d arch_capabili ties Virtualization features: Virtualization: VT-x Hypervisor vendor: Microsoft Virtualization type: full Caches (sum of all): L1d: 480 KiB (10 instances) L1i: 320 KiB (10 instances) L2: 12.5 MiB (10 instances) L3: 25 MiB (1 instance) Vulnerabilities: Itlb multihit: Not affected L1tf: Not affected Mds: Not affected Meltdown: Not affected Mmio stale data: Not affected Retbleed: Mitigation; Enhanced IBRS Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence Srbds: Not affected Tsx async abort: Not affected
lscpuコマンドの実行結果、
- cpuファミリアは
x86_64
- CPU数は
20
- CPUのモデルは
Intel 12世代
さらにコンパクトな情報はuanme -a
で確認できます。
[root@ac93e82b6845 myworking]# uname -a Linux ac93e82b6845 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 GNU/Linux
CPUファミリア一覧
x86 CPUファミリア
x86アーキテクチャはIntelが開発した命令セットファミリでのちにAMDに提供されます。
Intel 64bit cpu
はカーネル内部ではx64
またはx86_64
と表記されています。Intel-32bit
はカーネル内部ではx86
と表記されます。AMD84
はカーネル内部ではamd64
と表記されます。
アウトオブオーダー実行への依存とエネルギー効率の悪さがデメリットとしてあげられますが、
x86
はいま最も使用されているCPUファミリアです。
アウト・オブ・オーダー実行(アウト・オブ・オーダーじっこう、英: out-of-order execution)とは、高性能プロセッサにおいてクロックあたりの命令実行数(IPC値)を増やし性能を上げるための手法の1つで、機械語プログラム中の命令の並び順に依らず、データなどの依存関係から見て処理可能な命令について逐次開始・実行・完了させるものである。頭文字で'OoO'あるいは'O-o-O'とも書かれる。「順序を守らない実行」の意である。
逆に逐次実行はイン・オーダー実行と呼ばれる。
x86 CPUファミリアに対する命令はx86アセンブラ
として定義されており、
x86アーキテクチャは8個の汎用レジスタ (GPR) と6個のセグメントレジスタ、1個のフラグレジスタ、1個の命令ポインタを持っている。
- RAX/EAX/AX/AL/AH : 「アキュムレータレジスタ」と呼ばれる。算術演算操作の結果が格納される。
- RCX/ECX/CX/CL/CH : 「カウンタレジスタ」と呼ばれる。シフトローテート命令とループ命令に使用される。
- RDX/EDX/DX/DL/DH : 「データレジスタ」と呼ばれる。算術演算操作とI/O操作に使用される。
- RBX/EBX/BX/BL/BH : 「ベースレジスタ」と呼ばれる。セグメントモードでのDS(後述)に格納されたデータを指し示すために使用される。
- RSP/ESP/SP : 「スタックポインターレジスタ」と呼ばれる。スタックのトップを指し示すポインタ。
- RBP/EBP/BP : 「スタックベースポインタレジスタ」と呼ばれる。スタックのベースを指し示すのに使用される。
- RSI/ESI/SI : 「ソースレジスタ」と呼ばれる。ストリーム操作コマンド(たとえば MOV命令)でのソース(入力元)へのポインタとして使用される。
- RDI/EDI/DI : 「デスティネーションレジスタ」と呼ばれる。ストリーム操作コマンドでの転送先(←英語でデスティネーションという. 出力先のようなもの)へのポインタとして使用される。
ARM CPUファミリア
ARMはAcorn社から開発され、当初から消費電力を最小限に抑えることに重点を置いてます。 したがって、iphone,androidなどの多くの携帯機器にARMベースのチップが搭載されているようです。 そのほかにはRaspberry PiのようなIoT組み込みデバイスにも組み込まれており、AWSのデータセンターでもARMベースのCPUの採用が増えてきています。
RISC-Vファミリア
カルフォルニア大学バークレー校が開発したオープンなRISC規格のCPUです。 Nvidiaを含めた多くの実装が存在します。
比較的新規のCPUであるため広くは普及しておりません。
コマンドで目視する
proc
とcpu情報
今後、proc
という言葉がたくさん出てくる。
これはprocess
の略であり、これが出てきたら、プロセスやCPUに関連したキーワードであると認識したほうが良い。
cpu情報を確認する
具体例:/proc/cpuinfo
まずはcpuの情報が書かれたファイルを見る。
less /proc/cpuinfo
processor
- :CPUの単位。8コア存在するのであれば、
0~7
まである。 nproc
コマンドと同じ- 例)
- :CPUの単位。8コア存在するのであれば、
model name
:CPUの名前。flags
:cpuが持つ機能。- 例)
fpu
: 小数点も含めた計算機能。 - 例2)
spectre_v1
: 一昨年あたりにあったCPUの脆弱性に関する機能。
- 例)
cpu情報を確認する手段2
lscpu
コマンドでもcpuの情報を確認することが可能。
lscpu
- サンプル実行結果
Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 40 bits physical, 48 bits virtual CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 60 Model name: Intel Core Processor (Haswell, no TSX, IBRS) Stepping: 1
- CPUアーキテクチャは:
x86_64
- 利用可能なCPUは:
4
つ - CPUのモデル名は
Intel Core Processor
nprocコマンド
CPUの数が得られる。(coreutilsに含まれる機能)
grep -c processor /proc/cpuinfo
と同じ結果が得られる。
色々なスクリプトで使われている
CPUの使用状況を調べる
top
コマンド
CPUに関する情報が出てくる。
システムが高負荷になるときにどのプログラムが動いているかどうかがわかる。
id
:アイドリング。ここの値が高ければ高いほど、何もしていないCPUの数が多い。us
:ユーザー単位のCPU使用率
top
を押した後、1
を押してみる
CPUのプロセッサーごとの詳細画面に移る。
ループするプログラムを見てみる
#!/bin/sh while true do sleep 1 date done
後処理、loopコマンドの終了
killall loop
プロセッサーを指定してプログラムを実行する
taskset
を指定することで、cpuのプロセッサー番号を指定して動かすことができる
taskset -c 3 ./loop &
このプログラムを実行した後、top
コマンドを実行する。
CPUの数を減らす
結論:システムドライバファイルを消せば良い。
sys/devices/system/cpu/cpu<プロセッサー名>
ll sys/devices/system/cpu/
cpuが大量に見えるはず。 今回はcpu7を選択
cat /sys/devices/system/cpu/cpu7/online
これを実行することで、1か0かが表示される。
1
:cpu7は有効0
:cpu0は無効
逆に、このファイルに1や0を記述することで、CPUの数を増減させることができる
例)
echo 0 > /sys/devices/system/cpu/cpu7/online
注意!:cpu0
はオフラインにできないようになっている。