はじめに
株式会社メディアテック所属の @mt-h2 です。
普段は OutSystems を利用したローコードでシステム開発を行っています。
今回は今までと打って変わり、現職につくまでずっとサーバを触ってきたので、忘れないようメモがてら昔々に対応していたサーバ障害時の調査に使用するコマンドをまとめたいと思います。
経歴
レンタルサーバ運営企業:サーバエンジニア...5年(オペレータに毛が生えた程度)
ゲーム開発企業:社内SE...10年(下流メイン、設計~リリースまで、たまに要件定義)
この15年の間、業務内容はその都度異なっていましたが、共通してオンプレサーバの構築・保守運用を行ってきました。
使用していたOSは主に以下を対応していました。
- FreeBSD
- Debian
- RHEL
- CentOS
- Ubuntu
- WindowsServer
経歴ではFreeBSDとCentOSが長くなりますが、今回はCentOSを対象に記載したいと思います。
※systemdに移行が始まる以前だったと記憶
クラウド流行以前の時代(VPS流行くらいまで)の記憶を掘り起こしたものになりますので、現行OSでは通用しない可能性があります。その点につきましてはご了承ください。
紹介するコマンドは LPIC-1 レベルとなります。
頻繁に使用していたコマンド
# grep -iE "warn|error|false"
grep
文字列から障害に関する文字列を絞り込む際に使用。
ざっくり確認したい時にとりあえず使用していました。
$ dmesg | grep -iE "warn|error|fail" checkfile
# dmesg
dmesg
kernelのリングバッファ確認。
システムに異常が発生している場合、大抵ここに障害内容が出力されています。
これもとりあえず調査に入ったら打っとけコマンド
$ dmesg
# w
w
ロードアベレージとログインユーザの確認。
これも最初にサッと実行して確認するもの。
ロードアレベージについては以下の記事で分かりやすく解説されています。
LoadAverage(ロードアベレージ)とは一体何者?
$ w
# top
top
稼働しているプロセスの確認。
Shift+M(メモリソート)、Shift+P(CPUソート)はよく使っていました。
-U オプションで特定ユーザに絞り込むこともできるので、ユーザが特定できている場合に使用すると便利。
$ top
$ top -U username
# ps auxww
ps
現在のプロセスを確認。
top コマンドはリアルタイムで画面バッファ分しか表示されませんが、ps コマンドは実行時のプロセス全てが確認可能。
$ ps auxww
オプションはmanを確認いただければと思いますが、よく聞かれたのが「ww」の部分。
ざっくり言うと、これを付けないと表示内容の一部が省略されます。なら「w」は1個でいいように見えますが、1個では長すぎるものはまだ省略されます。2個つけてようやく全て表示されます。謎仕様。
# netstat -ln
netstat
ネットワークの通信状況確認。
例えばsshに繋がらない問題があった時に、22ポート(デフォルト)でsshdが稼働しているか等を確認していました。
$ netstat -ln
# shutdown (-h/-r) now
shutdown
サーバの停止・再起動に使用。
-h が停止、-r がリブートです。
オプション間違いで誤って停止したりする事があるので、halt と reboot を使用した方が分かりやすいかもしれません。
$ shutdown -h now
$ shutdown -r now
必要に応じて使用していたコマンド
# tail
tail
ファイル末尾を確認。
例えば dmesg を確認する際に、最後の方の出力だけ確認したい場合は以下のようにして一部だけ確認していました。
$ dmesg | tail
また、-F オプションを利用すると新しく入力された内容をリアルタイムで出力し続けれるので、特定のログ出力をリアルタイムで確認したい時にも便利。
$ tail -F /var/log/messages
# kill -KILL
kill
特定のプロセスを落とす時に使用。KILLは強制的(Force)に落とすので、ゾンビプロセスを落とす時に使用していました。
$ kill -KILL 12345
特定のプロセスを全て落としたい時は、killall も便利。
$ killall apache
# init 1
init
シングルユーザモードに移行。
コマンド応答があり、かつシングルユーザモードで操作する必要が出た場合、リブートせずこのコマンドでシングルユーザモードの移行できます(当時は telinit を使用していた気がする…)
$ init 1
# ifconfig
ifconfig
ネットワークインタフェース設定を確認。
ネットワーク速度が遅い・そもそもネットワークに繋がらないなどの状況で使用。設定がおかしくなっていたり(例えば何故かHalfDuplexになっていた速度が遅くなっていた等)を確認できます。
$ ifconfig
用途別に使用していたコマンド
# jstat
jstat
JVMのデータを確認できます。
当時 Java で開発したツールを1か月稼働させると heap 領域で OOM が発生しており、jstat を利用して解放されないオブジェクトの特定を行いました。
$ jstat
# dd
dd
if/ofを指定してデータをコピー。
障害が発生したディスクの内容を調査する為、他のディスクにデータコピーする際に使用していました。
オプションも充実しており、Seek Error が発生しているブロックは飛ばす等も可能であった(はず)
$ dd if=<壊れたディスク> of=<コピー先ディスク>
後は廃止サーバのディスク初期化に使用したりもしました。
※ 効率が悪いのと信頼性の関係で DBAN に移行しました
よく確認していたファイル
# /var/log/messages
/var/log/messages
システムに関するログ。とりあえず見るリストの1つ。
# /var/log/secure
/var/log/secure
認証・セキュリティに関するログ。とりあえず見るリストの1つ。
あとがき
今回はいにしえの記憶を辿って CentOS の障害調査に使用していたコマンド類を洗い出してみました。
こう見ると調査時に使用していたもの・調査方法はある程度お決まりのパターンで実施していたんだなと思いました。
他にも tcpdump や iptables も割と使っていた記憶があります。
特に iptables は外部サービスの国別IPを自動で弾く設定をしている事があり、設定の参照サーバの疎通が途絶えるとホワイトリストが空っぽになり誰もアクセスできなくなります。これにより iptables の修正対応をする事がよくありました。
現職についてからはサーバを触る機会がめっきり無くなりましたが、クラウドサーバをまともに触れたことがないの勉強していこうと思います。
さいごに
株式会社メディアテックでは絶賛 開発メンバを募集中 です。
ローコード開発だけではなく、RPAやBIエンジニア諸々多数の募集をしておりますので、みなさまのご応募をお待ちしております。