こんにちは。都立産業技術高等専門学校の黒畑です。 この度は、2週間インターンシップに参加させていただきましたので体験したことや学んだことなどを紹介したいと思います!
はじめに
私は、都立産業技術高等専門学校 電子情報工学コース4年の黒畑です。 今回のインターンに参加したのは、もともとネットワークインンフラやMSP事業に興味があったことからハートビーツの存在を知り参加させていただきました。
2週間の流れ
1週目は主に障害の原因について考え、そこであがった原因を確認するためのコマンドを調べました。 実際に行ったことの例としては、LAMP環境でWebページが見れなくなった原因について考えました。
2週目は実際にLAMP環境の構築されたサーバ上で様々な障害が起きるので、Nagiosのアラートメールを確認しアラート対応手順書などを使って障害対応を行いました。
その他にも初日には、インターンの概要やハートビーツの会社についての説明をしていただきました。 2日目は藤崎社長からハートビーツ創業から未来についてのお話もしていただきました。
デスクの環境
デスクには、液晶ディスプレイと箱ティッシュが置いてありました。 個人的に感激したのが、液晶ディスプレイが4Kだったことです!!! 視認性がとてもよかったので作業もはかどりました!
第1週 原因調査
まず1週目では障害の原因について考えました。 これまでの人生の中で自分で作ったLAMP環境などでは、上で挙げた例のようにWebページが見れなくなった原因の大抵はPHPのコーディングミスやポートの開け忘れ、Apacheのサービスが停止していたりといったことが多かったのであまりそれ以外の原因は考えてきませんでした。
しかし実際にはWebページが見れない原因には様々な種類のものがあるのだなと、いまさらながら考えさせられました。
一例としては、ApacheにMPMとしてpreforekの設定がされているとした時に、大量アクセスが来て子プロセスがMaxClientsまで増加するとWebページが見づらくなったりします。 そのような状況を確認するためのコマンドも社内にある技術書やインターネットで調べました。
実際に使ったコマンドでApacheのプロセスを知りたい時には、
$ ps auxf | grep '[h]ttpd'
root 6832 0.0 0.4 275056 9264 ? Ss Sep10 0:16 /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
root 6834 0.0 0.0 31820 1172 ? S Sep10 0:00 \_ /usr/sbin/rotatelogs /var/log/httpd/error_log.%Y%m%d 86400 540
root 6836 0.0 0.0 31820 1224 ? S Sep10 0:47 \_ /usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540
apache 2924 0.0 0.3 275188 6860 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3009 0.0 0.3 275188 6864 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3085 0.0 0.3 275188 6860 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3147 0.0 0.3 275188 6848 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3152 0.0 0.3 275188 6860 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3157 0.0 0.3 275188 6860 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3203 0.0 0.3 275188 6860 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3207 0.0 0.3 275188 6856 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 3233 0.0 0.3 275188 6860 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
apache 9119 0.0 0.3 275188 6848 ? S Sep11 0:00 \_ /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf
というコマンドを使って、さらに子プロセスの数を知りたい時は、
$ ps auxf | grep '[h]ttpd' | grep -c apache
10
Webページへのアクセス数の集計を行うときは、
$ ionice -c 2 -n 7 nice -n 19 cat /var/log/httpd/access_log | cut -d : -f 2,3 | sort | uniq -c
~
1000 10:00
1234 12:34
~
のようなコマンドを使いました。 ioniceやniceを使う理由は、実際に障害対応を行うときにロードアベレージが高い状態なのに、その原因を確認するためのコマンドで余計に負荷を上昇させてしまってはさらなる障害を生む原因にもなりうるからです。 他にもcutコマンドやegrepコマンドは今までほとんど使ってこなかったので今回のインターンでは一から勉強しなおしました。 また、それ以外にもSWAPの残容量減少やロードアベレージの上昇、ディスク空き容量の減少などといった障害の原因についても考えました。
第2週 障害対応
2週目では、実際にLAMP環境での障害を確認し報告するということを行いました。 流れとしては、まず前提として監視システムにはNagiosが使われておりNagiosからのアラートが各個人のインターン用で用意していただいたメールアドレスに届くのでそれを確認し次第作業を行うといった流れでした。 とはいってもいきなりこれを行うのはなかなか大変なので、初日は社員さんと一緒にアラート対応手順書を確認しながら1つ1つ作業を行っていました。なのでだいたい40分程度の時間を使って1つのアラートに対応していました。
2日目からは、初日とは違い1人で全ての手順を行い原因を見つけました。 なのでできる限りペースを上げて、各コマンドから得られる結果で見るべき重要なポイントを判断してそれらの結果から原因を見つけ出すことを必死で行っていました。
そしたらなんと、原因を見つけるまでにかかった時間を5~10分程度まで短縮することが出来ました。それから簡易的な報告書を書くのに数分かかりましたが実際に原因を見つけられた時の達成感もあり思わず手元のお茶をゴクゴクと飲んでしまうほどでした。
最後の2日間は社内ISUCONの体験をしました。 ここではWebページの表示に関わる部分のPythonで書かれているview.pyというファイルのチューニングを行いました。 実際に、MySQLのクエリを無駄にfor文で回しているようなところを1つのクエリにまとめてみるといったことを、社員さんを含むチームで考えてみました。
グッときたコマンド
今回のインターンで、グッときたコマンドを紹介したいと思います。
1つ目は、先ほども紹介させていただいたpsコマンドです。
$ ps auxf | grep '[h]ttpd' | grep -c apache
psコマンドのオプションではauxfとすることで端末を持つプロセス(a)、端末を持たないプロセス(x)とユーザ名、CPU使用率やメモリ使用率などを表示し(u)それを階層で表示させる(f)オプションです。
次のgrepコマンドでは、httpdと言う文字列のhを「[ ]」で括るのは正規表現を使うことでgrep自体ののプロセスが表示されないようにするためです。
最後にここではapacheですがApacheのユーザでgrepして-cオプションでカウントをすることで子プロセス数を出力することができます。
2つ目は、こちらも先ほど紹介させていただいたaccess_logの集計コマンドです。
$ ionice -c 2 -n 7 nice -n 19 cat /var/log/httpd/access_log | cut -d : -f 2,3 | sort | uniq -c
ioniceやniceコマンドは先ほどの説明のようにおまけのような感じですが障害対応の現場では必須のようです。 それ以降はcatコマンドでアクセスログを表示して、それをcutコマンドでコロンで区切った2フィールド目(時)と3フィールド(分)を切り取り、それをsortコマンドで昇順に並べ変えることで1番下に時刻の新しいものが来るようになり最後にuniqコマンドの-cオプションでその時刻(分刻み)でのアクセス数の集計を取ることが出来ます。
3つ目は、duコマンドです。
$ ionice -c 2 -n 7 nice -n 19 du -scm /*
このコマンドは主にディスクの残容量がリアルタイムで減少しているときなどに使います。
これもioniceなどを使い優先順位は下げて行い、duコマンドで/*とすることでRoot配下のディレクトリの使用量がわかります。-scmオプションで指定したディレクトリのディスク使用量のみを表示(s)、ディスクの合計使用量も表示(c)、さらにディスク容量をメガバイト単位で表示しています(m)。
このコマンドは何度か実行して、増えているディレクトリに絞っていくことでどのファイルが膨張しているのがわかるのでディスク容量の減少のアラートのようなときは重宝します。
4つ目は、wコマンドです。
$ w
ここにきて急にシンプルなコマンドになりましたが、wコマンドではサーバの稼働時間やロードアベレージ、ログイン中のユーザの端末のアイドル時間や接続元IPアドレスなどがわかります。 なので障害発生時にはまずwコマンドを何度か実行することでロードアベレージの変化や、ユーザのログイン状況から不審なアクセスがないかなどの全体像をつかむことが出来ます。
他にもたくさんのコマンドを使ってきましたがきりがないのでこの辺でストップします!!
こちらはハートビーツの社員さんがまとめてくれているものなので是非!(私も参考にしました...) ↓↓↓
ITインフラで起きる「もしも」のための12個のコマンド - インフラエンジニアway - Powered by HEARTBEATS
まとめ
今回のインターンシップでは障害の原因を考えることから始まり、実際に障害対応を行えるようになりました。 また、障害を確認するときも様々なコマンドを使うので各コマンドのオプションなどの使い方、見るべきポイントのようなものをしっかりおさえておくことがとても大切だと思いました。 そして、障害の起きない環境づくりができればベストかなと改めて思いました。
最後に、自販機にドクぺがあったのがとても嬉しかったです。