04. process: 実行単位とメモリの基本
DockerやEC2でアプリを動かしていると、CPU使用率やメモリ使用量を見ます。
その実体は、Linuxのprocess管理とメモリ管理です。
processは何か
processは「実行中プログラムのインスタンス」です。
- 同じnginxバイナリでも、起動すれば複数processになれる
- 各processはPIDを持つ
- 親子関係を持つ
図解テキスト
systemd (PID 1)
├─ sshd
│ └─ bash
│ └─ python app.py
└─ nginx master
├─ nginx worker 1
└─ nginx worker 2
メモリの見え方
processには仮想メモリ空間があります。
- text: 実行コード
- data/bss: グローバル変数
- heap: 動的確保
- stack: 関数呼び出し
Linuxは仮想メモリを使い、物理メモリへの割り当てを管理します。
手を動かす
ps -eo pid,ppid,comm,%cpu,%mem --sort=-%cpu | head
pstree -p | head -n 30
cat /proc/self/status | head -n 25
free -h
process管理で大切な視点
- 実行中の数だけでなく、状態をみる (R/S/D/Z)
- メモリ使用量はRSSとVSZの違いを意識する
- 親子関係が壊れるとゾンビprocessが残ることがある
つまり何なのか
「アプリが重い」は抽象的な現象です。
Linuxでは、実体はprocessとメモリの状態変化として観測できます。
今回理解できたこと
- processはOSが管理する実行単位
- メモリは仮想化され、processごとに分離される
- /procを見ると、processの内部状態を確認できる
コメントを残す