CPU使用率が高い原因を探る方法

◼︎ 目次

  1. 概要
  2. 調査

◼︎ 概要

CPU使用率が高い場合にその原因を調べる
運用でたまに使うコマンド②
運用でたまに使うコマンド③
で紹介したmpstatとperfを使って調べる

◼︎ 調査

あれ?ちょっとCPU高い気がする

// 5秒間隔で3回負荷を取得する
$ sar 5 3

20時44分07秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
20時44分12秒     all     14.80      0.00     85.20      0.00      0.00      0.00
20時44分17秒     all     14.44      0.00     85.56      0.00      0.00      0.00
20時44分22秒     all     14.08      0.00     85.92      0.00      0.00      0.00
平均値:      all     14.43      0.00     85.57      0.00      0.00      0.00
 

processer 0の負荷が高い?(サーバによってはprocesserが複数あったりする 0と1など)
%sysが80%以上なので負荷が高い…
(もし%ideleの数値が高い場合は何か待たされてる可能性がある)

$ mpstat -P ALL 2 3

20時44分59秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
20時45分01秒  all   14.50    0.00   85.50    0.00    0.00    0.00    0.00    0.00    0.00
20時45分01秒    0   14.50    0.00   85.50    0.00    0.00    0.00    0.00    0.00    0.00

20時45分01秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
20時45分03秒  all   14.00    0.00   86.00    0.00    0.00    0.00    0.00    0.00    0.00
20時45分03秒    0   14.00    0.00   86.00    0.00    0.00    0.00    0.00    0.00    0.00

20時45分03秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
20時45分05秒  all   14.50    0.00   85.50    0.00    0.00    0.00    0.00    0.00    0.00
20時45分05秒    0   14.50    0.00   85.50    0.00    0.00    0.00    0.00    0.00    0.00
 

CPU番号が0のものでCPU使用率が高い関数を調べる
writeのシステムコールが多い?

$ sudo perf top -C 0
  19.34%  [kernel]           [k] system_call_after_swapgs
  12.91%  libc-2.12.so       [.] __write_nocancel
   9.95%  [kernel]           [k] vfs_write <- これ
   9.18%  [kernel]           [k] __audit_syscall_exit
   5.06%  [kernel]           [k] audit_syscall_entry
   4.32%  [kernel]           [k] fget_light
   3.31%  [kernel]           [k] sys_write <- これ
   3.05%  [kernel]           [k] rw_verify_area
   2.87%  [kernel]           [k] unroll_tree_refs
   2.83%  [kernel]           [k] selinux_file_permission
   2.74%  [kernel]           [k] fsnotify

writeしているプロセスといえば…
プロセス毎のディスクI/Oを調べる

$ find /proc/ -name io 2> /dev/null | sudo xargs egrep "write|read" 2> /dev/null | sort -n -k 2
...
/proc/237/task/237/io:write_bytes: 436686848
/proc/10371/io:write_bytes: 556797952
/proc/10371/task/10371/io:write_bytes: 556797952
/proc/10363/io:write_bytes: 595222528
/proc/1/io:write_bytes: 1039634432
/proc/2152/task/2152/io:write_bytes: 1075671040

後は/proc/数字/の数字の部分がどんなプロセスなのかを確認する

$ ps aux | grep -v grep |grep 10363
apache    10363  0.0  1.5 494240  7320 ?        S    11:22   0:00 /usr/sbin/httpd
 

DBだったりapacheだったり可能性は色々ある
プロセスがわかったらそのプロセスを無くすことはできないか、DBだったらチューニングなどできないかを考える

一概にもこれで100%わかるとは言えないがこういうやり方もあるということを覚えておくと吉


Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です