◼︎ 概要
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%わかるとは言えないがこういうやり方もあるということを覚えておくと吉
コメントを書く
コメント一覧