[DigitalOcean][Kubernetes]Nginxコンテナを分離してWordPressのソースコードをGit管理した
前回のブログで、個人環境(wiki.adachin.me)のWordPressソースコードをGit化し、新たに開発環境構築とNginxコンテナを分離しました。今回はようやく開発環境も整ったので、WordPressをPHP7.4からPHP8.3にバージョンアップしてみました。まずはPHP7と8のパフォーマンス比較について調べてみました。
PHP7と8のパフォーマンス比較
https://www.php.net/releases/8.0/ja.php
https://externals.io/message/116323
Benchmark PHP 8.1 vs PHP 8.0 vs PHP 7.4 vs PHP 7.3 vs PHP 7.0 vs PHP 5.6 vs PHP 5.5
- JIT コンパイラの導入
- PHP8ではJIT(Just-In-Time)コンパイラが導入され、コードが実行時に直接ネイティブマシンコードにコンパイルされ、実行速度が向上。
- 新しい機能と最適化
- 新しい言語機能や最適化が多数含まれており、コードの実行が効率的に行われ、パフォーマンスが向上。
- 型付けの改善
- PHP7からPHP8への移行に伴い、型付けの改善が行われました。型付けに関する新しい機能や最適化が導入され、静的解析が向上。
- 新しいデータ構造
- 新しいデータ構造や関数が導入され、コードの効率性が向上。
- 共有メモリの改善
- 共有メモリの管理が改善されました。同時実行中のスレッドがメモリーをより効果的に共有でき、パフォーマンスが向上。
- コード最適化
- コードの最適化が進められ、コードでの実行速度が向上。
軽くPHP7と8のパフォーマンス比較を調べてみましたが、そもそもPHP5から7で3倍近く高速化していて、PHP8で約20%高速化してるようです。他の言語に追い抜きそうな勢いでこれはすごい。さて、PHP8からJITが追加されて、プログラムを高速に実行させる機能が導入されました。まずはDockerの開発環境からPHP8にバージョンアップしてみましょう。
Docker開発環境の修正
- docker/dev/app/Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
FROM php:8.3.0-fpm-alpine #変更 ENV APP_ROOT /var/www/wiki.adachin.me WORKDIR $APP_ROOT # Setup UTC+9 RUN apk --update add tzdata && \ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ apk del tzdata && \ rm -rf /var/cache/apk/* # install packages RUN apk update && \ apk upgrade && \ apk add --update --no-cache \ autoconf \ bash \ build-base \ curl-dev \ freetype-dev \ g++ \ gcc \ git \ libjpeg-turbo-dev \ libpng-dev \ libxml2-dev \ libxslt-dev \ mysql-dev \ mysql-client \ tzdata \ vim ~省略~ |
- docker/dev/app/php.ini
1 2 3 4 5 6 |
#JIT 追加 zend_extension = opcache opcache.enable = 1 opcache.enable_cli = 1 opcache.jit = tracing opcache.jit_buffer_size = 128M |
- JITが有効になっているのか確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
$ docker-compose up -d [+] Building 0.0s (0/0) docker:desktop-linux [+] Running 3/3 ✔ Container wiki-db Started 0.0s ✔ Container wiki-app Started 0.0s ✔ Container wiki-nginx Started 0.0s $ docker exec -it wiki-app bash 30bd89cfc990:~# php -v PHP 8.3.0 (cli) (built: Nov 30 2023 23:39:07) (NTS) Copyright (c) The PHP Group Zend Engine v4.3.0, Copyright (c) Zend Technologies with Zend OPcache v8.3.0, Copyright (c), by Zend Technolo 30bd89cfc990:~# php -i | grep opcache opcache.blacklist_filename => no value => no value opcache.dups_fix => Off => Off opcache.enable => On => On opcache.enable_cli => On => On opcache.enable_file_override => Off => Off opcache.error_log => no value => no value opcache.file_cache => no value => no value opcache.file_cache_consistency_checks => On => On opcache.file_cache_only => Off => Off opcache.file_update_protection => 2 => 2 opcache.force_restart_timeout => 180 => 180 opcache.huge_code_pages => Off => Off opcache.interned_strings_buffer => 8 => 8 opcache.jit => tracing => tracing opcache.jit_bisect_limit => 0 => 0 opcache.jit_blacklist_root_trace => 16 => 16 opcache.jit_blacklist_side_trace => 8 => 8 opcache.jit_buffer_size => 128M => 128M opcache.jit_debug => 0 => 0 opcache.jit_hot_func => 127 => 127 opcache.jit_hot_loop => 64 => 64 opcache.jit_hot_return => 8 => 8 opcache.jit_hot_side_exit => 8 => 8 opcache.jit_max_exit_counters => 8192 => 8192 opcache.jit_max_loop_unrolls => 8 => 8 opcache.jit_max_polymorphic_calls => 2 => 2 opcache.jit_max_recursive_calls => 2 => 2 opcache.jit_max_recursive_returns => 2 => 2 opcache.jit_max_root_traces => 1024 => 1024 opcache.jit_max_side_traces => 128 => 128 opcache.jit_max_trace_length => 1024 => 1024 opcache.jit_prof_threshold => 0.005 => 0.005 opcache.lockfile_path => /tmp => /tmp opcache.log_verbosity_level => 1 => 1 opcache.max_accelerated_files => 10000 => 10000 opcache.max_file_size => 0 => 0 opcache.max_wasted_percentage => 5 => 5 opcache.memory_consumption => 128 => 128 opcache.opt_debug_level => 0 => 0 opcache.optimization_level => 0x7FFEBFFF => 0x7FFEBFFF opcache.preferred_memory_model => no value => no value opcache.preload => no value => no value opcache.preload_user => no value => no value opcache.protect_memory => Off => Off opcache.record_warnings => Off => Off opcache.restrict_api => no value => no value opcache.revalidate_freq => 2 => 2 opcache.revalidate_path => Off => Off opcache.save_comments => On => On opcache.use_cwd => On => On opcache.validate_permission => Off => Off opcache.validate_root => Off => Off opcache.validate_timestamps => On => On |
開発環境からPHP8にバージョンアップしてみましたが、Dockerfileの変更点はimageのみで、php.iniにJITの設定を追加したくらいでした。また、WordPressのダッシュボード等は特にエラーが出ていなかったのと、記事の更新もできていました。ここで問題ないと判断したので、本番と同じように修正してデプロイしてみたところ…
「このサイトで重大なエラーが発生しました。」
WordPressをPHP8.3.0にバージョンアップしてみたけど、だめだったので7.4に戻す。こういう時にDockerは便利。しかし、開発環境は動いたんだけどな.. pic.twitter.com/16cStabj3a
— adachin👾SRE (@adachin0817) December 8, 2023
開発環境のDBは本番DBをdumpしてrestoreしていないため、本番同等の環境になっていません。なので分からなかった…というオチ。とりあえず、Kubernetesのコンテナをログを見てみると以下のようにエラーログが出ていました。
PHP8に対応していないプラグイン
- WP Social Bookmarking Light
1 2 3 4 |
$ kubectl logs wiki-app-dcdc7d8f6-msmmz -c wiki-app [09-Dec-2023 00:28:32] NOTICE: fpm is running, pid 1 [09-Dec-2023 00:28:32] NOTICE: ready to handle connections NOTICE: PHP message: PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /var/www/wiki.adachin.me/wp-content/plugins/wp-social-bookmarking-light/vendor/twig/twig/lib/Twig/Node.php on line 42 |
なるほど。PHPのエラー見てみたけど、wp-social-bookmarking-lightプラグインが対応してないみたい。
— adachin👾SRE (@adachin0817) December 8, 2023
https://ja.wordpress.org/plugins/wp-social-bookmarking-light/
なんとWP Social Bookmarking Lightという長年愛用していたSNSシェアボタンプラグインが6年前からアップデートされていないという…しかも今はダウンロードできなくなっていました。残念!ということで、代替案として「AddToAny」を利用しました。(誰か開発してくれ!自分か!?)
- SNS Count Cache
SNS Count Cacheも5年前からアップデートされていなかったので、削除しました。(MaruyamaさんPHP8に対応してくれ!)
これにてアクセスできるようになったので、バージョンアップ完了となりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
$ kubectl exec -it wiki-app-94448cf49-dn9wt -c wiki-app -- bash wiki-app-94448cf49-dn9wt:~# php -v PHP 8.3.0 (cli) (built: Nov 30 2023 23:39:07) (NTS) Copyright (c) The PHP Group Zend Engine v4.3.0, Copyright (c) Zend Technologies with Zend OPcache v8.3.0, Copyright (c), by Zend Technologies wiki-app-94448cf49-dn9wt:~# php -i | grep opcache opcache.blacklist_filename => no value => no value opcache.dups_fix => Off => Off opcache.enable => On => On opcache.enable_cli => On => On opcache.enable_file_override => Off => Off opcache.error_log => no value => no value opcache.file_cache => no value => no value opcache.file_cache_consistency_checks => On => On opcache.file_cache_only => Off => Off opcache.file_update_protection => 2 => 2 opcache.force_restart_timeout => 180 => 180 opcache.huge_code_pages => Off => Off opcache.interned_strings_buffer => 8 => 8 opcache.jit => tracing => tracing opcache.jit_bisect_limit => 0 => 0 opcache.jit_blacklist_root_trace => 16 => 16 opcache.jit_blacklist_side_trace => 8 => 8 opcache.jit_buffer_size => 128M => 128M opcache.jit_debug => 0 => 0 opcache.jit_hot_func => 127 => 127 opcache.jit_hot_loop => 64 => 64 opcache.jit_hot_return => 8 => 8 opcache.jit_hot_side_exit => 8 => 8 opcache.jit_max_exit_counters => 8192 => 8192 opcache.jit_max_loop_unrolls => 8 => 8 opcache.jit_max_polymorphic_calls => 2 => 2 opcache.jit_max_recursive_calls => 2 => 2 opcache.jit_max_recursive_returns => 2 => 2 opcache.jit_max_root_traces => 1024 => 1024 opcache.jit_max_side_traces => 128 => 128 opcache.jit_max_trace_length => 1024 => 1024 opcache.jit_prof_threshold => 0.005 => 0.005 opcache.lockfile_path => /tmp => /tmp opcache.log_verbosity_level => 1 => 1 opcache.max_accelerated_files => 10000 => 10000 opcache.max_file_size => 0 => 0 opcache.max_wasted_percentage => 5 => 5 opcache.memory_consumption => 128 => 128 opcache.opt_debug_level => 0 => 0 opcache.optimization_level => 0x7FFEBFFF => 0x7FFEBFFF opcache.preferred_memory_model => no value => no value opcache.preload => no value => no value opcache.preload_user => no value => no value opcache.protect_memory => Off => Off opcache.record_warnings => Off => Off opcache.restrict_api => no value => no value opcache.revalidate_freq => 2 => 2 opcache.revalidate_path => Off => Off opcache.save_comments => On => On opcache.use_cwd => On => On opcache.validate_permission => Off => Off opcache.validate_root => Off => Off opcache.validate_timestamps => On => On |
よし!PHP8.3にバージョンアップした!お疲れ!後でブログ書く!https://t.co/p6h8PmFCxK
— adachin👾SRE (@adachin0817) December 8, 2023
PHP8 JITの効果
おおん!?PHP8でJITの設定してみたら、WordPressのダッシュボードが1.5sから0.5sに高速化したぞ!すげえ..
— adachin👾SRE (@adachin0817) December 9, 2023
JITの設定をしてみると、ダッシュボードの速度が1秒早くなりました。ちなみに以下Query Monitor プラグインを利用して、各WordPressのレスポンス速度を可視化してくれるのでオススメです。レスポンスタイムも750msから650ms台に早くなりました。
- 補足
JITを有効にすると、コードはZend VMではなくCPU自体により実行されるため、計算速度が向上します。WordPressなどのウェブアプリのパフォーマンスは、 TTFB、データベースの最適化、HTTPリクエストなどのその他の要素にもよるものです。したがって、WordPressなどのアプリに関しては、PHPの実行速度が大幅に向上することは期待できません。
あれ…なんで早くなったのかはAPM入れないと分からなそうではある。
まとめ
PHP8.3へのバージョンアップの取り組みは開発環境等作っていたので楽でしたが、もう少し本番同等の環境を作るべきでした。今後は継続的にDBをリストアするCI/CDを作りたいと思います。また、PHP8の機能について把握できたのと、そんなに手間がかからなくてよかったです。ちなみにこのブログサーバーはDroplets(EC2的な)でAnsibleで管理しているので、バージョンアップ大変だなーという感じです。やるか分からないですが、コンテナ移行するなら大変ですね..次はNewRelicでモニタリングしてみたのをやります!
0件のコメント