Linux (Ubuntu), macOS, Windows のスペックを確認する方法
Ubuntu
OS
Linux ディストリビューション(lsb_release って debian 系じゃないとだめとかあったっけ、わすれた)
lsb_release -a
OS カーネル
uname -a
プロセッサ
lscpu
メモリ
free -h
total used free shared buff/cache available
Mem: 15Gi 13Gi 196Mi 103Mi 1.5Gi 1.3Gi
Swap: 2.0Gi 2.0Gi 0B
ブロックデバイス(ストレージ)
NVMe, SATA
lsblk
ハードウェア全体を出力
sudo lshw
systemd 関連
systemctl に登録されているサービス一覧を表示するコマンド
- すべてのサービスを表示
systemctl list-unit-files --type=service
- 現在アクティブ(実行中)のサービスを表示
systemctl list-units --type=service
- 現在ロードされているサービスを表示:
systemctl list-units --type=service --state=loaded
- 現在アクティブ(実行中)および非アクティブ(停止中)のサービスを表示:
systemctl list-units --type=service --state=active,inactive
- 失敗したサービスを表示
systemctl list-units --type=service --state=failed
- すべてのサービスを表示(静的ユニットファイルを含む):
systemctl list-units --type=service --all
これらのコマンドは、systemd に管理されているサービスの状態や設定を確認するのに役立つ。出力には、サービス名、ロード状態、アクティブ状態、サブ状態、説明などの情報が含まれる。
必要に応じて、--type=service
の部分を --type=socket
、--type=target
などに変更することで、他のタイプの systemd ユニットの一覧を表示することもできる。
特定のポート番号を使用しているプロセスを探して kill する
# ポート3000を使用しているプロセスを見つける
lsof -i :3000
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# node 1234 user 12u IPv6 0x12345678 0t0 TCP *:3000 (LISTEN)
# プロセスの詳細情報を表示
ps -p 1234 -o comm,pid,user,%cpu,%mem
# COMM PID USER %CPU %MEM
# node 1234 user 0.1 2.0
# プロセスを通常の方法で終了
kill 1234
# プロセスが終了しない場合のみ、強制終了を使用
# kill -9 1234
# プロセスが終了したことを確認
lsof -i :3000
# コマンドは何も出力しない(プロセスが終了しているため)
macOS
OS
sw_vers
# ProductName: macOS
# ProductVersion: 14.1
# BuildVersion: 23B5056e
もしくはメニューバー > 🍎 > About This Mac > macOS
OS カーネル
uname -a
# Darwin nukopy-m1max.local 23.1.0 Darwin Kernel Version 23.1.0: Tue Sep 26 22:11:21 PDT 2023; root:xnu-10002.40.89.501.1~3/RELEASE_ARM64_T6000 arm64
プロセッサ
名前:メニューバー > 🍎 > About This Mac > Chip
詳細
sysctl -a machdep.cpu
# machdep.cpu.cores_per_package: 10
# machdep.cpu.core_count: 10
# machdep.cpu.logical_per_package: 10
# machdep.cpu.thread_count: 10
# machdep.cpu.brand_string: Apple M1 Max
メモリ
メニューバー > 🍎 > About This Mac > Memory
使用率
memory_pressure -Q
# The system has 68719476736 (4194304 pages with a page size of 16384).
# System-wide memory free percentage: 89%
ブロックデバイス(ストレージ)
メニューバー 🍎 > System Settings > Storage
ディスクユーティリティアプリ(Disk Utility.app
)
ハードウェア全体を出力
Linux の sudo lshw
と違ってストレージとネットワークインタフェース(NIC)は表示されない。
system_profiler SPHardwareDataType
# Hardware:
#
# Hardware Overview:
#
# Model Name: MacBook Pro
# Model Identifier: MacBookPro18,4
# Model Number: Z15H000XLJ/A
# Chip: Apple M1 Max
# Total Number of Cores: 10 (8 performance and 2 efficiency)
# Memory: 64 GB
# System Firmware Version: 10151.40.171.501.2
# OS Loader Version: 10151.40.171.501.2
# Serial Number (system): ****
# Hardware UUID: ****
# Provisioning UDID: ****
# Activation Lock Status: Disabled
Q. macOS 14.1 でのコマンドの実行結果です。パフォーマンスコアとエフィシェンシーコアって何が違うの?
system_profiler SPHardwareDataType
# Hardware:
#
# Hardware Overview:
#
# Model Name: MacBook Pro
# Model Identifier: MacBookPro18,4
# Model Number: Z15H000XLJ/A
# Chip: Apple M1 Max
# Total Number of Cores: 10 (8 performance and 2 efficiency)
# Memory: 64 GB
# System Firmware Version: 10151.40.171.501.2
# OS Loader Version: 10151.40.171.501.2
# Serial Number (system): ****
# Hardware UUID: ****
# Provisioning UDID: ****
# Activation Lock Status: Disabled
パフォーマンスコアとエフィシェンシーコアの違い
- パフォーマンスコア(Performance Cores):
- 高いパフォーマンスを発揮するために設計されています。
- 高負荷のタスク(例:ビデオ編集、3Dレンダリング、ゲームなど)に最適です。
- 消費電力が高い。
- エフィシェンシーコア(Efficiency Cores):
- 省電力で効率的な動作を重視しています。
- 低負荷のタスク(例:ブラウジング、メール、テキスト編集など)に最適です。
- 消費電力が低い。
Apple M1 MaxのようなSoC(システム・オン・チップ)は、これらのコアを組み合わせることで、性能と電力効率のバランスを実現しています。
Q. 例えば Rust でマルチスレッドプログラミングを行う場合、パフォーマンスコア + エフィシェンシーコアの個数をコア数として見てよいの?
Rustでマルチスレッドプログラミングを行う際、パフォーマンスコアとエフィシェンシーコアの両方をコア数として考えても構いません。ただし、各コアの特性を理解して使い分けることが重要です。パフォーマンスコアは高負荷なタスクに最適で、エフィシェンシーコアは低負荷で省電力なタスクに適しています。特定のスレッドに対する優先度や負荷に応じて、適切なコアでタスクを実行することで、効率的なリソース利用が可能になります。
Q. Rust でパフォーマンスコアとエフィシェンシーコアを使い分けるコードを書いてください。
Rust からはどっちの種類のコアを使うかという細かい制御はできないみたい。タスクのスケジューリングやコアの割当は OS の役目なのでハードウェアの詳細な制御は難しい。それはそう。
Rustでパフォーマンスコアとエフィシェンシーコアを使い分ける具体的なコード例を示します。以下>の例では、
rayon
クレートを使用してスレッドプールを作成し、異なるスレッドでタスクを実行します。実際にコアを指定するには、OSやハードウェアに依存する部分があるため、Rustだけで完全に制御することは難しいですが、概念的な例を示します。
まず、
rayon
クレートをCargo.tomlに追加します:
[dependencies]
rayon = "1.5"
次に、Rustコードでタスクをパフォーマンスコアとエフィシェンシーコアに分けて実行する例です:
use rayon::prelude::*;
use std::thread;
fn main() {
// パフォーマンスコア向けのタスク
let heavy_tasks: Vec<i32> = (0..8).collect();
// エフィシェンシーコア向けのタスク
let light_tasks: Vec<i32> = (0..2).collect();
// スレッドプールの作成
let heavy_pool = rayon::ThreadPoolBuilder::new().num_threads(8).build().unwrap();
let light_pool = rayon::ThreadPoolBuilder::new().num_threads(2).build().unwrap();
// パフォーマンスコア向けのタスクを実行
heavy_pool.scope(|s| {
heavy_tasks.into_par_iter().for_each(|task| {
s.spawn(move |_| {
perform_heavy_task(task);
});
});
});
// エフィシェンシーコア向けのタスクを実行
light_pool.scope(|s| {
light_tasks.into_par_iter().for_each(|task| {
s.spawn(move |_| {
perform_light_task(task);
});
});
});
// 全タスクの完了を待つ
thread::sleep(std::time::Duration::from_secs(1));
}
fn perform_heavy_task(task: i32) {
// 重いタスクの実装
println!("Performing heavy task: {}", task);
// 擬似的な重い処理
thread::sleep(std::time::Duration::from_millis(500));
}
fn perform_light_task(task: i32) {
// 軽いタスクの実装
println!("Performing light task: {}", task);
// 擬似的な軽い処理
thread::sleep(std::time::Duration::from_millis(100));
}
このコードでは、
rayon::ThreadPoolBuilder
を使ってパフォーマンスコア向けに8スレッド、エフィシェンシーコア向けに2スレッドのスレッドプールを作成し、それぞれに適したタスクを実行します。これにより、異なるタイプのコアを活用する例を示しています。実際には、タスクのスケジューリングやコアの割り当てはOSが管理するため、ハードウェアの詳細な制御は難しい場合があります。
Windows 10 / 11
Windows 11 で調べたので Windows 10 だと若干違うかも、わからん。
ハードウェア全体
「システム情報」アプリ
OS
設定 > システム > バージョン情報 > Windows の仕様 > エディション、バージョン
プロセッサ
設定 > システム > バージョン情報 > デバイスの仕様 > プロセッサ
メモリ
設定 > システム > バージョン情報 > デバイスの使用 > 実装 RAM
ブロックデバイス(ストレージ)
設定 > システム > 記憶域 > Windows (C:)
Windows コマンドプロンプト:特定のポート番号を使用しているアプリケーションを探して kill する
netstat -ano | findstr :3000
# TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 6648
# TCP [::]:3000 [::]:0 LISTENING 6648
tasklist /fi "pid eq 6648"
# イメージ名 PID セッション名 セッション# メモリ使用量
# ========================= ======== ================ =========== ============
# node.exe 6648 Console 2 179,844 K
netstat -ano | findstr :3000
# TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 6648
# TCP [::]:3000 [::]:0 LISTENING 6648
taskkill /pid 6648 /f
# 成功: PID 6648 のプロセスは強制終了されました。
ストレージの接続インタフェースの規格:NVMe、SATA
- BUFFALO: 【かんたん解説】M.2 SSDとは?NVMeとは?
SATA
- SATA(Serial ATA、シリアル ATA、シリアルエーティーエー)
-
コンピュータにHDD、SSDや光学ドライブを接続する為のインタフェース規格である。2010年時点において、SCSIやパラレルATAに代わって主流となっている。 英語ではセイタまたはサタと発音する[3]。
- 発音:サタ
-
SATAはM.2が普及し始める初期に一般的に使われてきた接続方法です。
NVMe接続のストレージと端子が似ていますが、NVMeとは別の通信規格で動作し端子の形状も異なるため、互換性はありません。
NVMeと比較して速度が遅く、発売時期が古い商品が多いことから容量単価も高くなる傾向にあります。
NVMe
NVMe は読み書きの圧倒的な高速データ転送が特長です。
主に PCI-Express 接続を用いており、SSD 側に搭載されている NVMe コントローラーが高速なデータ転送を実現します。その分、価格は高めではありますが、高性能や高速化を追求する方におすすめです。