LAMP 環境で、負荷が高いとき・サイトが重いときの、原因あるある


1年に数回はきます。たまに全く知らない環境の調査依頼もきます。
いつも経験則でやってましたが、最近記憶力が低下してきたので、いまのうちに一度まとめます。

思い出しながら書いてみましたが、個人的には、「SQLが悪い」がほとんどだったような気がしてます。

Linux

  • iptableが通信パケットを捨ててる

→ /var/log/message をみてエラー頻発していることがある。思い切ってマネージドサービス(AWS環境ならセキュリティグループ)にお任せして、iptablesを止める。

# systemctl stop iptables
# systemctl disable iptables
  • 3G回線とか地下鉄などの回線が弱い状況にいる利用者が回線つかみっぱなし

→ 下記コマンドで、TIME_WAITが大量にある場合、サーバのローカルポートを食い潰していることがある。
 https://qiita.com/kuni-nakaji/items/c07004c7d9e5bb683bc2
 の対策を実施してみる。

# netstat -anp

Apache

  • クローラー(攻撃)

→ 下記コマンドで、特定IPからのリクエストが多く、明らかに攻撃用のアクセス(../../etc/passwd的な)がある場合は、IP制限をかける。

# cat /var/log/httpd/access_log | cut -f1 -d" " | uniq -c | sort -r
  • クローラー(攻撃じゃない)

→ 攻撃と判断できず、IP制限かけるわけにもいかない場合は、robots.txt に書く。※基本効果なし。。

# vi ./robots.txt

Crawl-delay: 10
  • ファイルディスクリプタを上げてない

→ 昔から、limit.confが効かないから起動時にするとかなんとかで、ややこしくなって、結局よく設定を忘れられてる or 間違っている。いまは、こんな感じ↓
 https://qiita.com/SkyLaptor/items/7e57d98d8540296d6143

MySQL

  • 適切なIndexが貼れていない

→ 下記コマンドで叩いて、実行中のSQLを確認。Timeが長いものがあれば、EXPLAIN で確認。

> show full processlist \G
> EXPLAIN <SQL文> \G
  • Where以下の検索条件の一番左がIndex効いてない
  • Whereの一番左がIN句を使っている

→ Whereの一番左をインデックスを使うカラムを条件にして、精査するレコードを減らす。

  • InnoDB系のメモリ設定が間違っている
  • ディスクI/Oが高い

→ 下記コマンドで叩いて、reads/s が0になっているか、Free buffers に余裕があるか確認。余裕なかったらメモリのInnoDB系の設定にふる。

> SHOW ENGINE INNODB STATUS \G
  • どうもロックがかかっているっぽい

→ 下記コマンドで叩いて、LATEST DETECTED DEADLOCK を確認する。

> SHOW ENGINE INNODB STATUS \G
  • QueryCacheが効いてない

→ キャッシュヒット率が低ければ使わ無いほうがいいです。メモリ不足の場合は割り当ててあげてください。
 https://qiita.com/mamy1326/items/d1548d8cf4528277172a

  • 複文がえらいことになってる

→ 頑張ってSQLを直す。こればっかりはもう。。

PHP

  • キャッシュ機能つかってない

→ Opcache(もしくはAPC)は使うべきです。普段大丈夫でも、同時に大量アクセスがあるとえらいことになります。

  • gethostbyaddr関数使ってる

→ たまにあるんですが、できるなら使うの止めたほうがいいです。名前解決待ちが多発するとえらいことになります。

  • sleep関数を使ってる

→ たまにあるんですが、できるなら使うの止めたほうがいいです。同時に大量アクセスがあるとえらいことになります。