ツール
- ldd: リンクしてるやつ
- readelf: ELFバイナリの情報
- sar: CPUの使用状況
- IO: -d -p
- ページフォールト: -B
- メモリ: -r
- taskset: CPUを指定してプロセスを走らせる sched_setaffinity() system call を使っている
- ps ax: STAT
- S: sleep (interruptible)
- D: IO待ちなど (uninterruptible) 数msで終わる
- R: runnig/in queue
- ps -eo pid, comm, time, etime: CPU使用時間、起動してからの時間
free: 使用中のメモリ
/sys/devices/system/cpu/cpu0/cache - CPU0のキャッシュ情報
/proc/<pid>/maps - プロセスのメモリマップ (man 5 proc)
/proc/cpuinfo
カーネル
- OOM killer - available なメモリがなくなった時、適当なプロセスを選んでkill.
- sysctl の vm.panic_on_oom で disable 可
- スリープ状態のプロセスはイベント/入力/デバイスの書き込み終了/データ送受信の終了待ち
- fork 時メモリはCOW
- すべての書き込み権限を無効化し、page fault 時にページエントリをコピー
- プロセスのページテーブル(仮想アドレスと物理アドレスのマッピング)が大きくなると、それをコピーするためforkに時間がかかる。mitigation としてhuge page がある
- TLB: Translation lookaside buffer ページテーブルのキャッシュ
- ページキャッシュ - カーネルメモリ上のディスクキャッシュ
- ライトバックはデフォルト5秒 (sysctl dirty_writeback_centisecs)
- CPUのキャッシュ
$ for i in 0 1 2 3; do cat /sys/devices/system/cpu/cpu0/cache/index$i/{type,level,shared_cpu_list,size,coherency_line_size} | xargs; done
Data 1 0,4 32K 64
Instruction 1 0,4 32K 64
Unified 2 0,4 256K 64
Unified 3 0-7 8192K 64
$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,4
cpu0 は 32K の L1 Data,Inst キャッシュ、256K の L2 キャッシュ、8192K の L3キャッシュを持つ
L1, L2 はハイパースレッドのペア cpu4 とキャッシュを共有。L3 はすべてのCPUで共有
ファイルシステム
- キャラクタデバイス: シークはできない
- 端末、キーボード、マウス
- ps で表示されるTTYはそれにひもづくcharacter device. pts/1 なら /dev/pts/1
-
ブロックデバイス:ランダムアクセス
- ブロックデバイス層を通してアクセス。マージやソートをしてスループットを上げる(特にHDD)
- ブロックデバイス層 -> ドライバA -> デバイスA
-
procfs (man 5 proc)
- /proc/sys 以下のファイルは sysctl, /etc/sysctl.cnf と一対一に対応
-
sysfs
- /sys/devices - デバイス情報
- /sys/fs - ファイルシステム情報
-
cgroupfs
- CPUやメモリの制限を特定のプロセスグループに課す。docker や仮想マシンで利用
C 言語
- register 指定子 - なるべくレジスタに割り当てる