blog.kur.jp

バイオリンと山、自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

サーバの負荷が高すぎるのでなんとかしてみる(調査編)

ここ最近、とあるWebサービスを動かしているサーバの負荷が、たまにとんでもないことになっています。しばらく放置すると収まるものの、負荷が高い間、Webサイトにまともにアクセスできる状態ではないのでなんとかしないといけません。

ちなみに、サーバの負荷のグラフはこんな感じ。

image

考えられる原因としてはいくつかあるけど、外部からのアクセスが多くて処理できなくなっている可能性が高いんだと思う。で、外部のアクセスと言ってもいくつかの種類があります。

  • Webサーバ以外へのアクセス
  • Webサーバへのアクセス

それぞれについて、どの程度のアクセスがあるのかを調べてみました。

Webサーバ以外へのアクセス

Webサーバ以外へのアクセスとは例えば、第三者によるsshでの接続とかが考えられる。実際にサーバのログを見てみると、SSHで外部からアクセス下記のようなアクセスが大量に残っていた。

sshd: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=XXXXXX  user=root

これが原因ではないと思うものの、あまり気持ちが良いものでもないので、外部からのSSHでのアクセスを遮断することにしてみます。/etc/hosts.denyに、sshd:allを記述して、/etc/hosts.allowにsshd:自分のIPアドレスを記述する。こういうときは、固定のIPアドレスを持っていると便利です。

このあとログを見てみると、下記のようなログが大量に残っていて、とりあえず安心。

sshd: refused connect from XXX.XXX.XXX.XXX sshd: refused connect from XXX.XXX.XXX.XXX sshd: refused connect from XXX.XXX.XXX.XXX

ただ、外部からのアクセスはそこまで大量ではないので、これが負荷の原因とは考えにくい気がします。

Webサーバへのアクセス

このサーバーはWebサーバとして公開しているので、Webサーバに対してアクセスがあるのは当たり前です。だけど、Webサーバへのアクセスと言っても、本来私が想定していたアクセスと、そうではないアクセスがあります。

とりあえず該当する時間のログを見ながら思ったことは、下記の二点。

  • 特定のURLへのアクセスが思ったより多い。
  • botのアクセスが思ったより多い。

特定のURLへのアクセスが思ったより多い

Webサービスを作るときは、きっとこういう使われ方をするだろうってのを想定します。

ユーザはこういう使い方をするだろう、こういう使われ方をするとこういう負荷がかかるだろうって考えることもありますし、この機能は若干負荷がかかるけど、めったに使う機能じゃないから問題ないよねとか判断することもあります。ところが、この想定が大きく外れて、めったに使わないであろう機能が、思いっきりたくさん使われていることが判明しました。そうなると、当初の想定以上の負荷が発生します。

実際のユーザの挙動を想定できてなかったのは完全に私のミスなんですけど、ユーザーが実際にどういう風にWebサービスを使用しているかを定量的に把握することは大事だなぁと思った次第。

botのアクセスが思ったより多い。

Webサービス内でのリンクの貼り方とかにも問題があるのかも知れませんが、botによるアクセスが結構あります。GoogleやYahoo等の検索エンジンのbotってのもありますし、Twitterbot/1.0と書かれたbotなど何に使われているのかよくわからないbotも多く見かけます。酷いときは、botが1秒間に2桁アクセスしているときなんかもあって、そりゃ負荷高くなるよなぁって感じ。

対策案

特定のURLへのアクセスが多い点について、まずは定量的に負荷を測定してみることにします。そうしないことには、負荷がどの程度減ったのか、それとも変わらないのか把握することが出来ないし。その後、botへの対策を行う予定。おそらく、特定のページへのbotのアクセスを遮断することになると思っています。