ブログへのアクセス過多で破滅したけどPHP7.0に助けられたお話

一昨日書いた3ヶ月ひたすらWEB小説読んだ話はてブのTOPに来た結果、3ヶ月前にやろうとした変更を放置していたツケを払う羽目になった話です。
プロだと、流入続いているWordpressに対してリアルタイムでPHPのバージョンを上げるという暴挙はあり得ないでしょうから、貴重なデータと言えなくもないと思います。

 

環境

しかしながら、11月にPHP7.0が来るという事でそのタイミングでAPC→OPcache+APCuにしようと思い、Wordpress側はかなりノーマルに近い状態でした。 そしてそのタイミングで、WEB小説を読み漁る生活に移ってしまって忘れていたわけですね。

 

 

PHP7すげぇぇえええ

先週も250ブクマ超記事があって乗り越えたので捌けなくなることを想定していなかったら、はてブTOPの一番上に来たタイミングで詰んだみたいです。

キャッシュ前提でKeepAliveをoffにしてたからだと思うんですが、アクセス数が一定量を越えて捌ききれなくなったタイミングから一気にLoad Averageが40の世界に。
慌ててログインするもコンソールすら弾かれ、VPSのコンパネ側で強制再起動かけても即Apache殺さないと1分で固まるんで焦りましたわ。

そうなるとWordpress側でキャッシュの設定する間もないため、PHP5.6のAPCuに頼るよりは、PHP7.0自身による高速化に賭けるべきでは?という判断をしました。
今考えても賭けに走りすぎですが、既に読めない状態が続いていたので怖いものはなかったんですもん。

 

んで、その結果がまさに驚愕。
Wordpress側の半静的キャッシュはしないままでここまで顕著な差が出るとは。 OPCacheこそ回しているものの、APCuは試しづらかったので回してません。 100のベンチマークより1の炎上ですね(ぇ
RESに占めるSHR比率が高いですし、仮想メモリの確保量もだいぶ最適化の余地があるように見えます。 CPUの使用率も平常時以下で収まってますし。

そして何より、Wordpress側とは密に対応しあっているとはいえ、ここまで大規模に移行して全く不具合が無いとは思いませんでした。 2時間のダウンタイムのうち、アクセス過多による待ち時間と、PHP7情報の調査時間が7割です。 正直、あひゃひゃひゃ言いながら夜まで半泣きでコンソール叩いている予定だったんですが(笑)

 

導入前ロードアベレージ:43.99

094e883d1c12842d60de3964f6fbbaae

導入後ロードアベレージ:0.44

6c8326aaf1d86b7a389c52cc936049a4

ロードアベレージ推移

load-day

トラフィック推移

if_eth0-day

CPU使用状況推移

cpu-day

 

 

入れ方

PHP7.0はまだ公開間もないためテストで入れてる記事ばかりしか当たらず、そこの捜索が一番時間喰いました。
結局英語圏を斜め読みして使えそうな記事をマージしました。 バタバタしていてブクマ出来ていなかったので引用元をかけなくて申し訳ないです。

現時点のDebianLAMP環境だと以下の通りでさほど問題ないかと。
逆にあっさりと更新できてビビりました。

 

souces.listへ以下のレポジトリを追加

deb http://packages.dotdeb.org <distribution> all
deb-src http://packages.dotdeb.org <distribution> all

gpg鍵追加

wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg && apt-get update

旧環境の削除と更新

dpkg -l | grep php
apt-get purge php5* (←これの挙動がちょっと怪しいので要注意)

apt-get install php7.0 php7.0-mysql

確認

php -v

PHP 7.0.3-1~dotdeb+8.1 (cli) ( NTS ) Copyright © 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright © 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright © 1999-2016, by Zend Technologies

OPcache有効化

php -i | grep php.ini (←path確認)

vi /etc/php/7.0/cli/php.ini (←バージョン管理ややこしそうな位置に変わってる)

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
(↑思考停止して皆唱えている呪文なので数字については要検討)

これでうまく捌けたのでapcuは有効化してませんが、このパッケージだとたぶんデフォで入っているので[apcu]設定追加だけで行けそうな気がします。

Wordpressの対応

この段階で真っ白になって一瞬固まりましたが、phpのテストスクリプト系は機能していたので安堵。 未対応のプラグインがエラー吐いていただけでした。

wp-config.phpの"define(‘WP_DEBUG’, true);“で、エラーに出てきたプラグインのフォルダ名をリネームして殺したら、それだけでサクッと動きました。 未対応プラグインは以下の通り。

 

おわりに

もっと優雅にPHP7.0の人柱記事を上げる予定だったんですが、予想外の展開で楽しいデータが取れました。(反省の色無し)

それにしても、思った以上にPHP7.0+Wordpressな日本語情報が無いんですけど、みなさんまだ様子見なんでしょうか?
こちとら個人の趣味でやってるだけなのでガンガン冒険していますが、そのたびにブログ表示できなくなったりしてるんで、申し訳ありません。

この辺、手間かかるんではてなブログにでも引っ越したいと常々思っていますけど、やっぱりたまにはこういう作業で表面だけでも知識付けとかないと衰えますしね。 いや、まあ、WEBとか関係ない業種なんですけど。

ってか、Apacheもそろそろチューニング飽きてきたのでnginxすっ飛ばしてh2oの予定です。いつの日か記事になるといいですね。