adiary置き換え計画始動から連なる、Lyndbaum v4.35アップデートの続き。
今回は改善系の対応を行った。
画面表示時のスケルトン探索処理の効率化
本家と比較したときにパフォーマンスが劣化しているの対応で原因調査をしていたら、スケルトン探索処理の問題が原因だったため、そこを直した。
具体的にはテンプレートエンジンが呼び出しているパーツの探索を効率化した。adiaryのテンプレートエンジンはスケルトンと呼ばれるファイルで管理されており、動的表示のためにサイドバーにあるモジュールや記事、ページのフレームなどの単位でスケルトンが分割されている。
そしてこのシステムは標準スケルトンとテーマスケルトンに分かれており、テーマスケルトンで標準スケルトンを上書きするという振る舞いをしている。Lyndbaumではレスポンシブデザインに適用させるためスケルトンの分割方式を変えていてスケルトンファイルが従来より増えている。
adiary本来の処理では、標準側とテーマ側でファイルがあるかを1つずつ確認していたため、スケルトンファイルの増加によりシステムコールの回数が増えてパフォーマンスの劣化に繋がっていた。今回はこの方式をやめ、何のスケルトンがあるかのキャッシュをあらかじめ作っておき、無駄な探索をしないようにした。
その他細かい無駄な処理を見直し微妙に早くなるようにしている。
FCGIモードでの比較
改修の前後でFCGIモードで極力条件をそろえた状態でベンチマークをとった結果が以下だ。
前提としてadiaryはsatsuki2/satsuki2テーマ、Lyndbaumはlyndbaum/lyndbaumテーマを使っており、記事数もadiaryよりLyndbaumのほうが若干多いため、ベンチマーク的にはadiaryのほうが有利な状況になっている。
またベンチマーク方式はadiary公式の方式に可能な範囲で合わせている。但し計測したマシンについては以下の通りスペックがだいぶ異なる。
| 構成 | 製品 | 備考 |
|---|---|---|
| OS | Ubuntu 26.04.1 LTS | |
| Perl | v5.40.1 | |
| CPU | AMD Ryzen 5 8500G | 6C12T 3.5GHz TDP65W |
| MEM | Crucial CP2K16G60C36U5W | DDR5-6000 16GB * 2 |
| Storage | Crucial P1 CT500P1SSD8JP | NVMe SSD 500GB |
FCGIモードでのベンチスコア
今回の測定結果としては本家より早くなった。計測はサービスを再起動して即座に測定したが手動操作なので起動経過時間で見ると数秒の誤差がある。
ローカルで実行しているため通信のオーバーヘッドは極めて少なく、極めていい値が出ている。これは本家のベンチスコアも同様だろう。
| CMS | Ver | abコマンド | req/s | 平均応答(ms) |
|---|---|---|---|---|
| adiary | v3.52b | ab -n 2000 -c 100 -l |
1184.12 | 84.451 |
| adiary | v3.52b | ab -n 100 -c 1 -l |
294.8 | 3.392 |
| lyndbaum | v4.35 | ab -n 2000 -c 100 -l |
1091.55 | 91.613 |
| lyndbaum | v4.35 | ab -n 100 -c 1 -l |
225.67 | 4.431 |
| lyndbaum | v4.36 | ab -n 2000 -c 100 -l |
1375.58 | 72.697 |
| lyndbaum | v4.36 | ab -n 100 -c 1 -l |
291.23 | 3.434 |
CGIモードでの比較
CGIを実行する環境がないので、さくらのレンタルサーバー上で動かしているのをローカルのabから叩いた結果になる。さくらのレンタルサーバーにはabが入っていないのでローカルから叩くしかなかった。
テーマや記事データなどはFCGI版と同じ条件でやっている。
また実装の修正と検証に時間がかかった関係で、同一時刻での計測ができておらず、結果は余りあてにならない。一応同じ時間帯にadiaryとlyndbaumの比較はしているが、手間の関係でlyndbaumのバージョンアップ前後での確認は飛ばしている。
Perlのバージョンはv5.32.1だった。
CGIモードでのベンチスコア
リモートサーバーに繋ぎに行っているため-kでKeepAliveを有効にしている。
見た感じは改善してそうだが、通信のオーバーヘッドが入っているほか、CGIの起動時間が重いこともあり、数値の信憑性は怪しい可能性がある。しかしそれでも明らかに遅いように見えたのが僅かに早くなったので満足した。
| CMS | Ver | abコマンド | req/s | 平均応答(ms) |
|---|---|---|---|---|
| adiary | v3.52b | ab -n 2000 -c 100 -l -k |
306.69 | 326.06 |
| adiary | v3.52b | ab -n 100 -c 1 -l -k |
11.16 | 89.635 |
| lyndbaum | v4.35 | ab -n 2000 -c 100 -l -k |
311.13 | 321.406 |
| lyndbaum | v4.35 | ab -n 100 -c 1 -l -k |
11.43 | 87.489 |
| adiary | v3.52b | ab -n 2000 -c 100 -l -k |
263.89 | 378.945 |
| adiary | v3.52b | ab -n 100 -c 1 -l -k |
5.23 | 191.33 |
| lyndbaum | v4.36 | ab -n 2000 -c 100 -l -k |
268.2 | 372.851 |
| lyndbaum | v4.36 | ab -n 100 -c 1 -l -k |
5.43 | 184.152 |
ベンチマーク測定元ソース
記事に出したベンチマークスコアの元ネタ
| CMS | 走行時間 | Ver | モード | 記事数 | コメント数 | タグ数 | 並列数 | 件数 | keep-alive | 失敗 | req/s | 平均応答(ms) | Connect平均 | TTFB平均 | 50% | 95% | 99% | 最大 | ab |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| adiary | 12時くらい | v3.52b | CGI | 766 | 71 | 208 | 100 | 2000 | あり | 0 | 306.69 | 326.06 | 4 | 301 | 54 | 2434 | 4944 | 5289 | ab -n 2000 -c 100 -l -k |
| adiary | 12時くらい | v3.52b | CGI | 766 | 71 | 208 | 1 | 100 | あり | 0 | 11.16 | 89.635 | 12 | 60 | 87 | 110 | 293 | 293 | ab -n 100 -c 1 -l -k |
| lyndbaum | 12時くらい | v4.35 | CGI | 779 | 70 | 208 | 100 | 2000 | あり | 0 | 311.13 | 321.406 | 4 | 294 | 68 | 2246 | 4707 | 5020 | ab -n 2000 -c 100 -l -k |
| lyndbaum | 12時くらい | v4.35 | CGI | 779 | 70 | 208 | 1 | 100 | あり | 0 | 11.43 | 87.489 | 12 | 62 | 87 | 106 | 227 | 227 | ab -n 100 -c 1 -l -k |
| adiary | 12時くらい | v3.52b | FCGI | 766 | 71 | 208 | 100 | 2000 | なし | 0 | 1184.12 | 84.451 | 31 | 13 | 81 | 95 | 127 | 139 | ab -n 2000 -c 100 -l |
| adiary | 12時くらい | v3.52b | FCGI | 766 | 71 | 208 | 1 | 100 | なし | 0 | 294.8 | 3.392 | 1 | 2 | 3 | 4 | 4 | 4 | ab -n 100 -c 1 -l |
| lyndbaum | 12時くらい | v4.35 | FCGI | 779 | 70 | 208 | 100 | 2000 | なし | 0 | 1091.55 | 91.613 | 18 | 9 | 93 | 105 | 143 | 165 | ab -n 2000 -c 100 -l |
| lyndbaum | 12時くらい | v4.35 | FCGI | 779 | 70 | 208 | 1 | 100 | なし | 0 | 225.67 | 4.431 | 1 | 3 | 4 | 5 | 5 | 5 | ab -n 100 -c 1 -l |
| adiary | 22時くらい | v3.52b | CGI | 766 | 71 | 208 | 100 | 2000 | あり | 0 | 263.89 | 378.945 | 8 | 340 | 80 | 2866 | 5532 | 5800 | ab -n 2000 -c 100 -l -k |
| adiary | 22時くらい | v3.52b | CGI | 766 | 71 | 208 | 1 | 100 | あり | 0 | 5.23 | 191.33 | 30 | 96 | 134 | 487 | 1275 | 1275 | ab -n 100 -c 1 -l -k |
| lyndbaum | 22時くらい | v4.36 | CGI | 779 | 70 | 208 | 100 | 2000 | あり | 0 | 268.2 | 372.851 | 9 | 323 | 59 | 2070 | 5642 | 5814 | ab -n 2000 -c 100 -l -k |
| lyndbaum | 22時くらい | v4.36 | CGI | 779 | 70 | 208 | 1 | 100 | あり | 0 | 5.43 | 184.152 | 28 | 91 | 113 | 501 | 734 | 734 | ab -n 100 -c 1 -l -k |
| lyndbaum | 22時くらい | v4.36 | FCGI | 780 | 70 | 208 | 100 | 2000 | なし | 0 | 1375.58 | 72.697 | 31 | 13 | 69 | 83 | 117 | 130 | ab -n 2000 -c 100 -l |
| lyndbaum | 22時くらい | v4.36 | FCGI | 780 | 70 | 208 | 1 | 100 | なし | 0 | 291.23 | 3.434 | 1 | 2 | 3 | 4 | 4 | 4 | ab -n 100 -c 1 -l |
Lyndbaumテーマで記事タイトルの頭に線を引くようにした
なんとなく記事の境目が分かりづらいなという気がしていたのでマークをつけてみた。本当は横線を上にひこうと思っていたのだが、なんかいまいちだったので頭に縦線を引くことにした。
HTTPクライアントをIPv6対応にした
なんとadiaryのHTTPクライアントはIPv4にしか対応していなかった。このため自宅サーバーで自分のドメインに対してHTTPクライアントを実行すると確定で繋がらない問題があった。
IPv6に対応させることでこれを解決した。また拒否IPリストもIPv6に対応させたため、v4.34で行った制限でv6が漏れていた問題にも対応した。
ポートは80か443以外の疎通を許可していないので、妙なポートが疎通することはないが、認証をかけていなければ開けてしまうのでGrafanaやPHPMyAdminとかはちゃんと保護してないと疎通してしまう。そもそも管理コンソールが外から開ける時点でおかしいので、最低でもBasic認証くらいは掛けていてほしいが…w
[&https://]記法でOGカードを出せるようにし、正しく出ないものについても解消した
[&https://]記法で正しく動かないケースがあるの解消。元々この対応をする過程で一個前の課題が浮上したのだが、こっちも不具合とそれとは別の不満があり、直すことにした。
まずこの記法はリンクを書く手間を減らすためのもので、リンク先によってはリッチに出せるものだったが、基本的には[サイトタイトル][https://example.com]のショートハンドでしかなかった。
そしてGitHubを指定するとリッチに出るはずだったのだが、どうにもバグっており[&https://github.com/Lycolia]と書くと<script src="https://gist-it.appspot.com/github/Lycolia"></script>が出力される状態だった。悪意のあるスクリプトが出てきたら即死するところだった。
元の仕様がイケてないのと超ド級のヤバ不具合があったため、リンクカードを出せるようにし、scriptタグが入らないようにした。scriptタグの検査は見た感じ甘そうだが、構造上滅多に入らないと思うので一旦放置している。
あとがき
ベンチマークをとる環境の整備とベンチマークの記録と実際の動作確認やら記事向けに余計な情報を取捨選択するやらなにやらで今回の対応はだいぶ疲れた。正直途中で止めて日曜コミットしようかと思ったが、気合で土曜中にやり切った。
お陰でv4.34アップデートのあとがきに書いたとおり、五年半ぶりにGitHubの草を縦に繋げることができた。このためだけにv4.36に乗せるものを減らしたくらいだ。23時にFixさせると絶対に間に合わないので可能な限り19時、遅くとも21時Fixを目指したが、結局余計な機能をねじ込んでしまいFixは22時になった。それでも何とか土曜中にPRを収めマージしきったので何とかなった。手前で映画鑑賞録なんて書くから…
Go製CGIで触っていて明らかに早かったSerene Bach v4でのベンチマークもとって比較しようと思ったが、データコンバートが面倒なのと、へとへとなのでそこは取りやめにした。そもそもバイナリにスクリプトが勝負しても仕方ない。
CGIはコードが読めて中身に変なものがあっても直せるのが売りなので、それを許さないことで高速化を達成しているものと比較しても仕方がない。