「試して理解 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秒あたりのマージ数 |