SlideShare a Scribd company logo
1 of 37
JPOUG in 15 minutes #9
Linux Performance
Analysis in 15 minutes
Yohei Azekatsu
Twitter: @yoheia
2019.12.04@月島
お話すること
• dstat、htop などモダンなツールや strace、sysdig、perf など深掘りする
ツールを使わずに mpstat、top、free、iostat など古典的なツールを使った
基本的な Linux パフォーマンス分析手法を紹介します。
• できるだけ誰でも知っていてどの環境でも入ってそうなコマンドにしてみま
した。
• 本質的には原理や手法を理解しているとコマンドの使い方や見方も自然にで
きるという持論を持っていますが、抽象的な話をしても刺さらないことが多
いので逆にコマンドのみの説明をするというアプローチにしてみました。
• モダンなツールを使った分析や深堀りの仕方はまた機会がありましたらご紹
介します。
はじめに
• ほとんどのツールは /proc などを通じて Linux カーネルのメモリ構造体から
性能統計情報を読んで加工して表示しているテキスト加工・集計ツールです。
• Oracle Database で言うとV$ビューはX$表を参照していてその実態は共有メ
モリの構造体を参照しているのと同じイメージ。
例えば vmstat を strace してみると
$ vmstat -V
procps version 3.2.8
$ strace -e open vmstat 5
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
open("/proc/meminfo", O_RDONLY) = 3
open("/proc/stat", O_RDONLY) = 4
open("/proc/vmstat", O_RDONLY) = 5
0 0 0 7860684 86812 129312 0 0 0 0 16 15 0 0 100 0 0
0 0 0 7860684 86812 129312 0 0 0 0 47 44 0 0 100 0 0
0 0 0 7860684 86812 129312 0 0 0 0 46 46 0 0 100 0 0
^CProcess 16019 detached
/proc/meminfo などを5秒間隔で読んで一つ前に読んだ値を引き算いて5秒間の平均
値を表示している。vmstat などで1行目の値を使うなというのはそのため。
vmstat が参照している /proc/meminfo
$ cat /proc/meminfo
MemTotal: 8168820 kB
MemFree: 7860328 kB
MemAvailable: 7872576 kB
Buffers: 86968 kB
Cached: 129348 kB
SwapCached: 0 kB
Active: 195204 kB
Inactive: 43972 kB
Active(anon): 22860 kB
Inactive(anon): 52 kB
Active(file): 172344 kB
Inactive(file): 43920 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 22852 kB
vmstat が表示する free、buffers、cached、
swpd などの情報ソース
vmstat が参照している /proc/stat
$ cat /proc/stat
cpu 9580 49 2384 87457700 910 0 533 2905 0 0
cpu0 3417 23 1011 43734769 867 0 3 1055 0 0
cpu1 6162 25 1372 43722930 43 0 529 1850 0 0
intr 14007564 41 9 0 0 385 0 0 0 2 0 0 0 86 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(中略)
ctxt 13411592
btime 1572941486
processes 16303
procs_running 1
procs_blocked 0
softirq 13111825 0 3596184 2013398 1923467 0 0 23641 3587966 0 1967169
CPU時間の累積値
run queue と blocked の数
/proc/stat の定義
cpu 10132153 290696 3084719 46828483 16683 0 25195 0 175628 0
cpu0 1393280 32966 572056 13343292 6130 0 17875 0 23933 0
The amount of time, measured in units of USER_HZ
(1/100ths of a second on most architectures, use
sysconf(_SC_CLK_TCK) to obtain the right value), that
the system ("cpu" line) or the specific CPU ("cpuN"
line) spent in various states:
user (1) Time spent in user mode.
nice (2) Time spent in user mode with low priority
(nice).
(中略)
procs_running 6
Number of processes in runnable state. (Linux 2.5.45
onward.)
procs_blocked 2
Number of processes blocked waiting for I/O to com‐
plete. (Linux 2.5.45 onward.)
CPU時間の累積値
run queue に入っているプロセス
の数(TASK_INTERRUPTIBLE)
I/O待ちのプロセスの数
(TASK_UNINTERRUPTIBLE)
http://man7.org/linux/man-pages/man5/proc.5.html
なぜこのようなことが起きるのか?
https://twitter.com/kylelf_/status/1186355769953767424
vmstat がそんな実装になているから
• CPU使用率は vmstat のオプションで指定したインターバルの平均値
• run queue や blocked はある瞬間の値
• 従って、run queue > vCPU数 なのにCPU使用率が100%でない、または逆
に run queue < vCPU数 なのにCPU使用率が高いということが起こりうる
vmstat のソースを読むと
static void new_format(void) {
(中略)
for(i=1;i<num_updates;i++) { /*  main loop ////////////////// */
sleep(sleep_time);
if (moreheaders && ((i%height)==0)) new_header();
tog= !tog;
meminfo();
getstat(cpu_use+tog,cpu_nic+tog,cpu_sys+tog,cpu_idl+tog,cpu_iow+tog,cpu_xxx+tog,cpu_yyy+tog,cpu_zzz+tog,
pgpgin+tog,pgpgout+tog,pswpin+tog,pswpout+tog,
intr+tog,ctxt+tog,
&running,&blocked,
&dummy_1,&dummy_2);
duse= cpu_use[tog]-cpu_use[!tog] + cpu_nic[tog]-cpu_nic[!tog];
dsys= cpu_sys[tog]-cpu_sys[!tog] + cpu_xxx[tog]-cpu_xxx[!tog] + cpu_yyy[tog]-cpu_yyy[!tog];
didl= cpu_idl[tog]-cpu_idl[!tog];
diow= cpu_iow[tog]-cpu_iow[!tog];
dstl= cpu_zzz[tog]-cpu_zzz[!tog];
http://procps.sourceforge.net/procps-3.2.8.tar.gz
• vmstat.c
インターバルの差分
特定の瞬間の値
vmstat のソースを読むと
void getstat(jiff *restrict cuse, jiff *restrict cice, jiff *restrict csys, jiff *restrict cide, jiff *restrict ciow, jiff
*restrict cxxx, jiff *restrict cyyy, jiff *restrict czzz,
unsigned long *restrict pin, unsigned long *restrict pout, unsigned long *restrict s_in, unsigned long
*restrict sout,
unsigned *restrict intr, unsigned *restrict ctxt,
unsigned int *restrict running, unsigned int *restrict blocked,
unsigned int *restrict btime, unsigned int *restrict processes) {
static int fd;
unsigned long long llbuf = 0;
int need_vmstat_file = 0;
int need_proc_scan = 0;
const char* b;
buff[BUFFSIZE-1] = 0; /* ensure null termination in buffer */
if(fd){
lseek(fd, 0L, SEEK_SET);
}else{
fd = open("/proc/stat", O_RDONLY, 0);
if(fd == -1) crash("/proc/stat");
}
read(fd,buff,BUFFSIZE-1);
http://procps.sourceforge.net/procps-3.2.8.tar.gz
• proc/sysinfo.c
/proc/stat を読んでいる
dstat は Python で書かれている
$ dstat -V
Dstat 0.7.0
(以降略)
$ file /usr/bin/dstat
/usr/bin/dstat: Python script, ASCII text executable
$ head -5 /usr/bin/dstat
#!/usr/bin/python2.7
### This program is free software; you can redistribute it and/or modify
### it under the terms of the GNU Library General Public License as published by
### the Free Software Foundation; version 2 only
https://github.com/dagwieers/dstat
• dstat
いくつかのLinuxコマンドの見方を紹介します
• CPU
- mpstat
- top
• Memory
- free
- /proc/meminfo
• I/O
- iostat
mpstat
$ mpstat -P ALL 5
Linux 4.14.62-65.117.amzn1.x86_64 (ip-172-17-3-15) 11/10/2019 _x86_64_ (2 CPU)
(中略)
10:27:42 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
10:27:47 AM all 49.65 0.00 0.40 0.00 0.00 0.00 0.00 0.00 49.95
10:27:47 AM 0 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 99.80
10:27:47 AM 1 99.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00
特定の vCPU で約100%
システム全体では
CPU使用率は約50%
ユーザーモード
カーネルモード
暇してる。最後にCPU
使ったプロセスはI/O待ち
割込み
ソフトウェア割込み
他のゲストかHVにCPU
を横取りされた
暇してる
• mpstat でシステム全体のCPU使用率の内訳(ユーザー/カーネル/割込みなど)を分析する。
mpstat
$ mpstat -P ALL 5
(中略)
10:27:42 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
10:27:47 AM all 49.65 0.00 0.40 0.00 0.00 0.00 0.00 0.00 49.95
10:27:47 AM 0 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 99.80
10:27:47 AM 1 99.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00
システム全体のCPU使用率は低くても、vCPU別
に見ると特定のvCPUだけ使用率が高い場合があ
る。例えば、2vCPUのマシンでシステム全体の
CPU使用率が50%の場合、CPU別に見ると、
1vCPUは100%で張り付いていることがある。
豆知識:On-CPUのスレッドが run queue に入
らないのは Solaris のみ。Windows、Linux、
AIX、HP-UXなどは On-CPU のスレッドも run
queue に含まれる。
出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/24
https://yohei-a.hatenablog.jp/entry/20151220/1450610487
• mpstat でvCPU別のCPU使用率を分析する。
top
$ top -Hc -U ec2-user
Tasks: 103 total, 3 running, 72 sleeping, 0 stopped, 0 zombie
Cpu0 : 99.7%us, 0.3%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 99.0%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8168820k total, 8042868k used, 125952k free, 7822220k buffers
Swap: 0k total, 0k used, 0k free, 106896k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ P TIME WCHAN COMMAND
16478 ec2-user 20 0 105m 664 592 R 99.9 0.0 26:10.30 1 26:10 - yes
16492 ec2-user 20 0 126m 3396 3112 R 99.9 0.0 8:56.89 0 8:56 - perl -e while(1){$i++}
16543 ec2-user 20 0 15368 2240 1928 R 0.3 0.0 0:00.05 1 0:00 - top -Hc -U ec2-user
16265 ec2-user 20 0 117m 3916 2840 S 0.0 0.0 0:00.11 1 0:00 - sshd: ec2-user@pts/1
16266 ec2-user 20 0 112m 3384 2984 S 0.0 0.0 0:00.06 1 0:00 - -bash
16534 ec2-user 20 0 126m 3388 3076 S 0.0 0.0 0:00.00 0 0:00 hrtimer_n perl -e while(1){sleep(1000)}
“1”を押下するとvCPU別に表示、”f”を押下すると表示列を増やせる
物理メモリ使用
サイズ(VIRTは
実際に使ってい
るサイズではな
い)
最後に使ったCPU番号
累積CPU時間 sleep時に呼ばれたカーネル関数
“c”オプションでコマンド表示
“H”オプションでスレッド表示
• top でどのプロセスがCPUを使っているか調べる。
1CPUの使用率
ステータス
R: On CPU or ランキュー
D: Disk Sleep
S: Sleep
top の出力結果を加工して時系列傾向分析
• top をバッチモードで実行してファイルに出力、CSV に変換して時系列の傾向を可視化
$ top -bc -d 1top - 12:08:54 up 20 days, 1:12, 10 users, load average: 4.62, 6.17, 6.16
Tasks: 351 total, 7 running, 344 sleeping, 0 stopped, 0 zombie
Cpu(s): 51.7%us, 45.5%sy, 0.0%ni, 0.3%id, 0.2%wa, 0.0%hi, 1.7%si, 0.6%st
Mem: 4104972k total, 3076880k used, 1028092k free, 9240k buffers
Swap: 8385532k total, 1598312k used, 6787220k free, 1163316k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14987 oracle 20 0 1476m 21m 20m R 27.1 0.5 4622:02 ora_qmnc_sharedb1
30079 oracle 20 0 1458m 95m 94m S 23.2 2.4 3869:49 ora_q003_sharedb1
9282 oracle 20 0 1456m 64m 64m S 3.9 1.6 471:45.36 ora_q01c_sharedb1
20642 oracle 20 0 1455m 63m 63m S 3.9 1.6 469:14.05 ora_q01b_sharedb1
24555 oracle 20 0 1455m 60m 60m S 3.9 1.5 539:35.26 ora_q000_sharedb1
24599 oracle 20 0 1456m 67m 66m R 3.9 1.7 467:57.12 ora_q004_sharedb1
24668 oracle 20 0 1459m 72m 68m S 3.9 1.8 528:19.15 ora_q009_sharedb1
24801 oracle 20 0 1457m 71m 68m S 3.9 1.8 469:24.25 ora_q00d_sharedb1
24972 oracle 20 0 1456m 69m 68m S 3.9 1.7 536:16.71 ora_q00h_sharedb1
24986 oracle 20 0 1455m 60m 59m S 3.9 1.5 531:50.28 ora_q00i_sharedb1
25105 oracle 20 0 1455m 62m 62m S 3.9 1.6 469:50.96 ora_q00l_sharedb1
25129 oracle 20 0 1456m 65m 64m S 3.9 1.6 470:35.82 ora_q00m_sharedb1
25278 oracle 20 0 1457m 68m 67m S 3.9 1.7 470:20.44 ora_q00q_sharedb1
25328 oracle 20 0 1455m 59m 59m S 3.9 1.5 543:32.96 ora_q00s_sharedb1
25371 oracle 20 0 1456m 61m 61m S 3.9 1.5 531:16.63 ora_q00t_sharedb1
25476 oracle 20 0 1457m 65m 65m S 3.9 1.6 528:18.89 ora_q00u_sharedb1
25660 oracle 20 0 1455m 63m 62m S 3.9 1.6 467:17.30 ora_q00w_sharedb1
27611 oracle 20 0 1455m 63m 62m S 3.9 1.6 466:30.37 ora_q010_sharedb1
28456 oracle 20 0 1456m 66m 63m S 3.9 1.7 466:30.15 ora_q014_sharedb1
29878 oracle 20 0 1455m 60m 59m S 3.9 1.5 540:15.48 ora_q005_sharedb1
1984 root 20 0 1146m 24m 14m S 1.9 0.6 103:23.97 /u01/app/11.2.0.4/grid/bin/ohasd.bin reboot
2549 root RT -5 887m 158m 62m S 1.9 4.0 388:37.52 /u01/app/11.2.0.4/grid/bin/ologgerd -M -d /u01/app/11.2.0.4/grid/crf/db/consdb112n1
5825 grid -2 0 1306m 4296 4164 S 1.9 0.1 336:10.59 asm_vktm_+ASM1
5843 grid 20 0 1315m 8656 7736 S 1.9 0.2 38:57.81 asm_lmon_+ASM1
6166 root 20 0 1181m 36m 18m S 1.9 0.9 165:44.51 /u01/app/11.2.0.4/grid/bin/crsd.bin reboot
6305 oracle 20 0 1456m 63m 63m S 1.9 1.6 475:39.25 ora_q016_sharedb1
6335 oracle 20 0 1455m 63m 62m S 1.9 1.6 469:22.68 ora_q017_sharedb1
7857 oracle 20 0 1456m 60m 60m S 1.9 1.5 541:25.79 ora_q01a_sharedb1
10910 oracle 20 0 1455m 63m 62m S 1.9 1.6 474:27.15 ora_q01d_sharedb1
21311 oracle 20 0 15208 1316 848 R 1.9 0.0 0:00.02 top -bc -d 1
24482 oracle 20 0 1459m 71m 70m R 1.9 1.8 468:10.14 ora_q006_sharedb1
24514 oracle 20 0 1456m 64m 64m S 1.9 1.6 466:55.69 ora_q001_sharedb1
24534 oracle 20 0 1455m 60m 60m S 1.9 1.5 538:40.52 ora_q007_sharedb1
24704 oracle 20 0 1456m 60m 60m S 1.9 1.5 523:07.36 ora_q00b_sharedb1
24733 oracle 20 0 1456m 66m 65m S 1.9 1.7 467:46.55 ora_q00c_sharedb1
24871 oracle 20 0 1456m 64m 63m S 1.9 1.6 466:18.69 ora_q00e_sharedb1
24890 oracle 20 0 1455m 60m 59m S 1.9 1.5 536:55.73 ora_q00f_sharedb1
24950 oracle 20 0 1456m 63m 63m S 1.9 1.6 467:32.91 ora_q00g_sharedb1
25063 oracle 20 0 1455m 63m 62m S 1.9 1.6 469:04.99 ora_q00j_sharedb1
25090 oracle 20 0 1454m 61m 60m S 1.9 1.5 467:56.07 ora_q00k_sharedb1
25155 oracle 20 0 1455m 65m 64m S 1.9 1.6 466:29.63 ora_q00n_sharedb1
25210 oracle 20 0 1455m 63m 62m S 1.9 1.6 467:35.19 ora_q00o_sharedb1
25255 oracle 20 0 1457m 70m 68m S 1.9 1.8 472:34.51 ora_q00p_sharedb1
25292 oracle 20 0 1457m 76m 76m S 1.9 1.9 468:52.91 ora_q00r_sharedb1
25734 oracle 20 0 1455m 60m 60m S 1.9 1.5 536:39.85 ora_q00x_sharedb1
27589 oracle 20 0 1457m 66m 64m S 1.9 1.7 466:57.24 ora_q00y_sharedb1
27600 oracle 20 0 1455m 60m 60m S 1.9 1.5 524:24.46 ora_q00z_sharedb1
27635 oracle 20 0 1457m 66m 65m S 1.9 1.7 470:39.90 ora_q019_sharedb1
27641 oracle 20 0 1456m 70m 69m S 1.9 1.8 467:07.28 ora_q011_sharedb1
27924 oracle 20 0 1456m 64m 64m R 1.9 1.6 467:15.43 ora_q012_sharedb1
27969 oracle 20 0 1457m 68m 68m R 1.9 1.7 466:36.72 ora_q013_sharedb1
1 root 20 0 19396 1052 868 S 0.0 0.0 0:05.77 /sbin/init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kthreadd]
3 root 20 0 0 0 0 S 0.0 0.0 4:12.11 [ksoftirqd/0]
4 root 20 0 0 0 0 S 0.0 0.0 0:15.73 [kworker/0:0]
6 root RT 0 0 0 0 S 0.0 0.0 20943:14 [migration/0]
7 root RT 0 0 0 0 S 0.0 0.0 0:09.43 [watchdog/0]
8 root RT 0 0 0 0 S 0.0 0.0 6399:26 [migration/1]
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/1:0]
10 root 20 0 0 0 0 S 0.0 0.0 4:09.11 [ksoftirqd/1]
11 root RT 0 0 0 0 S 0.0 0.0 0:09.11 [watchdog/1]
12 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [cpuset]
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [khelper]
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [netns]
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [xenwatch]
16 root 20 0 0 0 0 S 0.0 0.0 0:00.01 [xenbus]
17 root 20 0 0 0 0 S 0.0 0.0 0:02.62 [sync_supers]
18 root 20 0 0 0 0 S 0.0 0.0 0:00.07 [bdi-default]
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kintegrityd]
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kblockd]
21 root 20 0 0 0 0 S 0.0 0.0 0:56.26 [kworker/0:1]
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [ata_sff]
23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [khubd]
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [md]
25 root 20 0 0 0 0 S 0.0 0.0 1:09.75 [kworker/1:1]
26 root 20 0 0 0 0 S 0.0 0.0 0:01.64 [khungtaskd]
27 root 20 0 0 0 0 S 0.0 0.0 2:26.39 [kswapd0]
28 root 25 5 0 0 0 S 0.0 0.0 0:00.00 [ksmd]
29 root 20 0 0 0 0 S 0.0 0.0 0:00.46 [fsnotify_mark]
30 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [crypto]
35 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kthrotld]
36 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/u:1]
37 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [khvcd]
38 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kpsmoused]
349 root 20 0 0 0 0 S 0.0 0.0 1:32.56 [kjournald]
394 root 20 0 0 0 0 S 0.0 0.0 1:44.37 [flush-202:0]
440 root 16 -4 10888 624 312 S 0.0 0.0 0:16.76 /sbin/udevd -d
947 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kjournald]
1051 root 20 0 0 0 0 S 0.0 0.0 0:00.19 [kauditd]
1054 root 20 0 12280 2020 1060 S 0.0 0.0 4:52.25 /bin/sh /etc/init.d/init.tfa run
1055 root 20 0 11380 992 988 S 0.0 0.0 0:00.00 /bin/sh /etc/init.d/init.ohasd run
1376 root 16 -4 91196 688 548 S 0.0 0.0 0:01.36 auditd
1401 root 20 0 237m 1372 688 S 0.0 0.0 0:00.55 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
1438 rpc 20 0 19020 572 512 S 0.0 0.0 0:01.21 rpcbind
1454 dbus 20 0 22168 1116 504 S 0.0 0.0 0:01.58 dbus-daemon --system
1464 root 20 0 81836 2508 1320 S 0.0 0.1 0:02.92 NetworkManager --pid-file=/var/run/NetworkManager/NetworkManager.pid
1467 root 20 0 55884 1016 808 S 0.0 0.0 0:00.05 /usr/sbin/modem-manager
1483 rpcuser 20 0 23392 736 732 S 0.0 0.0 0:00.00 rpc.statd
1517 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [rpciod]
1524 root 20 0 23136 140 140 S 0.0 0.0 0:00.00 rpc.idmapd
1574 root 20 0 44668 32 28 S 0.0 0.0 0:00.00 /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -B -u -f /var/log/wpa_supplican
1575 root 20 0 184m 644 644 S 0.0 0.0 0:00.00 cupsd -C /etc/cups/cupsd.conf
1615 haldaemo 20 0 26544 1604 988 S 0.0 0.0 0:02.65 hald
1616 root 20 0 18152 624 620 S 0.0 0.0 0:00.01 hald-runner
1697 root 20 0 20268 404 404 S 0.0 0.0 0:00.00 hald-addon-i
0
10
20
30
40
50
60
70
80
90
100
12:08:54
12:08:59
12:09:05
12:09:10
12:09:15
12:09:21
12:09:26
12:09:31
12:09:37
12:09:43
12:09:48
12:09:53
12:09:59
12:10:04
12:10:09
12:10:15
12:10:20
12:10:27
12:10:37
12:10:45
12:11:00
12:11:05
12:11:14
12:11:20
12:11:25
12:11:30
12:11:35
oraclesharedb1
ora_qmnc_sharedb1
ora_q003_sharedb1
/usr/bin/perl
/u01/app/11.2.0.4/grid/jdk/jre/bin/java
ora_q00i_sharedb1
ora_q009_sharedb1
ora_q005_sharedb1
ora_q00u_sharedb1
ora_q000_sharedb1
$ perl -ne '/^top - (dd:dd:dd)/ and $t=$1;print qq/$t $_/' top.log
出典: Perlワンライナー集
https://yohei-a.hatenablog.jp/entry/20150711/1436623390
CPUを使っている犯人の探し方
カーネル
ユーザープロセス
ユーザーモード
vmstat.us
カーネルモード
vmstat.sy
I/O待ち
%iowait
システムコール(%sys)
アイドル
(ひま)
%idle
割込み(%irq + %soft)
カーネルスレッド(%sys)
処理量が多い
特定のプロセスが消費
ドリルダウン
CPU使用率の内訳
vmstat(合計)
mpstat(CPU別)
sar(事例列推移)
システムコール
割込み
デバイスドライバ
出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/28
CPUを使っている犯人の探し方
ドリルダウン
CPU負荷が高い
ユーザー
プログラム
カーネルモードの
処理
システムコール
割込み
プロセス
CPUを消費してい
る処理を特定
システムコールの
種類特定する
割込みの種類を特
定する
vmstat の us
mpstat の %usr
sar の %user
vmstat の sy
mpstat の %sys
sar の %system
top の %CPU
vmstat の cs(参考レベル)
Perf
SystemTap
DTrace
pstack
perf
oprofile
SystemTap
DTrace
strace
sysdig
perf
カーネルスレッド
top の %CPU
CPUを消費してい
る処理を特定
pstack
perf
oprofile
SystemTap
DTrace
vmstat の in
mpstat の %irq、%soft
• mpstat はシステム全体のCPU使用率の内訳(ユーザー/カーネル/割込みなど)を分析する。
出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/31
$ free -m
total used free shared buffers cached
Mem: 7977 7763 214 0 7047 598
-/+ buffers/cache: 116 7860
Swap: 0 0 0
free
ページキャッシュ(解放可能)
ページキャシュは解放できるので実質
これだけのメモリが空いている
• Linux を始め多くのOSは空きメモリを活用して読んだファイルのデータをキャッシュして再利用する。
free
出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/50
使用中(実質)
cached
空き(実質) buffers
free
used
-/+ buffers/cache
$ free -m
total used free shared buffers cached
Mem: 7977 7763 214 0 7047 598
-/+ buffers/cache: 116 7860
Swap: 0 0 0
total
• free のイメージ図
見た目上の空き
アーキテクチャから見るページキャッシュ
出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/50
使用中
cached
空き buffers
free
used
-/+ buffers/cache
Linux kernel 2.4 以降、
Buffer Cache は Page
Cache に格納される
• 元々、Page Cache と Buffer Cache は別々に管理されていたが、Linux Kernel 2.4 以降は Buffer
Cache は Page Cache に格納されている。
共有メモリは cached に含まれる
• cached のうちダーティバッファは書くまで解放できない。
• 共有メモリも cached に含まれるが、共有メモリは解放できず、スワップアウト(ページアウト)する。
カーネル
buffer
cached
Page Cache
共有メモリ(System V IPC)
共有メモリ(/dev/shm)
Anonymous Pages
free
(-/+ buffers/cache)
①/proc/meminfo の MemTotal
②vmstat の used
free の used(-/+ buffers/cache)
③ipcs -um → pagesresident × 4KB
④df -k → tmpfs の Used
Huge Page は使用前はこ
こに含まれる
Huge Page は使用前はここ
に含まれる
RHEL5(クローン含む)まで
出典: https://yohei-a.hatenablog.jp/entry/20151205/1449326703
/proc/meminfo で空きメモリを楽に見れるように
• 空きメモリサイズ = /proc/meminfo の MemFree + Active(file) + Inactive(file)
• RHEL6.6以降は /proc/meminfo の MemAvailable や free の Available で見れる
• メモリ使用率 = 100 – 空きメモリサイズ ÷ /proc/meminfo の MemTotal
空き領域(free)
カーネル空間(Slab、KernelStack、PageTablesなど)
総メモリ容量
(/proc/meminfo の
MemTotal) buffer
cached
AnonPages
anon
file
active
inactive
active
inactive共有メモリ
Shmem
スワップされる(空けるとな
くなるためディスクに保存す
る必要がある)
共有メモリはファイルシステム
(tmpfs)として実装されているため、
cached に計上されるが、バッキング・
ストアがないため、ページ回収の際はス
ワップする必要があるため、anon のリ
ストで管理される。
RHEL6(RHELクローン含む)以降
出典: https://yohei-a.hatenablog.jp/entry/20151205/1449326703
ページキャッシュの歴史
15.1.1 Solarisページ・キャッシュ
Solarisでは、ファイル・システム・データをキャッシュするためにページ・キャッ
シュという新しい手法を採用している。このページ・キャッシュは、SunOS 4 で一
新された仮想メモリ・システムの一部として1985年にSunで開発され、System V
リリース4 UNIX でも採用された。現在では、LinuxやWindows NTでもこの手法を
採用している。
ページ・キャッシュには、従来のキャッシュと比べて2つの大きな違いがある。1つ
は、そのサイズを動的に変更でき、アプリケーションが使用していないすべてのメ
モリをキャッシュとして利用できる点である。もう一つは、ディスク・ブロックで
はなくファイル・ブロックをキャッシュしている点である。つまり、物理ブロック
に対するキャッシュではなく、仮想ファイルに対するキャッシュなのである。この
仮想ファイル・キャッシュによって、オペレーティング・システムはファイルとそ
のオフセットから簡単にファイル・データを取得することができる。これに対して
従来のブロック・キャッシュの方法では、オペレーティング・システムは、まず
ファイルに対応した物理ディスク・ブロック番号を見つけ出す必要があり、それか
ら物理ディスク・ブロック・キャッシュのデータを取得していた。これが、仮想
ファイル・キャッシュの方が効率的に処理できる理由である。
https://yohei-a.hatenablog.jp/entry/20090322/1237744536
iostat
• svctm が遅くなっているとストレージの問題
• svctm は平常時通りで IOPS が多く await が遅い場合はIO量が多いため
$ iostat -dx 5
Linux 4.14.62-65.117.amzn1.x86_64 (ip-172-17-3-15) 11/13/2019 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.04 0.31 0.10 75.32 4.30 192.71 0.00 1.49 0.75 0.03
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.40 1019.80 0.40 261068.80 6.40 255.91 1.92 1.89 0.98 100.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.00 978.40 0.00 250470.40 0.00 256.00 1.98 2.02 1.02 100.00
キュー待ちを含まない
1回のI/Oレイテンシ
ユーザープロセスから見たI/Oレイテ
ンシ(システムコールの応答時間)
r/s + w/s = IOPS
iostat
• svctm = service time (1回のI/Oをストレージで処理する時間)
• await = キュー待ち時間 + service time(ユーザープロセスから見たI/O待ち時間)
$ iostat -dx 5
Linux 4.14.62-65.117.amzn1.x86_64 (ip-172-17-3-15) 11/13/2019 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.04 0.31 0.10 75.32 4.30 192.71 0.00 1.49 0.75 0.03
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.40 1019.80 0.40 261068.80 6.40 255.91 1.92 1.89 0.98 100.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.00 978.40 0.00 250470.40 0.00 256.00 1.98 2.02 1.02 100.00
秘技:挟み撃ちの原則
• iostat の計測ポイントはカーネルのブロックレイヤー
• iostat で見ると遅く、strace で速い場合はその間でボトルネックが発生している
strace →
iostat →
iostat で速い場合は
ファイルシステムな
どカーネルの問題
カーネル空間内のボト
ルネック分析は perf や
ftrace などで可能
出典:Systems Performance: Enterprise and the Cloud [ISBN-10: 0133390098]
I/O性能問題の切り分け方法
ドリルダウン
I/O負荷が高い I/Oの量が多い
1回のI/Oが遅い
1回のI/Oが遅い原因を
調査する
スワップ発生
メモリを消費しているプ
ロセスを確認する
I/O量が増加した原因を
調査する
vmstat の si、
so
vmstat の bi、bo
iostat の r/s、w/s、avgqu-sz、svctm
など
iostat の r/s、w/s、avgqu-sz、
svctm など
top の %MEM
pmap
top
iotop
ストレージベンダーに調査依頼するなど(ストレージのキャッシュ
が切れてないか、ディスク間欠障害などが発生していないか)
出典:https://www.slideshare.net/yoheiazekatsu/linux-72826405/72
まとめ
出典:Wikipedia と http://danjo.city.kashiwa.lg.jp/gakushuu/pcschool/pc_history/comp_history09.htm
デヴィッド・カトラー
DECでVMS、MSで
Windows NT を開発。
NT-2000-XP-Vista-7-8
は全てNTの子孫。
ケン・トンプソン
ベル研究所でMulticsの開発
に参加後、UNIX、C言語、
正規表現などを開発。現在
はGoogleでGo言語の開発
などに携わっている
ビル・ジョイ
カリフォルニア大学バーク
レー校でBSD UNIX、vi、
csh などを開発。Sunでは、
NFS、SPARC プロセッサ、
Java の開発などで大きな役
割を果たした。
。BSD UNIX から
SunOS/Solaris などが生ま
れ、Mac OS XもBSDを
ベース。
リーナス・トーバルズ
アンドリュー・タネン
バウムのMinixに刺激を
受け、Linuxカーネルを
開発した。
基本原理は変わらない。本質を
理解していると新しい技術にも
すぐキャッチアップできる(物
理法則は変わらない!)
現在のOSの概念や基本部分(カーネル)の
技術の大半は、この1960年代に完成され
た。それらの技術は今もあなたが使ってい
る Windows 7、Linux、OS X、iPhone、
Android に引継がれている。”ls “コマンド
のルーツは Multics の “list segments” に
遡る。
Linuxカーネル開発者 小崎さんの言葉より
出典:https://employment.en-japan.com/engineerhub/entry/2019/11/28/103000
——1つひとつの決断が、非常に大きな意味合いを
持つのですね。最後に伺いたいのですが、近年、ク
ラウド技術や各種マネージドサービスの対等により、
「低レイヤの知識を知らなくても何とかなってしま
う時代」になりつつあるように感じます。そんな現
代だからこそ、低レイヤーの技術を学ぶ意義とは何
だと思いますか?
小崎 ただ動くアプリケーションを作るだけであれ
ば、確かに低レイヤの知識はあまりいらなくなって
きていると思います。ですが実際には、何かしらの
システムでトラブルや性能問題などが発生したとき、
低レイヤの知識を知らなければ問題を解決できませ
ん。
だから、低レイヤのことをちゃんとわかっている人
が不要になる世界は、今後も来ないと思うんですよ。
むしろ、そのスキルを持つ人の希少価値は上がって
いますから、キャリアとしての価値はより大きく
なっているように思いますね。
Q&A
出典:Wikipedia と http://danjo.city.kashiwa.lg.jp/gakushuu/pcschool/pc_history/comp_history09.htm
• 基本は全部 procfs にするの?
 性能情報取得コマンド実行時に strace -e open をかけて情報ソースを確認してみてください。
 基本的にOSの性能情報はOSカーネルのメモリの構造体で保持されています。procfs はユーザー空
