「試して理解 Linuxの仕組み」に出てきたプロファイル系コマンドまとめ

はじめに

試して理解 Linuxの仕組みを読みました。 本書はOSとハードウェアの基礎知識を解説するもので、 理論を学ぶだけではなく実験もすることで理解が深められるようになっています。 実験に使われるプロファイル系のコマンドに知らなかったものが多く、 覚えておくと役立ちそうだと思ったので、この記事にまとめておきます。

コマンド

2章 ユーザーモードで実現する機能

strace

strace {program}
strace -o {log} {program}

プロセスが発行したシステムコールを1行ずつ表示します。

$ strace ls
execve("/bin/ls", ["ls"], 0x7ffc12f088f0 /* 19 vars */) = 0
brk(NULL)                               = 0x55f52beca000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=25766, ...}) = 0
mmap(NULL, 25766, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2271fef000
close(3)                                = 0
.
.
.
オプション 効果
-T システムコールの所要時間をマイクロ秒単位で表示
-tt システムコールが発行された時刻をマイクロ秒単位で表示

sar -P

sar -P {CPU} {interval(s)}

CPUごとに使用時間の統計を表示します。 ctrl+cするとそれまでのを出力して終了します。

$ sar -P ALL 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/23/2018      _x86_64_     (1 CPU)

10:38:45 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:38:46 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
10:38:46 AM       0      0.00      0.00      0.00      0.00      0.00    100.00

10:38:46 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:38:47 AM     all      0.00      0.00      0.99      0.00      0.00     99.01
10:38:47 AM       0      0.00      0.00      0.99      0.00      0.00     99.01

10:38:47 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:38:48 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
10:38:48 AM       0      0.00      0.00      0.00      0.00      0.00    100.00
^C


Average:        CPU     %user     %nice   %system   %iowait    %steal     %idle
Average:        all      0.00      0.00      0.33      0.00      0.00     99.67
Average:          0      0.00      0.00      0.33      0.00      0.00     99.67
フィールド 意味
%user ユーザーモードで実行した時間
%nice デフォルト以外の優先度で実行した時間
%system カーネルモードでシステムコールなどの処理を実行した時間
%iowait CPUコアで何も実行していなく、かつI/O待ちになっているプロセスが存在していた時間
%idle CPUコアで何も実行していなかった時間

ldd

ldd {program}

プログラムにリンクされているライブラリを表示します。

$ ldd /bin/ls
        linux-vdso.so.1 (0x00007ffff19b9000)
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fa4fe68b000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa4fe29a000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fa4fe028000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa4fde24000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa4fead5000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa4fdc05000)

3章 プロセス管理

readelf

readelf {option(s)} {program}

Linuxの実行ファイルはELF(Executable Linkable Format)というフォーマットになっています。readelfはELFの各種情報を表示するコマンドです。

-hオプションでELFのヘッダーを表示します。 本文中ではエントリポイント(Entry point address)の確認に使われていました。

$ readelf -h /bin/ls
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x5850
  Start of program headers:          64 (bytes into file)
  Start of section headers:          132000 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         28
  Section header string table index: 27

-Sオプションで各セクションの情報を表示します。 本文中ではコード(.text)とデータ(.data)のファイル内オフセット・サイズ・開始アドレスを表示するために使われていました。

$ readelf -S /bin/ls
There are 28 section headers, starting at offset 0x203a0:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000000238  00000238
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.ABI-tag     NOTE             0000000000000254  00000254
       0000000000000020  0000000000000000   A       0     0     4
       .
       .
       .
  [14] .text             PROGBITS         0000000000003e90  00003e90
       00000000000124d9  0000000000000000  AX       0     0     16
       .
       .
       .
  [24] .data             PROGBITS         0000000000220000  00020000
       0000000000000268  0000000000000000  WA       0     0     32
       .
       .
       .
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)

/proc/xxxx/maps

プロセスのメモリマップを表示します。

