💡
private-isuのメンテナンスよもやま話
ISUCON 夏祭り 2023 発表資料
自己紹介
- 本名:金子達哉
- 株式会社PR TIMES開発本部長CTO
- 2021/4入社
-
達人が教えるWebパフォーマンスチューニング〜ISUCONから学ぶ高速化の実践(技術評論社)(通称:ISUCON本)の著者の1人
- 6章「リバースプロキシの利用」・7章「キャッシュの活用」・8章「押さえておきたい高速化手法」を担当
- ISUCON9予選・ISUCON6本選運営
- 今年のISUCON13はアドバイザーとして運営に関わります
- catatsuyというIDで各種SNSをやっています
- かたついと呼ばれることが多いです
private-isuの歴史
- 2016年:ピクシブ社の社内ISUCONとして作成
- 2017年:ISUCON7予選対策としてISUCON公式ブログで紹介 https://isucon.net/archives/50697356.html
- 2021年:PR TIMES社の社内ISUCONとして利用
- 2022年:ISUCON本の題材として採用
サポート情報
言語
- サポート済:Ruby(オリジナル実装)、Go、PHP
- 放置中:Node.js(リポジトリ内はJavaScript、最近のISUCONではTypeScriptが主流)
環境
- VM構築:Ansible
- provisioning済みのAMIも提供
- 動作確認:Docker Compose
時代の変遷への追従
- Ubuntu LTSの新バージョン
- Go, Ruby, PHPのアップデート
- ライブラリのバージョンアップ
Ubuntu 22.04 対応
- ISUCON本はUbuntu 20.04ベースだが、最新のLTSは22.04
- 20.04と22.04でISUCON本上の手順の変更はなし
- 22.04のAMIを提供
- PHPバージョン差異:
- Ubuntu 20.04: PHP 7.4
- Ubuntu 22.04: PHP 8.1
- Ubuntu 22.04ではホームディレクトリの権限変更
- デフォルト権限が
0700
になり、PHP実装が動かなくなったので対応
- デフォルト権限が
PHP実装の対応
- ライブラリのバージョンアップによりPHP 7.4非対応に
- DockerでPHP 8.2対応済み
- ライブラリ更新に伴う問題は都度修正
- Dockerのbase imageのDebianバージョンアップで動作しなくなったので
php:8.2-fpm-bullseye
に固定
Ruby実装のトラブルと対処
- rackの変更で、ベンチマーカーが利用するGoのhttp.Clientの自動リダイレクトが不具合を引き起こすように
- 詳細:RackとGoのhttp.Clientの相性問題について
- Goのhttp.Clientはmultipart/form-dataのPOSTでRedirectすると、Content-Typeを保持したまま、boundaryが空のGETを送るが、これはrackで例外発生
- Goのhttp.ClientのRedirectはCheckRedirectでカスタマイズ可能
- だが、ISUCON本で紹介している負荷試験ツールk6ではカスタマイズ方法がない
- rack middlewareでGET時のContent-Typeを削除
- https://github.com/catatsuy/private-isu/pull/315/files
- Special thanks to sorah.
class DropContentTypeFromGet
def initialize(app)
@app = app
end
def call(env)
env.delete "CONTENT_TYPE" if env.fetch('REQUEST_METHOD') == 'GET'
@app.call(env)
end
end
use DropContentTypeFromGet
Go実装の変更
- gojiを使用していると、private-isuのURL形式である
/@user_name
を実現できないため、独自実装- chiを使用するとこの問題を回避でき、さらにchiの方が現在人気があるため、chiへの移行を選択
- ISUCON本ではgojiについての言及はなく、patchもそのまま適用可能であったため、変更をmerge済み
- https://github.com/catatsuy/private-isu/pull/293/files
- gorilla/sessionsが一時的にメンテナンスを停止していたが、再度活動を再開
- しかし、新しいタグのリリースはまだ行われておらず、現在メーリングリストでその点について質問中
renovateの活用
- renovateを導入することで、ライブラリの更新やDocker imageの更新を自動化できる
- メンテナンスで課題となっていたのは、Ansible上のRubyとGoのバージョンアップ
- renovate.jsonに設定を記述することで、スムーズに更新を行うことができるように
- 設定はコメントを指定できる
- https://github.com/catatsuy/private-isu/pull/390/files
"regexManagers": [
{
"fileMatch": [
"provisioning/image/ansible/04_xbuild.yml"
],
"matchStrings": [
"datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\n.*?-install (?<currentValue>[0-9.]*).*\n"
]
},
{
"fileMatch": [
"provisioning/bench/ansible/02_golang.yml"
],
"datasourceTemplate": "golang-version",
"depNameTemplate": "golang",
"matchStrings": [
"go(?<currentValue>[0-9]*.[0-9]*.[0-9]*)"
]
}
],
# datasource=golang-version depName=golang
現状できていないこと
- CI
- ベンチマーカーをE2Eテストとして利用するためには、初期データ(結構大きい)をMySQLに入れる必要がある
- AMI自動作成
- やることはAnsibleの実行とREADMEの変更
- AMIは1年で消えるので定期的に作成する必要がある
- 「できたらいいな」というレベル
最後に
- メンテナンスは大変だが、業界のため続けるつもり
- 当初の予想を超える展開に驚き😂
- 多くの環境での対応は、皆さんの期待に応えるため
- 活用したら教えてくれるとうれしいです
- メンテナンス協力者を募集中!
Discussion