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はコードが読めて中身に変なものがあっても直せるのが売りなので、それを許さないことで高速化を達成しているものと比較しても仕方がない。