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

Published: 2016年2月23日 by tomsato

◼︎ 概要

CPU使用率が高い場合にその原因を調べる
Linuxサーバー保守運用時にたまに使うコマンド pstack,strace,pstree,mpstat Linuxサーバー保守運用時にたまに使うコマンド perf,tcpdump,ngrep,lsof で紹介した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%わかるとは言えないがこういうやり方もあるということを覚えておくと吉

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