間に情報提供するインタフェースです。
 UNIXには全てのものをファイルとして扱うという思想があります。procfs は元々、次世代UNIXと
してAT&Tベル研究所で開発された Plan 9 で生まれたもので、Linux だけでなく商用UNIXでも実
装されています。
• htop とかは思想的に大きく違うの?
 /proc 以下を参照しているだけという意味では変わらないと思います。より便利な機能がついてい
るので使い勝手は良いです。私は htop 愛用しています。
 pidstat はモダンですか?
 モダンですw できるだけ誰でも知っていてどの環境でも入ってそうなコマンドにしてみました。本
質的には考え方や理論がわかるとコマンドの使い方や見方も自然にできると思っていますが、抽象
的な話をしても刺さらないことが多いので逆にコマンドのみの説明をするというアプローチを試し
てみました。
Appendix
Appendix.1 使用環境
$ curl http://169.254.169.254/latest/meta-data/instance-type
t2.large
$ curl http://169.254.169.254/latest/meta-data/ami-id
ami-06cd52961ce9f0d85
$ cat /etc/system-release
Amazon Linux AMI release 2018.03
$ uname -r
4.14.62-65.117.amzn1.x86_64
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 79
Model name: Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping: 1
CPU MHz: 2299.802
BogoMIPS: 4600.08
Hypervisor vendor: Xen
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 46080K
NUMA node0 CPU(s): 0,1
Appendix.2 私のエンジニア人生に影響を与えた2冊
絵で見てわかるOS/ストレージ/ネットワーク 新装版
(ISBN: 4798158488)
詳解 システム・パフォーマンス
(ISBN:4873117909)
私が読んだ頃は旧版だった 私が読んだ頃はまだ日本語訳がなかった
Appendix.3 もっと体系的に、深堀りしたい方へ
• シンプルでシステマチックな Linux 性能分析方法
 https://www.slideshare.net/yoheiazekatsu/linux-72826405