$ cat /proc/14709/maps
55acf6656000-55acf675a000 r-xp 00000000 08:02 393245                     /bin/bash
55acf6959000-55acf695d000 r--p 00103000 08:02 393245                     /bin/bash
55acf695d000-55acf6966000 rw-p 00107000 08:02 393245                     /bin/bash
.
.
.

4章 プロセススケジューラ

taskset

taskset -c {cpu} {program}

論理CPUを指定してプログラムを実行します。

ps

ps ax

システムに存在するプロセスを表示します。

$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:05 /sbin/init maybe-ubiquity
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00 [kworker/0:0H]
    6 ?        I<     0:00 [mm_percpu_wq]
    7 ?        S      0:01 [ksoftirqd/0]
    8 ?        I      0:00 [rcu_sched]
    9 ?        I      0:00 [rcu_bh]
    .
    .
    .

STATフィールドの1文字目は各プロセスの状態を表します。

STATの1文字目 プロセスの状態
R 実行 or 実行待ち状態
S or D スリープ状態
Z ゾンビ状態

sar -q

$ sar -q 1 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/23/2018      _x86_64_     (1 CPU)

02:29:20 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
02:29:21 PM         0       111      0.06      0.02      0.00         0
Average:            0       111      0.06      0.02      0.00         0

runq-szフィールドは実行中および実行待ちプロセスの数を示します。

/proc/cpuinfo

論理CPUごとの詳細情報が記録されているファイル。 本文中では論理CPUの数を調べるのに使われていました。

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 78
model name      : Intel(R) Core(TM) i5-6360U CPU @ 2.00GHz
stepping        : 3
cpu MHz         : 1991.999
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase avx2 invpcid rdseed clflushopt
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 3983.99
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

time

$ time ls
.
.
.
real    0m0.003s
user    0m0.002s
sys     0m0.000s
フィールド 意味
real 経過時間
user ユーザーモードでのCPUが動作していた時間。複数の論理CPUで動作した場合はそれらの合計。
sys カーネルモードでCPUが動作していた時間

ps -eo

プロセス開始から現在までの使用時間と経過時間を出力します。 TIMEが使用時間、ELAPSEDが経過時間です。

$ ps -eo pid,comm,time,etime
  PID COMMAND             TIME     ELAPSED
    1 systemd         00:00:05    10:48:34
    2 kthreadd        00:00:00    10:48:34
    4 kworker/0:0H    00:00:00    10:48:34
    6 mm_percpu_wq    00:00:00    10:48:34
    7 ksoftirqd/0     00:00:01    10:48:34
    8 rcu_sched       00:00:00    10:48:34
    9 rcu_bh          00:00:00    10:48:34

5章 メモリ管理

free

システムが搭載するメモリの使用状況を表示します。

$ free
              total        used        free      shared  buff/cache   available
Mem:        1009124      115880      173296        1040      719948      734492
Swap:       2017276           0     2017276

Mem: |フィールド|意味| |:---|:---| |total|システムに搭載されている全メモリの量| |free|見かけ上の空きメモリ| |buff/cache|バッファキャッシュとページキャッシュが利用するメモリ| |available|実質的な空きメモリ。freeフィールドの値に空きメモリが不足したら開放されるカーネル内メモリ領域のサイズを足したもの。|

Swap: |フィールド|意味| |:---|:---| |total|swap領域のサイズ| |used|使用されているswap領域のサイズ| |used|空いているswap領域のサイズ|

sar -r

メモリに関する統計情報を出力します。

$ sar -r ALL 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

02:00:49 AM kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty  kbanonpg    kbslab  kbkstack   kbpgtbl  kbvmused
02:00:50 AM    154660    716132    854464     84.67     79940    587968    308176     10.18    597792    145588         0     80920     78920      1856      5256         0
02:00:51 AM    154660    716132    854464     84.67     79940    587968    308176     10.18    597792    145588         0     80924     78920      1856      5256         0
^C

