DevOps Troubleshooting: Linux Server Best Practiceを読んでいました。この本、Linuxでトラブルシューティングする人にはとてもお勧めです。他のOSに普段触る人でも、ここで基本的な部分を押さえれば、応用が効かせられるようになるはず!!!とてもお勧め!
この本の立ち位置
冒頭部分で次のように書かれています:
What makes this book more than just a sysadmin troubleshooting guide is the audience and focus. This book assumes the reader may not be a Linux sysadmin, but instead is a talented developer or QA engineer in a DevOps organization who may not have much system-level Linux experience.
要するにシステム管理者を読者としては想定せず、開発者・QAの人間を読者として位置付けている。この特殊な立ち位置がこの本をとても興味深くしていると思う。
問題の切り分け方について
こんなことが書いてあった:
- Divide the problem space
- Practice good communication when collaborating
- Favor quick simple tests, over slow, complex tests
- Favor past solutions
- Document your problems and solutions
- Know what changed
- Understand how system works
- Use the internet, but carefully
- Resist rebooting
Why is server slow?
Load Averageが高い場合には要因が三つ考えられる:
- CPU-bound
- RAM-bound (high RAM usage)
- I/O-bound (Disk or Network)
通常、CPUバウンドの時の方がI/Oバウンドの時よりもレスポンスが良い傾向にある。
topコマンドについて
負荷が高い場合にまずはtop
コマンドで解析を行う。top
コマンドの出力例はこちら:
まずはロードアベレージを確認する。ロードアベレージが適切かどうかは、CPUのコア数などによって異なる。コア数はcat /proc/cpuinfo | grep processor | wc -l
で調べる。ロードアベレージがコア数の範囲であれば適切と判断できる。
CPU(s)
の部分の読み方は以下の通り:
us: user CPU time
Nice値を変更していないユーザプロセスに対して割り当てられているCPU時間の割合。
sy: system CPU time
カーネルとカーネルプロセスを実行するために割り当てられているCPU時間の割合。
ni: nice CPU time
Nice値を変更したプロセスに対して割り当てられているCPU時間の割合。
id: CPU idle time
この値が高い場合CPUバウンドではない。
wa: I/O wait
I/O待ちをするために割り当てられているCPU時間の割合。この値が低い場合には、ディスク・ネットワークI/Oに起因して負荷が高まっているわけではないと言える。
hi: hardware interrupts
ハードウェアの割り込みに割り当てられているCPU時間の割合。
si: software interrupts
ソフトウェアの割り込みに割り当てられているCPU時間の割合。
st: steal time
ゲストOS内でtop
コマンドを実行している場合、この数値から他のタスクに割り当てられたために利用できなくなったCPU時間の割合がわかる。
Why can't I Write to the Disk
ディスク使用量の調査には、du -ckx
を使う。
df -h
でディスク使用量を確認して異常が見当たらない場合は、inodeの枯渇を疑う。inodeが枯渇しているかどうかは、df -i
コマンドで確認できる。
read-onlyになる原因は以下のものがかんがえられる:
- 容量の枯渇
- inodeの枯渇
- マウントオプションなどで read-only を指定している
- Linux Software RAIDを使用している場合、RAID障害の可能性を考慮する
Is the server down?
サーバがダウンしているように見える場合の対応方法について:
- ケーブルが刺さっているか
- インターフェースの設定は正しいか?
- Default Gatewayの設定は適切か?
- DNSは動いているか?
- 対象サーバに到達できるか?
- リモートポートが開放されているか?
- リモート側で
netstat -lnp
やiptables -L
してみる
ethtool デバイス名
でケーブルにつながっていることを確認できる。ifconfig デバイス名
でインターフェースの設定を確認できる。route -n
でDefault Gatewayを確認できる。DNSの動作はnslookup
で確認する。resolv.conf
のsearchの設定値に注意する。対象サーバに到達できるかかどうかはtraceroute
で確かめる。