• シンプルでシステマチックな Oracle Database, Exadata 性能分析
 https://www.slideshare.net/yoheiazekatsu/oracle-database-exadata
• Welcome to the Real World
 https://www.slideshare.net/yoheiazekatsu/dbts2012-unconference-wttrwyazekatsupublish
• iostatの見方
 https://www.slideshare.net/yoheiazekatsu/iostat
• よく使う strace のオプション
 https://yohei-a.hatenablog.jp/entry/20160612/1465701692
• strace の -y や -yy でFD番号と共にファイルパスやIPアドレス・ポート番号を表示する
 https://yohei-a.hatenablog.jp/entry/20160615/1466010160
• strace でシステムコールの所要時間を調べる
 https://yohei-a.hatenablog.jp/entry/20150111/1420957702
• sysdig でシステムワイドに実行回数が多いシステムコールを調べる
 https://yohei-a.hatenablog.jp/entry/20180114/1515916505
• perf + Flame Graphs で Linux カーネル内のボトルネックを特定する
 https://yohei-a.hatenablog.jp/entry/20150706/1436208007
• Java Mixed-Mode Flame Graphs で Java の CPU ネックをフルスタックで分析する
 https://yohei-a.hatenablog.jp/entry/20160506/1462536427
• funcgraph で Linux カーネル内のボトルネックをミクロに追跡する
 https://yohei-a.hatenablog.jp/entry/20150708/1436312890