Average:       154660    716132    854464     84.67     79940    587968    308176     10.18    597792    145588         0     80922     78920      1856      5256         0
フィールド 意味
kbmemfree 見かけ上の空きメモリ
kbbuffers バッファキャッシュが利用するメモリ
kbcached ページキャッシュが利用するメモリ
kbpgtbl ページテーブルに使用しているメモリ

sar -B

$ sar -B 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

01:45:52 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
01:45:53 AM      0.00      0.00      1.00      0.00      1.00      0.00      0.00      0.00      0.00
01:45:54 AM      0.00    173.74      3.03      0.00      0.00      0.00      0.00      0.00      0.00
^C

Average:         0.00     86.43      2.01      0.00      0.50      0.00      0.00      0.00      0.00
フィールド 意味
fault/s 1秒あたりのページフォールト

swapon

システムのスワップ領域を確認します。

swapon --show
$ swapon --show
NAME      TYPE SIZE USED PRIO
/swap.img file 1.9G   0B   -2

sar -W

スワッピングの状況を表示します。

$ sar -W 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

01:54:18 AM  pswpin/s pswpout/s
01:54:19 AM      0.00      0.00
^C

Average:         0.00      0.00
フィールド 意味
pswpin/s スワップインされたページ数(1秒あたり)
pswpout/s スワップアウトされたページ数(1秒あたり)

sar -S

スワップ領域の容量を表示します。

$ sar -S
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

01:45:01 AM kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
01:55:01 AM   2017276         0      0.00         0      0.00
Average:      2017276         0      0.00         0      0.00
フィールド 意味
kbswpfree 空いているスワップ領域のサイズ
kbswpused 使用しているスワップ領域のサイズ

/sys/kernel/mm/transparent/hugepage/enabled

トランスペアレントヒュージページ機能の有効/無効を設定するファイル。

6章 記憶階層

sar -d -p 1

ストレージデバイスへの読み書きを監視して表示します。

$ sar -d -p 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

02:09:54 AM       DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
02:09:55 AM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM     loop1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM     loop2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM     loop3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
^C


Average:          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
Average:        loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        loop1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        loop2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        loop3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
フィールド 意味
rd_sec/s 1秒あたりに各ストレージデバイスから読み込んだサイズ
wr_sec/s 1秒あたりに各ストレージデバイスに書き込んだサイズ
%util 1秒あたりにストレージデバイスにアクセスしていた時間の割合

sysctl vm.xxx

ページキャッシュを制御するチューニングパラメーター。

パラメーター 意味
dirty_writeback_centisecs ダーティページのライトバック周期
dirty_background_ratio バックグラウンドでライトバック処理が動作開始するダーティーページの割合。この値を超えるとライトバック処理が始まる。
dirty_background_bytes バックグラウンドでライトバック処理が動作開始するダーティーページのサイズ。この値を超えるとライトバック処理が始まる。
dirty_ratio 同期的にライトバック処理が動作開始するダーティーページの割合。この値を超えるとライトバック処理が始まる。
dirty_bytes 同期的にライトバック処理が動作開始するダーティーページのサイズ。この値を超えるとライトバック処理が始まる。

/sys/devices/system/cpu/cpu{number}/topology/thread_sibilings_list

同じCPUコア内のハイパースレッドペアが記録されている。

7章 ファイルシステム

df

システムに存在するファイルシステムの一覧と使用状況を表示します。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              474964       0    474964   0% /dev
tmpfs             100916    1024     99892   2% /run
/dev/sda2       10252564 4703284   5008764  49% /
tmpfs             504560       0    504560   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs             504560       0    504560   0% /sys/fs/cgroup
/dev/loop0         88704   88704         0 100% /snap/core/4486
tmpfs             100912       0    100912   0% /run/user/1000
/dev/loop1         89088   89088         0 100% /snap/core/4830
/dev/loop2         89088   89088         0 100% /snap/core/4917

/proc/{pid}

システムに存在するプロセスについての情報が格納されているディレクトリ。

