Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WordPress「超」スピードアップ術 ~のろまなカメと呼ばれないために~
Search
Hitoshi Omagari
May 27, 2017
Technology
1
310
WordPress「超」スピードアップ術 ~のろまなカメと呼ばれないために~
2017/5/27 に開催されたSaCSS Special Vol.11 の登壇資料です。
Hitoshi Omagari
May 27, 2017
Tweet
Share
More Decks by Hitoshi Omagari
See All by Hitoshi Omagari
君はパーマリンク沼を知っているか?
jim912
0
9.7k
Rewrite Endpoint活用のススメ - WordPressで作る食べ○グ系サイト-
jim912
1
530
夜のハンズオン資料
jim912
3
250
Other Decks in Technology
See All in Technology
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
2
3.1k
形式手法の 10 メートル手前 #kernelvm / Kernel VM Study Hokuriku Part 7
ytaka23
5
830
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
370
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
310
TinyGoを使ったVSCode拡張機能実装
askua
2
210
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
320
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
110
FOSS4G 2024 Japan コアデイ 一般発表25 PythonでPLATEAUのデータを手軽に扱ってみる
ra0kley
1
150
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
420
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
380
マイベストのデータ基盤の現在と未来 / mybest-data-infra-asis-tobe
mybestinc
2
2k
フルカイテン株式会社 採用資料
fullkaiten
0
40k
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
50
7.2k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
400
Unsuck your backbone
ammeep
668
57k
A better future with KSS
kneath
238
17k
Teambox: Starting and Learning
jrom
133
8.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Imperfection Machines: The Place of Print at Facebook
scottboms
264
13k
Ruby is Unlike a Banana
tanoku
96
11k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
GraphQLとの向き合い方2022年版
quramy
43
13k
Building Applications with DynamoDB
mza
90
6.1k
Transcript
WordPress「超」スピードアップ術 ~のろまなカメと呼ばれないために~ プライム・ストラテジー株式会社 執行役員CTO 大曲 仁
P r i m e S t r a t
e g y C o . , L t d . W o r d P r e s s I n t e g r a t i o n D i v i s i o n 2 1.自己紹介
大曲 仁 自己紹介 3 t @jim0912 f hitoshi.omagari • WordCamp
Yokohama 2010 実行委員長 • WordPress 日本語フォーラム 世話役 • WordCamp スピーカー
大曲 仁 自己紹介 4
主なWordPress開発実績 5 読売新聞様 「yomiDr(ヨミドクター)」 マイナビ 様 「マイナビウーマン」
執筆書籍 6 翔泳社 一歩先にいく WordPressのカスタマイズがわかる本 現場でかならず使われている WordPressデザインのメソッド エムディエヌコーポレーション;
WordPressに最適化したサーバ作ってます 7
P r i m e S t r a t
e g y C o . , L t d . W o r d P r e s s I n t e g r a t i o n D i v i s i o n 8 2.スピードアップの必要性と考え方
9
1. ユーザー体験の向上 → 回遊率の向上 → 成約率の向上 2. サーバ負荷の軽減 → サーバ構成やスペックの縮小
→ コスト削減 3. 微SEO WordPressスピードアップの必要性と考え方 10 いいことずくめ
11 ハードウェア/OS Apache Nginx PHP MySQL WordPress WordPressスピードアップの必要性と考え方
スピードアップは掛け算 WordPressをスピードアップさせるためには、様々なレ イヤーに対して、それぞれ適正化を行い、掛け合わせるこ とで、圧倒的なスピードアップが実現できます。 対策を行わない場合 :1×1×1×1×1=1 20%ずつ高速化した場合 :0.8×0.8×0.8×0.8×0.8 =0.328 約3倍の高速化
WordPressスピードアップの必要性と考え方 12
P r i m e S t r a t
e g y C o . , L t d . W o r d P r e s s I n t e g r a t i o n D i v i s i o n 13 3.ハードウェアによるスピードアップ
サーバスペックの選択 サーバのCPU周波数が高い方が高速。 単純計算で周波数が2倍になれば、2倍のスピードアップ ただし、CPU周波数の向上は頭打ち。 コア数の増加は、負荷耐性の向上にはつながるが、1アク セスあたりのスピードアップにはならない。 ハードウェアによるスピードアップ 14
サーバの記憶媒体 HDDに比してデータの読み出しが圧倒的に速いSSDは ディスクアクセスが発生するデータベース処理のスピード アップに効果的 ハードウェアによるスピードアップ 15
P r i m e S t r a t
e g y C o . , L t d . W o r d P r e s s I n t e g r a t i o n D i v i s i o n 16 4.PHP実行環境によるスピードアップ
PHP実行環境によるスピードアップ PHPを動作させる環境に よって明確な性能差が発生。 PHP 5とPHP 7は約2.5倍 PHP 5とHHVMでは約3倍 HHVMとはFacebookが独自に 開発したPHP互換の実行環境
PHP実行環境によるスピードアップ 17
処理速度 信頼性 将来性 × ◎ × ◦ ◎ ◎ ◎
△ △ PHP実行環境によるスピードアップ PHP実行環境によるスピードアップ 18 HHVMでの動作検証は次バージョンから実施しないと明言
中間コードキャッシュ(OPcache) PHP5.5以上で利用可能 PHPのスクリプトをバイトコード状態でメモリに保持 PHP実行環境によるスピードアップ 0/1 PHPスクリプト バイトコード バイナリ 0/1 PHPスクリプト
バイトコード 中間コードキャッシュ なし 中間コードキャッシュ あり バイトコードへの変換を アクセス毎に実施 バイトコードへの変換は 初アクセス時のみ実施 バイナリ
P r i m e S t r a t
e g y C o . , L t d . W o r d P r e s s I n t e g r a t i o n D i v i s i o n 20 5.データベースによるスピードアップ
データベースのスピードアップ手法 WordPressの処理におけるデータベースのスピードアッ プには、 • データベースへのリクエスト数自体を少なくする • リクエストあたりの処理自体を短縮させる の両面を考える必要がある。 データベースへのリクエスト数の削減は、WordPressの 実装で対処する。
データベースによるスピードアップ 21
リクエストあたりの処理時間短縮化 MySQLの2つの設定により、データベースへのリクエスト あたりの処理時間短縮が可能 • innodb_buffer_pool_size • query_cache_size データベースによるスピードアップ 22
リクエストあたりの処理時間短縮化 innodb_buffer_pool_size メモリ上にデータベースのデータをキャッシュする上限サ イズ。メモリ上にデータをキャッシュすることで、データ ベースへの取り合わせをスピードアップ データベースのスピードアップ 23 HDD上のデータを メモリにキャッシュ メモリ上のデータに
リクエストし高速に処理
リクエストあたりの処理時間短縮化 query_cache_size メモリ上にデータベースへの問い合わせ結果をキャッシュ する上限サイズ。 データベースのスピードアップ 24 メモリ上に問い合わせ結果の キャッシュがあれば再利用
P r i m e S t r a t
e g y C o . , L t d . W o r d P r e s s I n t e g r a t i o n D i v i s i o n 25 6.WordPressの実装によるスピードアップ
翻訳ファイル読み込み WordPressの基本言語は英語。日本語用の対訳ファイル を読み込み変換することで日本語での表示にしている。 「001 Prime Strategy Translate Accelerator」プラグイ ンでは、この対訳ファイルの読み込み結果をキャッシュし 、再利用することで、翻訳ファイルの読み込みにかかる時
間を30ms程度短縮することが可能。 WordPressの実装によるスピードアップ 26
オブジェクトキャッシュ データベースからの取得結果などをメモリ上に保持し再利 用する機能。データベースへのリクエスト数削減につなが る。 通常は、アクセス単位でキャッシュは削除。プラグインに より、memcachedやAPCuなど用いて、リクエストを超 えてキャッシュを持続させることも可能。 WordPressの実装によるスピードアップ 27
WP_Queryのお作法 • fieldsパラメータ 投稿のIDのみ取得したい場合に指定。余分なデータ転 送が発生しないようになる • no_found_rowsパラメータ ページングの必要ないサブクエリーなどで指定 データベースの処理時間を短縮できる •
posts_per_pageパラメータ 過度な負荷をかけないよう-1の指定は行わないように WordPressの実装によるスピードアップ 28
某出版社の雑誌メディアサイトでの残念事例 必要なのは、スライダー用に用いる複数の投稿タイプから の最新5記事のID なぜか、posts_per_page => -1 で全記事読み込み、ソ ートした上で、post IDのみ利用 結果、3000以上の記事データを読み込み、メモリの異常
消費とデータ転送遅延が発生 WordPressの実装によるスピードアップ 29
リビジョン数の制限 リビジョン機能自体は、フェイルセーフのために有用。 ただし、多すぎるリビジョンは、データの肥大化につなが りデータベースの性能劣化を招くこととなるため、投稿ご との最大リビジョン数を制限しておく。 例) Revision Control WordPressの実装によるスピードアップ 30
カスタムフィールドの用法 カスタムフィールドのデータを保存するデータベースには 、データの検索、ソートに適したインデックスがないため 、データ量の増加に伴い急激に性能劣化を伴う。 データを検索する必要があるならば、タクソノミーで代替 できるか検討すべき。 「Search Everything」プラグインの利用は、パフォーマ ンス重視のサイトでは回避すべき。 WordPressの実装によるスピードアップ
31
Transients APIの利用 Transients APIは、データ、もしくはHTMLのコードなど 、コードの実行による結果をデータベースに保存し一定時 間再利用する機能。再利用することで、本来のコード実行 時間を短縮可能。 適用例) • Web
APIの取得結果 • 複雑で重い処理のPHP実行結果 WordPressの実装によるスピードアップ 32
Transients APIの利用 保存時 取得時 WordPressの実装によるスピードアップ <?php $ranking_data = get_transient( 'ranking'
); ?> Transientの取得結果が入る Transientがない、もしくは 期限切れの場合はfalse Transientの名前 保存時と同一にする <?php set_transient( 'ranking', $ranking_data, 3600 ); ?> Transientの名前を指定。 他のTransient名前と重複し ないように注意 Transientに保存するデータ 有効期限(秒数)
Transients APIの利用 保存時 WordPressの実装によるスピードアップ <?php wpp_get_mostpopular(); ?> <?php if (
false !== ( $ranking_data = get_transient( 'ranking' ) ) ) { ob_start(); wpp_get_mostpopular(); $ranking_data = ob_get_clean(); set_transient( 'ranking', $ranking_data, 3600 ); } echo $ranking_data; ?>
Transients APIの利用 1. Transientを取得、有効なTransientの有無を判定 2. 出力バッファリングの開始 3. Transient対象コードの実行 4. 出力バッファリングを終了しデータを取得
5. Transientへのデータ保存 6. 表示の出力 WordPressの実装によるスピードアップ
某ファッションメディアサイトでの残念事例 複数のブログサイトデータを表示するためにRSSを取得し てサイドバーに表示。 表示毎に数回のネットワークリクエストが発生し、処理に 1秒以上かかっていた。 WordPressの実装によるスピードアップ 36
某アニメ系メディアでの残念事例 管理画面でWordPress、テーマ、プラグインの更新表示 を停止 ただし、管理画面の表示ごとに、更新チェック( wordpress.orgへのリクエスト)が発生し、管理画面が重 くなってしまっていた。 WordPressの実装によるスピードアップ 37
ページキャッシュ 表示するHTMLコードをファイルなどに保存しておき、一 定時間再利用する機能。 数十ms程度までスピードアップが可能。 プラグイン例) • WP Super Cache •
W3 Total Cache WordPressの実装によるスピードアップ 38
某恋愛系メディアでのお話 Twitter, Facebookシェア数取得のために、毎回リクエス トが発生 対策として、独自のキャッシュ機能を実装していたが、実 装方法にまずい点があり、データベースの肥大化と肥大化 したデータ読み込みに伴う帯域圧迫が発生していた。 WordPressの実装によるスピードアップ 39
P r i m e S t r a t
e g y C o . , L t d . W o r d P r e s s I n t e g r a t i o n D i v i s i o n 40 7.ボトルネックの見つけ方
処理時間の表示 ボトルネックの見つけ方 41 <?php echo __LINE__ . ' | ';
timer_stop( 1 ); echo "¥n"; ?> コードを書き込んだファイルの行番号 コードを書き込んだ時点での WordPressの処理時間(秒) 改行コードの出力
ボトルネック処理の切り分け テンプレートの最初に記述し、 テンプレートでの問題か、 それ以前の処理かの切り分け ボトルネックの見つけ方 42
ボトルネック処理の切り分け テンプレートの区間ごとに記述。 区間ごとの処理時間を把握し、 ボトルネックが存在する区間を 把握。 例) ・get_header(); 前後 ・get_sidebar(); 前後
・get_footer(); 後 ボトルネックの見つけ方 43
ボトルネック処理の切り分け 区間内でさらに、記述箇所を 増やして、ボトルネックと なっている処理を特定する。 ボトルネックの見つけ方 44
45 ご清聴ありがとうございました。