• Perl ワンライナー集
 https://yohei-a.hatenablog.jp/entry/20150711/1436623390
Appendix.4 Watch しているエンジニア(性能関連)
• Brendan Gregg
 https://www.slideshare.net/brendangregg/lisa2019-linux-systems-performance
• Tanel Poder
 https://www.slideshare.net/tanelp/low-level-cpu-performance-profiling-examples
• Craig Shallahamer
 http://shallahamer-orapub.blogspot.com/2014/01/creating-tool-detailing-oracle-process.html
• Jens Axboe
 https://en.wikipedia.org/wiki/Jens_Axboe
• Yuto Hayamizu
• https://www.slideshare.net/hayamiz

More Related Content

What's hot

LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) Hironobu Isoda
 
オンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化するオンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化するKenkichi Okazaki
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Masayuki Ozawa
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)NTT DATA Technology & Innovation
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~NTT DATA OSS Professional Services
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングKosuke Kida
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話ichirin2501
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようShinsuke Sugaya
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことyoku0825
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会Shigeru Hanada
 
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話Rui Hirokawa
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsYoshiyasu SAEKI
 
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26Yahoo!デベロッパーネットワーク
 
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -Yahoo!デベロッパーネットワーク
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 

What's hot (20)

LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
 
オンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化するオンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化する
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
iostatの見方
iostatの見方iostatの見方
iostatの見方
 
Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once Semantics
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
 
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
 
Keystone fernet token
Keystone fernet tokenKeystone fernet token
Keystone fernet token
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 

Similar to Linux Performance Analysis in 15 minutes

システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5shingo suzuki
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Takenori Matsumoto
 
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)Naoto MATSUMOTO
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell scriptMasami Hiramatsu
 
シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法Yohei Azekatsu
 
200625material naruse
200625material naruse200625material naruse
200625material naruseRCCSRENKEI
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishYohei Azekatsu
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...
「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...
「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...Kenichiro MATOHARA
 
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれNGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれDNA Data Bank of Japan center
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
Java でつくる 低レイテンシ実装の技巧
Java でつくる低レイテンシ実装の技巧Java でつくる低レイテンシ実装の技巧
Java でつくる 低レイテンシ実装の技巧 Ryosuke Yamazaki
 
debugging server with strace
debugging server with stracedebugging server with strace
debugging server with straceYoshinari Takaoka
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件yaegashi
 
サーバ異常検知入門
サーバ異常検知入門サーバ異常検知入門
サーバ異常検知入門mangantempy
 
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎Insight Technology, Inc.
 