$ ls /proc/$$
attr             cwd       map_files   oom_adj        schedstat     syscall
autogroup        environ   maps        oom_score      sessionid     task
auxv             exe       mem         oom_score_adj  setgroups     timers
cgroup           fd        mountinfo   pagemap        smaps         timerslack_ns
clear_refs       fdinfo    mounts      patch_state    smaps_rollup  uid_map
cmdline          gid_map   mountstats  personality    stack         wchan
comm             io        net         projid_map     stat
coredump_filter  limits    ns          root           statm
cpuset           loginuid  numa_maps   sched          status
ファイル名 格納されている情報
maps プロセスのメモリマップ
cmdline プロセスのコマンドライン引数
stat これまでに使用したCPU時間・優先度・使用メモリ量など、プロセスの状態

/proc

システムについての情報が格納されているディレクトリ。

$ ls /proc
1      14863  2      395   714  88         driver       locks         sys
10     14864  20     4     747  9          execdomains  mdstat        sysrq-trigger
1082   14901  21     407   748  97         fb           meminfo       sysvipc
11     14902  22     408   749  972        filesystems  misc          thread-self
114    14934  23     409   758  977        fs           modules       timer_list
12     15     23708  424   759  993        interrupts   mounts        tty
12360  15037  24     425   77   acpi       iomem        mtrr          uptime
12386  15038  25     426   771  asound     ioports      net           version
13     15059  26     427   773  buddyinfo  irq          pagetypeinfo  version_signature
13714  15076  27     442   776  bus        kallsyms     partitions    vmallocinfo
14     15090  272    449   777  cgroups    kcore        sched_debug   vmstat
14157  16     28     4710  78   cmdline    keys         schedstat     zoneinfo
14561  17     29     500   79   consoles   key-users    scsi
14598  178    30     507   790  cpuinfo    kmsg         self
14708  18     324    6     8    crypto     kpagecgroup  slabinfo
14709  19     325    610   80   devices    kpagecount   softirqs
14733  197    34     615   81   diskstats  kpageflags   stat
14805  198    35     7     82   dma        loadavg      swaps
ファイル名 格納されている情報
cpuinfo システムが搭載するCPUについての情報
diskstat システムが搭載するストレージデバイスに関する情報
meminfo システムのメモリに関する情報
sys以下のファイル カーネルの各種チューニングパラメーター

/sys

カーネルのプロセスに関するもの以外の雑多な情報が格納されているディレクトリ。

ディレクトリ名 格納されている情報
/sys/devices システムに搭載されているデバイスに関する情報
/sys/fs システムに存在する各種ファイルシステムに関する情報
/sys/fs/cgroup 1つ以上のプロセスから成るグループにかけられているリソースの使用制限に関する情報

8章 ストレージデバイス

iostat

ストレージデバイスへの読み書き情報を表示します。

$ iostat -x
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.56    0.13    0.25    0.09    0.00   98.97

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
loop0            0.00    0.00      0.03      0.00     0.00     0.00   0.00   0.00    2.54    0.00   0.00    13.11     0.00   0.05   0.00
loop1            0.23    0.00      0.26      0.00     0.00     0.00   0.00   0.00    0.06    0.00   0.00     1.10     0.00   0.00   0.00
loop2            0.19    0.00      0.22      0.00     0.00     0.00   0.00   0.00    0.03    0.00   0.00     1.12     0.00   0.00   0.00
loop3            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     1.60     0.00   0.00   0.00
scd0             0.05    0.00      0.21      0.00     0.00     0.00   0.00   0.00    0.26    0.00   0.00     3.95     0.00   0.26   0.00
sda              0.68    1.29     18.81     65.87     0.03     2.40   4.09  64.93    1.39    2.24   0.00    27.73    50.90   0.75   0.15
フィールド 意味
rrqm/s 読み出し処理における1秒あたりのマージ数
wrqm/s 書き込み処理における1秒あたりのマージ数