原因調査用Linuxコマンド
サーバの動作に異常が発生した際に原因を探るためのLinuxコマンドで、自分用のメモです。
全てmanとかググったら出てくるので説明は適当です。思いついたら後で追記していくかもです。
対象はDebian Squeezeになります。
全てパッケージインストールできるもので、パッケージ名は [in packagename] としてあります。
各所よりコメントありがとうございます。
良さ気なコマンドは追記していきます。
<追加したコマンド>
* telnet (+コメント wget, netcat)
* arp (+コメント arpwatch)
* pstree
* fdisk コメントに gdisk
* host, dig
* watch
* reboot
良さ気なコマンドは追記していきます。
<追加したコマンド>
* telnet (+コメント wget, netcat)
* arp (+コメント arpwatch)
* pstree
* fdisk コメントに gdisk
* host, dig
* watch
* reboot
コマンド追加により縦長になったので目次を追加しました
目次
プロセス系
Disk I/O系
Network系
DNS系
OS系
ガチンコデバッグ系
性能計測
補助ツール
解決力に関わる要素
プロセス系
ps [in procps]
プロセスの表示。1 2 3 4 5 6 | # とりあえず診る # 実際に使用しているメモリ容量であるRSS列が大事 psaxwu # プロセス名の確認 ps-Cprocname |
pstree [in psmisc]
プロセスの親子関係をツリー表示。1 2 3 4 5 | # -u でユーザ名をつけて表示 pstree-u # -p はまとまり解除されるけどPIDつく pstree-u-p |
top [in procps]
心の友。医師の触診と同じ。1 2 3 4 5 6 7 | # とりあえず診る top-d1 # 全出力を2秒毎10回。ログ用 top-bH-d2-n10 # 出力中に f で出力内容の変更 |
lsof [in lsof]
プロセスが開いているファイルのリストとか。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # プロセスIDで表示 lsof-p12345 # ユーザで表示 lsof-uyarn # プロセス名で表示 lsof-cjava # ファイルやパーティションで指定 lsof/bin/bash lsof/var # LISTENしてるプロセスを表示 lsof-i:80 |
vmstat [in procps]
topの簡易表示的な。最近はContextSwitchとか診る時以外あんま使わない。1 2 3 4 5 | # とりあえず診る vmstat1 # ディスクステータス vmstat-d110 |
pidstat [in sysstat]
プロセス毎に色々表示。1 2 3 4 5 6 7 8 9 10 | # CPU pidstat210 # メモリ pidstat-r210 # DiskI/O pidstat-d210 # -l でコマンド名を全表示 |
mpstat [in sysstat]
CPU情報表示。1 2 3 4 5 | # 合計 mpstat210 # スレッド毎 mpstat-PALL210 |
dstat [in dstat]
色々カラフルに表示。1 2 | # 全部表示 dstat-Tclmdrn |
/proc/$PID/
プロセス毎の色んな情報。1 2 | # ulimitの設定 cat/proc/12345/limits |
Disk I/O系
df [in coreutils]
パーティションとかディスク容量確認。1 2 | # とりあえず診る df-Th |
iotop [in iotop]
プロセス毎にDiskI/Oを表示。1 2 3 4 | # 2秒毎 iotop-d2 # 表示中に←→でソート項目変更 |
iostat [in sysstat]
デバイス毎にDiskI/Oを表示。1 2 3 4 5 | # 標準 iostat210 # 色々表示 iostat-x210 |
Network系
ping [in procps]
ご挨拶。死活確認とかルーティング確認とか。1 2 | # -n で逆引きしないとか -i で間隔とか pinggoogle.co.jp-n-i2 |
ifconfig [in net-tools]
ネットワークインターフェースの表示とか設定。1 2 | # eth, peth, vlan あたりの確認が主 /sbin/ifconfig-a |
ip [in iproute]
割り当てアドレスの表示。1 2 3 4 5 | # 全部表示 ipaddrshow # VIPなど2つ目以降を表示 ipaddrshowdeveth0scopeglobalsecondary |
route [in net-tools]
経路の表示とか設定。1 2 3 4 5 6 7 8 | # 表示。主にDefaultG/Wの確認だが、FORWARDとかVPNの時に活躍 # ネットワーク死んでる時は -n で逆引きしない /sbin/route-n # DefaultG/W 追加と削除 # 通常の経路は default じゃなく -net 10.1.0.0/24 とか /sbin/routeadddefaultgw10.0.0.254 /sbin/routedeldefaultgw10.0.0.254 |
traceroute [in traceroute]
通信経路の確認。ここ数年、使った覚えない・・・1 2 | # 逆引きしない場合 traceroute-ngoogle.co.jp |
mtr [in mtr-tiny]
通信経路の継続表示。どこで、どのくらいの品質なのかまでわかる。mtrパッケージだとX11用途と不要なので mtr-tiny で十分。
1 2 | # 逆引きしない場合 mtr-ngoogle.co.jp |
netstat [in net-tools]
ネットワーク接続情報を表示。TCP/UDP のポート見たり、FIN_WAIT とか CLOSE_WAITの量を見たり。
1 2 | # 全部見る netstat-an |
tcpdump [in tcpdump]
パケットがちゃんと行ったり来たりしてるか確認。FORWARD関連で大活躍1 2 3 4 | # -i に eth0 とか指定したり any で全部 # -n で逆引きしない # あとは適当に and と or で色々指定 tcpdump-iany-nport80andicmpandnotvrrp |
iptables [in iptables]
iptablesでファイヤーウォール作ってる場合はパケット数とかDROP見る。1 2 3 4 5 | # iptablesの設定見る iptables-L-v-n iptables-L-v-n-tnat # あとはDROPログ見たり新しいの通したり |
arp [in net-tools]
Pingを返さないサーバの確認や、IPアドレス重複事件の解決に。1 2 3 4 5 | # arpテーブルでIPアドレスとMACアドレスを確認する arp # 他の手段として、どこかにarpwatchサービスを起動しておくと # ネットワーク上の新規サーバやMACアドレス変更を常に把握できる |
telnet [in telnet]
サーバと密なお話。HTTPだけならnetcatやwgetもアリ。1 2 3 4 5 | # 手入力でヘッダ書いてHTTPリクエストを送る telnetgoogle.co.jp80 # メールサーバ構築とか調査では直接お話しすると早く分かり合えることも telnetmailserver25 |
DNS系
host [in bind9-host]
正引き。nslookupよりこっち使う。1 2 3 4 5 | # 普通に名前解決 hostgoogle.co.jp # DNSサーバの指定もできる。しなければ /etc/resolv.conf hostgoogle.co.jp8.8.8.8 |
dig [in dnsutils]
高機能な名前解決など。1 2 3 4 5 6 7 8 9 10 11 | # 基本はAレコード diggoogle.co.jp # 全レコード取得したり、DNSサーバを指定したり。メールだとTXT大事 diggoogle.co.jpany@8.8.8.8 # ルートサーバから引く。新ドメインやレコード変更反映の確認時に diggoogle.co.jpany+trace # 逆引き。メールを受信してもらう際のフィルタリング回避などで dig-x8.8.8.8 |
OS系
sysctl [in procps]
OSのチューニング的な。1 2 3 4 5 6 | # 現在の設定を表示 /sbin/sysctl-a # 再設定 vim/etc/sysctl.conf sysctl-p |
mount [in mount]
マウントオプション見たり。1 2 3 4 5 6 7 | # 現在の表示 mount-l # オプション反映 # 稼働中にやる場合は怖いけどビビったら負け vim/etc/fstab mount-oremount/var |
fdisk [in util-linux]
デバイスやパーティション情報の表示が主。2TB以上のGPTだと gdisk を使いたいが >= squeeze-backports
1 2 | # 全部みる。 fdisk-l |
ulimit [shell builtin]
ユーザごとの色んな制限。1 2 3 4 5 6 | # 現在のユーザの設定表示 ulimit-a # 設定する vim/etc/security/limits.conf ls/etc/security/limits.d/*.conf |
/proc/
1 2 3 4 5 | # CPU情報 less/proc/cpuinfo # メモリ情報 less/proc/meminfo |
reboot [in sysvinit]
OS再起動したら直る、という結論が負け犬かどうかは貴方次第。1 2 | # 最終奥義発動 reboot |
ガチンコデバッグ系
strace [in strace]
処理の詳細なトレース。1 2 | # -tt で時分秒にマイクロ秒までつけて -o でファイルに結果を保存 strace-iTvtt-o/tmp/strace.logdate |
sar [in sysstat]
色んなシステム情報の取得。1 2 3 | # バイナリで残る結果を、閲覧する sar-o/tmp/sar.bin230 sar-f/tmp/sar.bin-A|less |
性能計測
fio [in fio]
I/O性能計測。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | mkdir/tmp/fio-test/ # ワンライナー fio--name=test--directory=/tmp/fio-test/--direct=1--rw=randwrite\ --bs=16k--size=1G--group_reporting--numjobs=1 # 設定ファイル形式 vim/tmp/fio.txt ------------- [test] directory=/tmp/fio-test/ direct=1 rw=randwrite bs=16k size=1G group_reporting=1 numjobs=1 ------------- fio/tmp/fio.txt |
snmpwalk [in snmp]
snmpdから直接値を取得。1 2 3 4 5 6 7 8 9 10 11 12 | # OIDの確認などのため全表示 snmpwalk-On-cpublic-v2clocalhost.1|less # いちいちグラフ生成を待ちたくない時のワンライナー例 # user CPU name="userCPU";second=30;community=public\ oid=".1.3.6.1.4.1.2021.11.50.0";\ start=`snmpwalk-c$community-v2clocalhost$oid|sed-e"s/.*Counter32: //g"`;\ sleep$second;\ end=`snmpwalk-c$community-v2clocalhost$oid|sed-e"s/.*Counter32: //g"`;\ result=`expr$end-$start`;output=`expr$result/$second`;\ echo"$name : $output" |
補助ツール
watch [in procps]
定期的なプログラムの実行。1 2 3 4 5 | # 結果保存やtopのようなディスプレイ表示ができないコマンドを実行し続ける watchpswu-umysql # 間隔秒を指定したり、実行コマンド全体を文字列にしてリダイレクト保存したり watch-n1"ps wu -u mysql >> /tmp/watch.log" |
解決力に関わる要素
根気
諦めないその精神と、それを持続するためのブドウ糖。経験
何を知り、何を調べ、どう詰め寄るかの効率的なスケジューリング。閃き
たまには当てずっぽうで検証して原因を特定したり、仮定から逆詰めしたり。相談
人に相談しようと内容を整理して説明している途中で解決できちゃうテディベア現象。睡眠
ギブアップ一歩手前で30分くらい寝て、起きてみるといきなり解決できること多し。これらのコマンドを駆使して、発生タイミングや条件を探して異常値と原因を特定していくだけの簡単なお仕事です。
問題の整理から原因の特定まではかったるい作業だけど、
解決に至った時の達成感はエンジニアの至福!!