しょしんしゃのためのhello world
しょしんしゃのためのhello worldしょしんしゃのためのhello world
しょしんしゃのためのhello worldwata2ki
 
Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704HommasSlide
 

Similar to Linux Performance Analysis in 15 minutes (20)

システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5システムパフォーマンス勉強会#5
システムパフォーマンス勉強会#5
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門
 
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
 
シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法
 
200625material naruse
200625material naruse200625material naruse
200625material naruse
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...
「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...
「BluetoothでLinuxマシンとAndroidを繋いで話が出来るようにした話」「台風で停電になって省電力の設定をした話」「ネットワークの設定が引き...
 
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれNGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
Java でつくる 低レイテンシ実装の技巧
Java でつくる低レイテンシ実装の技巧Java でつくる低レイテンシ実装の技巧
Java でつくる 低レイテンシ実装の技巧
 
debugging server with strace
debugging server with stracedebugging server with strace
debugging server with strace
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
サーバ異常検知入門
サーバ異常検知入門サーバ異常検知入門
サーバ異常検知入門
 
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
 
しょしんしゃのためのhello world
しょしんしゃのためのhello worldしょしんしゃのためのhello world
しょしんしゃのためのhello world
 
R -> Python
R -> PythonR -> Python
R -> Python
 
Docker調査20150704
Docker調査20150704Docker調査20150704
Docker調査20150704
 

More from Yohei Azekatsu

Linux Process Snapper Introduction
Linux Process Snapper IntroductionLinux Process Snapper Introduction
Linux Process Snapper IntroductionYohei Azekatsu
 
CloudTrail ログの検索を爆速化してみた
CloudTrail ログの検索を爆速化してみたCloudTrail ログの検索を爆速化してみた
CloudTrail ログの検索を爆速化してみたYohei Azekatsu
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?Yohei Azekatsu
 
シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析Yohei Azekatsu
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪Yohei Azekatsu
 
私がPerlを使う理由
私がPerlを使う理由私がPerlを使う理由
私がPerlを使う理由Yohei Azekatsu
 

More from Yohei Azekatsu (6)

Linux Process Snapper Introduction
Linux Process Snapper IntroductionLinux Process Snapper Introduction
Linux Process Snapper Introduction
 
CloudTrail ログの検索を爆速化してみた
CloudTrail ログの検索を爆速化してみたCloudTrail ログの検索を爆速化してみた
CloudTrail ログの検索を爆速化してみた
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?
 
シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪
 
私がPerlを使う理由
私がPerlを使う理由私がPerlを使う理由
私がPerlを使う理由
 

Recently uploaded

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Recently uploaded (8)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

Linux Performance Analysis in 15 minutes

  • 1. JPOUG in 15 minutes #9 Linux Performance Analysis in 15 minutes Yohei Azekatsu Twitter: @yoheia 2019.12.04@月島
  • 2. お話すること • dstat、htop などモダンなツールや strace、sysdig、perf など深掘りする ツールを使わずに mpstat、top、free、iostat など古典的なツールを使った 基本的な Linux パフォーマンス分析手法を紹介します。 • できるだけ誰でも知っていてどの環境でも入ってそうなコマンドにしてみま した。 • 本質的には原理や手法を理解しているとコマンドの使い方や見方も自然にで きるという持論を持っていますが、抽象的な話をしても刺さらないことが多 いので逆にコマンドのみの説明をするというアプローチにしてみました。 • モダンなツールを使った分析や深堀りの仕方はまた機会がありましたらご紹 介します。
  • 3. はじめに • ほとんどのツールは /proc などを通じて Linux カーネルのメモリ構造体から 性能統計情報を読んで加工して表示しているテキスト加工・集計ツールです。 • Oracle Database で言うとV$ビューはX$表を参照していてその実態は共有メ モリの構造体を参照しているのと同じイメージ。
  • 4. 例えば vmstat を strace してみると $ vmstat -V procps version 3.2.8 $ strace -e open vmstat 5 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st open("/proc/meminfo", O_RDONLY) = 3 open("/proc/stat", O_RDONLY) = 4 open("/proc/vmstat", O_RDONLY) = 5 0 0 0 7860684 86812 129312 0 0 0 0 16 15 0 0 100 0 0 0 0 0 7860684 86812 129312 0 0 0 0 47 44 0 0 100 0 0 0 0 0 7860684 86812 129312 0 0 0 0 46 46 0 0 100 0 0 ^CProcess 16019 detached /proc/meminfo などを5秒間隔で読んで一つ前に読んだ値を引き算いて5秒間の平均 値を表示している。vmstat などで1行目の値を使うなというのはそのため。
  • 5. vmstat が参照している /proc/meminfo $ cat /proc/meminfo MemTotal: 8168820 kB MemFree: 7860328 kB MemAvailable: 7872576 kB Buffers: 86968 kB Cached: 129348 kB SwapCached: 0 kB Active: 195204 kB Inactive: 43972 kB Active(anon): 22860 kB Inactive(anon): 52 kB Active(file): 172344 kB Inactive(file): 43920 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 22852 kB vmstat が表示する free、buffers、cached、 swpd などの情報ソース
  • 6. vmstat が参照している /proc/stat $ cat /proc/stat cpu 9580 49 2384 87457700 910 0 533 2905 0 0 cpu0 3417 23 1011 43734769 867 0 3 1055 0 0 cpu1 6162 25 1372 43722930 43 0 529 1850 0 0 intr 14007564 41 9 0 0 385 0 0 0 2 0 0 0 86 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (中略) ctxt 13411592 btime 1572941486 processes 16303 procs_running 1 procs_blocked 0 softirq 13111825 0 3596184 2013398 1923467 0 0 23641 3587966 0 1967169 CPU時間の累積値 run queue と blocked の数
  • 7. /proc/stat の定義 cpu 10132153 290696 3084719 46828483 16683 0 25195 0 175628 0 cpu0 1393280 32966 572056 13343292 6130 0 17875 0 23933 0 The amount of time, measured in units of USER_HZ (1/100ths of a second on most architectures, use sysconf(_SC_CLK_TCK) to obtain the right value), that the system ("cpu" line) or the specific CPU ("cpuN" line) spent in various states: user (1) Time spent in user mode. nice (2) Time spent in user mode with low priority (nice). (中略) procs_running 6 Number of processes in runnable state. (Linux 2.5.45 onward.) procs_blocked 2 Number of processes blocked waiting for I/O to com‐ plete. (Linux 2.5.45 onward.) CPU時間の累積値 run queue に入っているプロセス の数(TASK_INTERRUPTIBLE) I/O待ちのプロセスの数 (TASK_UNINTERRUPTIBLE) http://man7.org/linux/man-pages/man5/proc.5.html
  • 9. vmstat がそんな実装になているから • CPU使用率は vmstat のオプションで指定したインターバルの平均値 • run queue や blocked はある瞬間の値 • 従って、run queue > vCPU数 なのにCPU使用率が100%でない、または逆 に run queue < vCPU数 なのにCPU使用率が高いということが起こりうる
  • 10. vmstat のソースを読むと static void new_format(void) { (中略) for(i=1;i<num_updates;i++) { /* main loop ////////////////// */ sleep(sleep_time); if (moreheaders && ((i%height)==0)) new_header(); tog= !tog; meminfo(); getstat(cpu_use+tog,cpu_nic+tog,cpu_sys+tog,cpu_idl+tog,cpu_iow+tog,cpu_xxx+tog,cpu_yyy+tog,cpu_zzz+tog, pgpgin+tog,pgpgout+tog,pswpin+tog,pswpout+tog, intr+tog,ctxt+tog, &running,&blocked, &dummy_1,&dummy_2); duse= cpu_use[tog]-cpu_use[!tog] + cpu_nic[tog]-cpu_nic[!tog]; dsys= cpu_sys[tog]-cpu_sys[!tog] + cpu_xxx[tog]-cpu_xxx[!tog] + cpu_yyy[tog]-cpu_yyy[!tog]; didl= cpu_idl[tog]-cpu_idl[!tog]; diow= cpu_iow[tog]-cpu_iow[!tog]; dstl= cpu_zzz[tog]-cpu_zzz[!tog]; http://procps.sourceforge.net/procps-3.2.8.tar.gz • vmstat.c インターバルの差分 特定の瞬間の値
  • 11. vmstat のソースを読むと void getstat(jiff *restrict cuse, jiff *restrict cice, jiff *restrict csys, jiff *restrict cide, jiff *restrict ciow, jiff *restrict cxxx, jiff *restrict cyyy, jiff *restrict czzz, unsigned long *restrict pin, unsigned long *restrict pout, unsigned long *restrict s_in, unsigned long *restrict sout, unsigned *restrict intr, unsigned *restrict ctxt, unsigned int *restrict running, unsigned int *restrict blocked, unsigned int *restrict btime, unsigned int *restrict processes) { static int fd; unsigned long long llbuf = 0; int need_vmstat_file = 0; int need_proc_scan = 0; const char* b; buff[BUFFSIZE-1] = 0; /* ensure null termination in buffer */ if(fd){ lseek(fd, 0L, SEEK_SET); }else{ fd = open("/proc/stat", O_RDONLY, 0); if(fd == -1) crash("/proc/stat"); } read(fd,buff,BUFFSIZE-1); http://procps.sourceforge.net/procps-3.2.8.tar.gz • proc/sysinfo.c /proc/stat を読んでいる
  • 12. dstat は Python で書かれている $ dstat -V Dstat 0.7.0 (以降略) $ file /usr/bin/dstat /usr/bin/dstat: Python script, ASCII text executable $ head -5 /usr/bin/dstat #!/usr/bin/python2.7 ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU Library General Public License as published by ### the Free Software Foundation; version 2 only https://github.com/dagwieers/dstat • dstat
  • 13. いくつかのLinuxコマンドの見方を紹介します • CPU - mpstat - top • Memory - free - /proc/meminfo • I/O - iostat
  • 14. mpstat $ mpstat -P ALL 5 Linux 4.14.62-65.117.amzn1.x86_64 (ip-172-17-3-15) 11/10/2019 _x86_64_ (2 CPU) (中略) 10:27:42 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 10:27:47 AM all 49.65 0.00 0.40 0.00 0.00 0.00 0.00 0.00 49.95 10:27:47 AM 0 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 99.80 10:27:47 AM 1 99.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 特定の vCPU で約100% システム全体では CPU使用率は約50% ユーザーモード カーネルモード 暇してる。最後にCPU 使ったプロセスはI/O待ち 割込み ソフトウェア割込み 他のゲストかHVにCPU を横取りされた 暇してる • mpstat でシステム全体のCPU使用率の内訳(ユーザー/カーネル/割込みなど)を分析する。
  • 15. mpstat $ mpstat -P ALL 5 (中略) 10:27:42 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 10:27:47 AM all 49.65 0.00 0.40 0.00 0.00 0.00 0.00 0.00 49.95 10:27:47 AM 0 0.00 0.00 0.20 0.00 0.00 0.00 0.00 0.00 99.80 10:27:47 AM 1 99.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 システム全体のCPU使用率は低くても、vCPU別 に見ると特定のvCPUだけ使用率が高い場合があ る。例えば、2vCPUのマシンでシステム全体の CPU使用率が50%の場合、CPU別に見ると、 1vCPUは100%で張り付いていることがある。 豆知識:On-CPUのスレッドが run queue に入 らないのは Solaris のみ。Windows、Linux、 AIX、HP-UXなどは On-CPU のスレッドも run queue に含まれる。 出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/24 https://yohei-a.hatenablog.jp/entry/20151220/1450610487 • mpstat でvCPU別のCPU使用率を分析する。
  • 16. top $ top -Hc -U ec2-user Tasks: 103 total, 3 running, 72 sleeping, 0 stopped, 0 zombie Cpu0 : 99.7%us, 0.3%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 99.0%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 8168820k total, 8042868k used, 125952k free, 7822220k buffers Swap: 0k total, 0k used, 0k free, 106896k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ P TIME WCHAN COMMAND 16478 ec2-user 20 0 105m 664 592 R 99.9 0.0 26:10.30 1 26:10 - yes 16492 ec2-user 20 0 126m 3396 3112 R 99.9 0.0 8:56.89 0 8:56 - perl -e while(1){$i++} 16543 ec2-user 20 0 15368 2240 1928 R 0.3 0.0 0:00.05 1 0:00 - top -Hc -U ec2-user 16265 ec2-user 20 0 117m 3916 2840 S 0.0 0.0 0:00.11 1 0:00 - sshd: ec2-user@pts/1 16266 ec2-user 20 0 112m 3384 2984 S 0.0 0.0 0:00.06 1 0:00 - -bash 16534 ec2-user 20 0 126m 3388 3076 S 0.0 0.0 0:00.00 0 0:00 hrtimer_n perl -e while(1){sleep(1000)} “1”を押下するとvCPU別に表示、”f”を押下すると表示列を増やせる 物理メモリ使用 サイズ(VIRTは 実際に使ってい るサイズではな い) 最後に使ったCPU番号 累積CPU時間 sleep時に呼ばれたカーネル関数 “c”オプションでコマンド表示 “H”オプションでスレッド表示 • top でどのプロセスがCPUを使っているか調べる。 1CPUの使用率 ステータス R: On CPU or ランキュー D: Disk Sleep S: Sleep
  • 17. top の出力結果を加工して時系列傾向分析 • top をバッチモードで実行してファイルに出力、CSV に変換して時系列の傾向を可視化 $ top -bc -d 1top - 12:08:54 up 20 days, 1:12, 10 users, load average: 4.62, 6.17, 6.16 Tasks: 351 total, 7 running, 344 sleeping, 0 stopped, 0 zombie Cpu(s): 51.7%us, 45.5%sy, 0.0%ni, 0.3%id, 0.2%wa, 0.0%hi, 1.7%si, 0.6%st Mem: 4104972k total, 3076880k used, 1028092k free, 9240k buffers Swap: 8385532k total, 1598312k used, 6787220k free, 1163316k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 14987 oracle 20 0 1476m 21m 20m R 27.1 0.5 4622:02 ora_qmnc_sharedb1 30079 oracle 20 0 1458m 95m 94m S 23.2 2.4 3869:49 ora_q003_sharedb1 9282 oracle 20 0 1456m 64m 64m S 3.9 1.6 471:45.36 ora_q01c_sharedb1 20642 oracle 20 0 1455m 63m 63m S 3.9 1.6 469:14.05 ora_q01b_sharedb1 24555 oracle 20 0 1455m 60m 60m S 3.9 1.5 539:35.26 ora_q000_sharedb1 24599 oracle 20 0 1456m 67m 66m R 3.9 1.7 467:57.12 ora_q004_sharedb1 24668 oracle 20 0 1459m 72m 68m S 3.9 1.8 528:19.15 ora_q009_sharedb1 24801 oracle 20 0 1457m 71m 68m S 3.9 1.8 469:24.25 ora_q00d_sharedb1 24972 oracle 20 0 1456m 69m 68m S 3.9 1.7 536:16.71 ora_q00h_sharedb1 24986 oracle 20 0 1455m 60m 59m S 3.9 1.5 531:50.28 ora_q00i_sharedb1 25105 oracle 20 0 1455m 62m 62m S 3.9 1.6 469:50.96 ora_q00l_sharedb1 25129 oracle 20 0 1456m 65m 64m S 3.9 1.6 470:35.82 ora_q00m_sharedb1 25278 oracle 20 0 1457m 68m 67m S 3.9 1.7 470:20.44 ora_q00q_sharedb1 25328 oracle 20 0 1455m 59m 59m S 3.9 1.5 543:32.96 ora_q00s_sharedb1 25371 oracle 20 0 1456m 61m 61m S 3.9 1.5 531:16.63 ora_q00t_sharedb1 25476 oracle 20 0 1457m 65m 65m S 3.9 1.6 528:18.89 ora_q00u_sharedb1 25660 oracle 20 0 1455m 63m 62m S 3.9 1.6 467:17.30 ora_q00w_sharedb1 27611 oracle 20 0 1455m 63m 62m S 3.9 1.6 466:30.37 ora_q010_sharedb1 28456 oracle 20 0 1456m 66m 63m S 3.9 1.7 466:30.15 ora_q014_sharedb1 29878 oracle 20 0 1455m 60m 59m S 3.9 1.5 540:15.48 ora_q005_sharedb1 1984 root 20 0 1146m 24m 14m S 1.9 0.6 103:23.97 /u01/app/11.2.0.4/grid/bin/ohasd.bin reboot 2549 root RT -5 887m 158m 62m S 1.9 4.0 388:37.52 /u01/app/11.2.0.4/grid/bin/ologgerd -M -d /u01/app/11.2.0.4/grid/crf/db/consdb112n1 5825 grid -2 0 1306m 4296 4164 S 1.9 0.1 336:10.59 asm_vktm_+ASM1 5843 grid 20 0 1315m 8656 7736 S 1.9 0.2 38:57.81 asm_lmon_+ASM1 6166 root 20 0 1181m 36m 18m S 1.9 0.9 165:44.51 /u01/app/11.2.0.4/grid/bin/crsd.bin reboot 6305 oracle 20 0 1456m 63m 63m S 1.9 1.6 475:39.25 ora_q016_sharedb1 6335 oracle 20 0 1455m 63m 62m S 1.9 1.6 469:22.68 ora_q017_sharedb1 7857 oracle 20 0 1456m 60m 60m S 1.9 1.5 541:25.79 ora_q01a_sharedb1 10910 oracle 20 0 1455m 63m 62m S 1.9 1.6 474:27.15 ora_q01d_sharedb1 21311 oracle 20 0 15208 1316 848 R 1.9 0.0 0:00.02 top -bc -d 1 24482 oracle 20 0 1459m 71m 70m R 1.9 1.8 468:10.14 ora_q006_sharedb1 24514 oracle 20 0 1456m 64m 64m S 1.9 1.6 466:55.69 ora_q001_sharedb1 24534 oracle 20 0 1455m 60m 60m S 1.9 1.5 538:40.52 ora_q007_sharedb1 24704 oracle 20 0 1456m 60m 60m S 1.9 1.5 523:07.36 ora_q00b_sharedb1 24733 oracle 20 0 1456m 66m 65m S 1.9 1.7 467:46.55 ora_q00c_sharedb1 24871 oracle 20 0 1456m 64m 63m S 1.9 1.6 466:18.69 ora_q00e_sharedb1 24890 oracle 20 0 1455m 60m 59m S 1.9 1.5 536:55.73 ora_q00f_sharedb1 24950 oracle 20 0 1456m 63m 63m S 1.9 1.6 467:32.91 ora_q00g_sharedb1 25063 oracle 20 0 1455m 63m 62m S 1.9 1.6 469:04.99 ora_q00j_sharedb1 25090 oracle 20 0 1454m 61m 60m S 1.9 1.5 467:56.07 ora_q00k_sharedb1 25155 oracle 20 0 1455m 65m 64m S 1.9 1.6 466:29.63 ora_q00n_sharedb1 25210 oracle 20 0 1455m 63m 62m S 1.9 1.6 467:35.19 ora_q00o_sharedb1 25255 oracle 20 0 1457m 70m 68m S 1.9 1.8 472:34.51 ora_q00p_sharedb1 25292 oracle 20 0 1457m 76m 76m S 1.9 1.9 468:52.91 ora_q00r_sharedb1 25734 oracle 20 0 1455m 60m 60m S 1.9 1.5 536:39.85 ora_q00x_sharedb1 27589 oracle 20 0 1457m 66m 64m S 1.9 1.7 466:57.24 ora_q00y_sharedb1 27600 oracle 20 0 1455m 60m 60m S 1.9 1.5 524:24.46 ora_q00z_sharedb1 27635 oracle 20 0 1457m 66m 65m S 1.9 1.7 470:39.90 ora_q019_sharedb1 27641 oracle 20 0 1456m 70m 69m S 1.9 1.8 467:07.28 ora_q011_sharedb1 27924 oracle 20 0 1456m 64m 64m R 1.9 1.6 467:15.43 ora_q012_sharedb1 27969 oracle 20 0 1457m 68m 68m R 1.9 1.7 466:36.72 ora_q013_sharedb1 1 root 20 0 19396 1052 868 S 0.0 0.0 0:05.77 /sbin/init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kthreadd] 3 root 20 0 0 0 0 S 0.0 0.0 4:12.11 [ksoftirqd/0] 4 root 20 0 0 0 0 S 0.0 0.0 0:15.73 [kworker/0:0] 6 root RT 0 0 0 0 S 0.0 0.0 20943:14 [migration/0] 7 root RT 0 0 0 0 S 0.0 0.0 0:09.43 [watchdog/0] 8 root RT 0 0 0 0 S 0.0 0.0 6399:26 [migration/1] 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/1:0] 10 root 20 0 0 0 0 S 0.0 0.0 4:09.11 [ksoftirqd/1] 11 root RT 0 0 0 0 S 0.0 0.0 0:09.11 [watchdog/1] 12 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [cpuset] 13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [khelper] 14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [netns] 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [xenwatch] 16 root 20 0 0 0 0 S 0.0 0.0 0:00.01 [xenbus] 17 root 20 0 0 0 0 S 0.0 0.0 0:02.62 [sync_supers] 18 root 20 0 0 0 0 S 0.0 0.0 0:00.07 [bdi-default] 19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kintegrityd] 20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kblockd] 21 root 20 0 0 0 0 S 0.0 0.0 0:56.26 [kworker/0:1] 22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [ata_sff] 23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [khubd] 24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [md] 25 root 20 0 0 0 0 S 0.0 0.0 1:09.75 [kworker/1:1] 26 root 20 0 0 0 0 S 0.0 0.0 0:01.64 [khungtaskd] 27 root 20 0 0 0 0 S 0.0 0.0 2:26.39 [kswapd0] 28 root 25 5 0 0 0 S 0.0 0.0 0:00.00 [ksmd] 29 root 20 0 0 0 0 S 0.0 0.0 0:00.46 [fsnotify_mark] 30 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [crypto] 35 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kthrotld] 36 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/u:1] 37 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [khvcd] 38 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kpsmoused] 349 root 20 0 0 0 0 S 0.0 0.0 1:32.56 [kjournald] 394 root 20 0 0 0 0 S 0.0 0.0 1:44.37 [flush-202:0] 440 root 16 -4 10888 624 312 S 0.0 0.0 0:16.76 /sbin/udevd -d 947 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kjournald] 1051 root 20 0 0 0 0 S 0.0 0.0 0:00.19 [kauditd] 1054 root 20 0 12280 2020 1060 S 0.0 0.0 4:52.25 /bin/sh /etc/init.d/init.tfa run 1055 root 20 0 11380 992 988 S 0.0 0.0 0:00.00 /bin/sh /etc/init.d/init.ohasd run 1376 root 16 -4 91196 688 548 S 0.0 0.0 0:01.36 auditd 1401 root 20 0 237m 1372 688 S 0.0 0.0 0:00.55 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 1438 rpc 20 0 19020 572 512 S 0.0 0.0 0:01.21 rpcbind 1454 dbus 20 0 22168 1116 504 S 0.0 0.0 0:01.58 dbus-daemon --system 1464 root 20 0 81836 2508 1320 S 0.0 0.1 0:02.92 NetworkManager --pid-file=/var/run/NetworkManager/NetworkManager.pid 1467 root 20 0 55884 1016 808 S 0.0 0.0 0:00.05 /usr/sbin/modem-manager 1483 rpcuser 20 0 23392 736 732 S 0.0 0.0 0:00.00 rpc.statd 1517 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [rpciod] 1524 root 20 0 23136 140 140 S 0.0 0.0 0:00.00 rpc.idmapd 1574 root 20 0 44668 32 28 S 0.0 0.0 0:00.00 /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -B -u -f /var/log/wpa_supplican 1575 root 20 0 184m 644 644 S 0.0 0.0 0:00.00 cupsd -C /etc/cups/cupsd.conf 1615 haldaemo 20 0 26544 1604 988 S 0.0 0.0 0:02.65 hald 1616 root 20 0 18152 624 620 S 0.0 0.0 0:00.01 hald-runner 1697 root 20 0 20268 404 404 S 0.0 0.0 0:00.00 hald-addon-i 0 10 20 30 40 50 60 70 80 90 100 12:08:54 12:08:59 12:09:05 12:09:10 12:09:15 12:09:21 12:09:26 12:09:31 12:09:37 12:09:43 12:09:48 12:09:53 12:09:59 12:10:04 12:10:09 12:10:15 12:10:20 12:10:27 12:10:37 12:10:45 12:11:00 12:11:05 12:11:14 12:11:20 12:11:25 12:11:30 12:11:35 oraclesharedb1 ora_qmnc_sharedb1 ora_q003_sharedb1 /usr/bin/perl /u01/app/11.2.0.4/grid/jdk/jre/bin/java ora_q00i_sharedb1 ora_q009_sharedb1 ora_q005_sharedb1 ora_q00u_sharedb1 ora_q000_sharedb1 $ perl -ne '/^top - (dd:dd:dd)/ and $t=$1;print qq/$t $_/' top.log 出典: Perlワンライナー集 https://yohei-a.hatenablog.jp/entry/20150711/1436623390
  • 19. CPUを使っている犯人の探し方 ドリルダウン CPU負荷が高い ユーザー プログラム カーネルモードの 処理 システムコール 割込み プロセス CPUを消費してい る処理を特定 システムコールの 種類特定する 割込みの種類を特 定する vmstat の us mpstat の %usr sar の %user vmstat の sy mpstat の %sys sar の %system top の %CPU vmstat の cs(参考レベル) Perf SystemTap DTrace pstack perf oprofile SystemTap DTrace strace sysdig perf カーネルスレッド top の %CPU CPUを消費してい る処理を特定 pstack perf oprofile SystemTap DTrace vmstat の in mpstat の %irq、%soft • mpstat はシステム全体のCPU使用率の内訳(ユーザー/カーネル/割込みなど)を分析する。 出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/31
  • 20. $ free -m total used free shared buffers cached Mem: 7977 7763 214 0 7047 598 -/+ buffers/cache: 116 7860 Swap: 0 0 0 free ページキャッシュ(解放可能) ページキャシュは解放できるので実質 これだけのメモリが空いている • Linux を始め多くのOSは空きメモリを活用して読んだファイルのデータをキャッシュして再利用する。
  • 21. free 出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/50 使用中(実質) cached 空き(実質) buffers free used -/+ buffers/cache $ free -m total used free shared buffers cached Mem: 7977 7763 214 0 7047 598 -/+ buffers/cache: 116 7860 Swap: 0 0 0 total • free のイメージ図 見た目上の空き
  • 22. アーキテクチャから見るページキャッシュ 出典: https://www.slideshare.net/yoheiazekatsu/linux-72826405/50 使用中 cached 空き buffers free used -/+ buffers/cache Linux kernel 2.4 以降、 Buffer Cache は Page Cache に格納される • 元々、Page Cache と Buffer Cache は別々に管理されていたが、Linux Kernel 2.4 以降は Buffer Cache は Page Cache に格納されている。
  • 23. 共有メモリは cached に含まれる • cached のうちダーティバッファは書くまで解放できない。 • 共有メモリも cached に含まれるが、共有メモリは解放できず、スワップアウト(ページアウト)する。 カーネル buffer cached Page Cache 共有メモリ(System V IPC) 共有メモリ(/dev/shm) Anonymous Pages free (-/+ buffers/cache) ①/proc/meminfo の MemTotal ②vmstat の used free の used(-/+ buffers/cache) ③ipcs -um → pagesresident × 4KB ④df -k → tmpfs の Used Huge Page は使用前はこ こに含まれる Huge Page は使用前はここ に含まれる RHEL5(クローン含む)まで 出典: https://yohei-a.hatenablog.jp/entry/20151205/1449326703
  • 24. /proc/meminfo で空きメモリを楽に見れるように • 空きメモリサイズ = /proc/meminfo の MemFree + Active(file) + Inactive(file) • RHEL6.6以降は /proc/meminfo の MemAvailable や free の Available で見れる • メモリ使用率 = 100 – 空きメモリサイズ ÷ /proc/meminfo の MemTotal 空き領域(free) カーネル空間(Slab、KernelStack、PageTablesなど) 総メモリ容量 (/proc/meminfo の MemTotal) buffer cached AnonPages anon file active inactive active inactive共有メモリ Shmem スワップされる(空けるとな くなるためディスクに保存す る必要がある) 共有メモリはファイルシステム (tmpfs)として実装されているため、 cached に計上されるが、バッキング・ ストアがないため、ページ回収の際はス ワップする必要があるため、anon のリ ストで管理される。 RHEL6(RHELクローン含む)以降 出典: https://yohei-a.hatenablog.jp/entry/20151205/1449326703
  • 25. ページキャッシュの歴史 15.1.1 Solarisページ・キャッシュ Solarisでは、ファイル・システム・データをキャッシュするためにページ・キャッ シュという新しい手法を採用している。このページ・キャッシュは、SunOS 4 で一 新された仮想メモリ・システムの一部として1985年にSunで開発され、System V リリース4 UNIX でも採用された。現在では、LinuxやWindows NTでもこの手法を 採用している。 ページ・キャッシュには、従来のキャッシュと比べて2つの大きな違いがある。1つ は、そのサイズを動的に変更でき、アプリケーションが使用していないすべてのメ モリをキャッシュとして利用できる点である。もう一つは、ディスク・ブロックで はなくファイル・ブロックをキャッシュしている点である。つまり、物理ブロック に対するキャッシュではなく、仮想ファイルに対するキャッシュなのである。この 仮想ファイル・キャッシュによって、オペレーティング・システムはファイルとそ のオフセットから簡単にファイル・データを取得することができる。これに対して 従来のブロック・キャッシュの方法では、オペレーティング・システムは、まず ファイルに対応した物理ディスク・ブロック番号を見つけ出す必要があり、それか ら物理ディスク・ブロック・キャッシュのデータを取得していた。これが、仮想 ファイル・キャッシュの方が効率的に処理できる理由である。 https://yohei-a.hatenablog.jp/entry/20090322/1237744536
  • 26. iostat • svctm が遅くなっているとストレージの問題 • svctm は平常時通りで IOPS が多く await が遅い場合はIO量が多いため $ iostat -dx 5 Linux 4.14.62-65.117.amzn1.x86_64 (ip-172-17-3-15) 11/13/2019 _x86_64_ (2 CPU) Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.00 0.04 0.31 0.10 75.32 4.30 192.71 0.00 1.49 0.75 0.03 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.00 0.40 1019.80 0.40 261068.80 6.40 255.91 1.92 1.89 0.98 100.00 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.00 0.00 978.40 0.00 250470.40 0.00 256.00 1.98 2.02 1.02 100.00 キュー待ちを含まない 1回のI/Oレイテンシ ユーザープロセスから見たI/Oレイテ ンシ(システムコールの応答時間) r/s + w/s = IOPS
  • 27. iostat • svctm = service time (1回のI/Oをストレージで処理する時間) • await = キュー待ち時間 + service time(ユーザープロセスから見たI/O待ち時間) $ iostat -dx 5 Linux 4.14.62-65.117.amzn1.x86_64 (ip-172-17-3-15) 11/13/2019 _x86_64_ (2 CPU) Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.00 0.04 0.31 0.10 75.32 4.30 192.71 0.00 1.49 0.75 0.03 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.00 0.40 1019.80 0.40 261068.80 6.40 255.91 1.92 1.89 0.98 100.00 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.00 0.00 978.40 0.00 250470.40 0.00 256.00 1.98 2.02 1.02 100.00
  • 28. 秘技:挟み撃ちの原則 • iostat の計測ポイントはカーネルのブロックレイヤー • iostat で見ると遅く、strace で速い場合はその間でボトルネックが発生している strace → iostat → iostat で速い場合は ファイルシステムな どカーネルの問題 カーネル空間内のボト ルネック分析は perf や ftrace などで可能 出典:Systems Performance: Enterprise and the Cloud [ISBN-10: 0133390098]
  • 29. I/O性能問題の切り分け方法 ドリルダウン I/O負荷が高い I/Oの量が多い 1回のI/Oが遅い 1回のI/Oが遅い原因を 調査する スワップ発生 メモリを消費しているプ ロセスを確認する I/O量が増加した原因を 調査する vmstat の si、 so vmstat の bi、bo iostat の r/s、w/s、avgqu-sz、svctm など iostat の r/s、w/s、avgqu-sz、 svctm など top の %MEM pmap top iotop ストレージベンダーに調査依頼するなど(ストレージのキャッシュ が切れてないか、ディスク間欠障害などが発生していないか) 出典:https://www.slideshare.net/yoheiazekatsu/linux-72826405/72
  • 30. まとめ 出典:Wikipedia と http://danjo.city.kashiwa.lg.jp/gakushuu/pcschool/pc_history/comp_history09.htm デヴィッド・カトラー DECでVMS、MSで Windows NT を開発。 NT-2000-XP-Vista-7-8 は全てNTの子孫。 ケン・トンプソン ベル研究所でMulticsの開発 に参加後、UNIX、C言語、 正規表現などを開発。現在 はGoogleでGo言語の開発 などに携わっている ビル・ジョイ カリフォルニア大学バーク レー校でBSD UNIX、vi、 csh などを開発。Sunでは、 NFS、SPARC プロセッサ、 Java の開発などで大きな役 割を果たした。 。BSD UNIX から SunOS/Solaris などが生ま れ、Mac OS XもBSDを ベース。 リーナス・トーバルズ アンドリュー・タネン バウムのMinixに刺激を 受け、Linuxカーネルを 開発した。 基本原理は変わらない。本質を 理解していると新しい技術にも すぐキャッチアップできる(物 理法則は変わらない!) 現在のOSの概念や基本部分(カーネル)の 技術の大半は、この1960年代に完成され た。それらの技術は今もあなたが使ってい る Windows 7、Linux、OS X、iPhone、 Android に引継がれている。”ls “コマンド のルーツは Multics の “list segments” に 遡る。
  • 31. Linuxカーネル開発者 小崎さんの言葉より 出典:https://employment.en-japan.com/engineerhub/entry/2019/11/28/103000 ——1つひとつの決断が、非常に大きな意味合いを 持つのですね。最後に伺いたいのですが、近年、ク ラウド技術や各種マネージドサービスの対等により、 「低レイヤの知識を知らなくても何とかなってしま う時代」になりつつあるように感じます。そんな現 代だからこそ、低レイヤーの技術を学ぶ意義とは何 だと思いますか? 小崎 ただ動くアプリケーションを作るだけであれ ば、確かに低レイヤの知識はあまりいらなくなって きていると思います。ですが実際には、何かしらの システムでトラブルや性能問題などが発生したとき、 低レイヤの知識を知らなければ問題を解決できませ ん。 だから、低レイヤのことをちゃんとわかっている人 が不要になる世界は、今後も来ないと思うんですよ。 むしろ、そのスキルを持つ人の希少価値は上がって いますから、キャリアとしての価値はより大きく なっているように思いますね。
  • 32. Q&A 出典:Wikipedia と http://danjo.city.kashiwa.lg.jp/gakushuu/pcschool/pc_history/comp_history09.htm • 基本は全部 procfs にするの?  性能情報取得コマンド実行時に strace -e open をかけて情報ソースを確認してみてください。  基本的にOSの性能情報はOSカーネルのメモリの構造体で保持されています。procfs はユーザー空 間に情報提供するインタフェースです。  UNIXには全てのものをファイルとして扱うという思想があります。procfs は元々、次世代UNIXと してAT&Tベル研究所で開発された Plan 9 で生まれたもので、Linux だけでなく商用UNIXでも実 装されています。 • htop とかは思想的に大きく違うの?  /proc 以下を参照しているだけという意味では変わらないと思います。より便利な機能がついてい るので使い勝手は良いです。私は htop 愛用しています。  pidstat はモダンですか?  モダンですw できるだけ誰でも知っていてどの環境でも入ってそうなコマンドにしてみました。本 質的には考え方や理論がわかるとコマンドの使い方や見方も自然にできると思っていますが、抽象 的な話をしても刺さらないことが多いので逆にコマンドのみの説明をするというアプローチを試し てみました。
  • 34. Appendix.1 使用環境 $ curl http://169.254.169.254/latest/meta-data/instance-type t2.large $ curl http://169.254.169.254/latest/meta-data/ami-id ami-06cd52961ce9f0d85 $ cat /etc/system-release Amazon Linux AMI release 2018.03 $ uname -r 4.14.62-65.117.amzn1.x86_64 $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 2 On-line CPU(s) list: 0,1 Thread(s) per core: 1 Core(s) per socket: 2 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 79 Model name: Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz Stepping: 1 CPU MHz: 2299.802 BogoMIPS: 4600.08 Hypervisor vendor: Xen Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 46080K NUMA node0 CPU(s): 0,1
  • 35. Appendix.2 私のエンジニア人生に影響を与えた2冊 絵で見てわかるOS/ストレージ/ネットワーク 新装版 (ISBN: 4798158488) 詳解 システム・パフォーマンス (ISBN:4873117909) 私が読んだ頃は旧版だった 私が読んだ頃はまだ日本語訳がなかった
  • 36. Appendix.3 もっと体系的に、深堀りしたい方へ • シンプルでシステマチックな Linux 性能分析方法  https://www.slideshare.net/yoheiazekatsu/linux-72826405 • シンプルでシステマチックな Oracle Database, Exadata 性能分析  https://www.slideshare.net/yoheiazekatsu/oracle-database-exadata • Welcome to the Real World  https://www.slideshare.net/yoheiazekatsu/dbts2012-unconference-wttrwyazekatsupublish • iostatの見方  https://www.slideshare.net/yoheiazekatsu/iostat • よく使う strace のオプション  https://yohei-a.hatenablog.jp/entry/20160612/1465701692 • strace の -y や -yy でFD番号と共にファイルパスやIPアドレス・ポート番号を表示する  https://yohei-a.hatenablog.jp/entry/20160615/1466010160 • strace でシステムコールの所要時間を調べる  https://yohei-a.hatenablog.jp/entry/20150111/1420957702 • sysdig でシステムワイドに実行回数が多いシステムコールを調べる  https://yohei-a.hatenablog.jp/entry/20180114/1515916505 • perf + Flame Graphs で Linux カーネル内のボトルネックを特定する  https://yohei-a.hatenablog.jp/entry/20150706/1436208007 • Java Mixed-Mode Flame Graphs で Java の CPU ネックをフルスタックで分析する  https://yohei-a.hatenablog.jp/entry/20160506/1462536427 • funcgraph で Linux カーネル内のボトルネックをミクロに追跡する  https://yohei-a.hatenablog.jp/entry/20150708/1436312890 • Perl ワンライナー集  https://yohei-a.hatenablog.jp/entry/20150711/1436623390
  • 37. Appendix.4 Watch しているエンジニア(性能関連) • Brendan Gregg  https://www.slideshare.net/brendangregg/lisa2019-linux-systems-performance • Tanel Poder  https://www.slideshare.net/tanelp/low-level-cpu-performance-profiling-examples • Craig Shallahamer  http://shallahamer-orapub.blogspot.com/2014/01/creating-tool-detailing-oracle-process.html • Jens Axboe  https://en.wikipedia.org/wiki/Jens_Axboe • Yuto Hayamizu • https://www.slideshare.net/hayamiz