2020年9月にオンライン開催した、NTT Performance Tuning Challenge (旧称N-ISUCON)2020で実際に使用したプログラムです。 競技当日の雰囲気はこちらをご覧ください。
本戦では、競技VM 3台 (2Core 2GB) で開催しました。 また、ベンチマーカとしてのVM (16Core) を複数台用意し、実際に負荷をかけました。
このリポジトリのコードを用いて、競技VMをデフォルト1台(最大3台)、ベンチマーカVMを最大1台 (2Core 2GB) 起動して、実際の競技を体験することができます。
- コンピュータ(いずれか一つが必要)
- Windows 8以降が動作するコンピュータ
- macOS 10.13以降が動作する、IntelアーキテクチャのMac
- いずれもディスクに30GB以上の空き領域が必要で、またメモリが8GB以上必要・16GB以上を推奨します。
- ソフトウェア(すべて必要)
- VirtualBox (https://www.virtualbox.org/)
- Vagrant (https://www.vagrantup.com/)
動作確認はWindows 10 1909およびmacOS 10.15が動作するコンピュータで行っています。 VirtualBoxが動作するLinuxディストリビューションが入ったコンピュータでも動作すると考えられますが、確認はしていません。
Windows環境の場合、Hyper-Vが現に動作している環境では VirtualBoxの仮想マシンが起動しないため、起動に失敗します。 Hyper-V機能を削除するか、一時的に無効にしてご利用ください。
このリポジトリを適当なディレクトリにクローンしてください。
このURLから、ファイル (ntt-ptc-2020-materials.zip) をダウンロードしてください。
このファイルは当面の間ダウンロードできますが、突然提供を終了する場合があります。その際はこちらで告知します。
告知なくダウンロードできなくなっている場合はIssueでお知らせください。
ダウンロードしたZIPファイルを、リポジトリのルートに配置します。
その後同じディレクトリに展開してください。
infra
ディレクトリ以下のしかるべき箇所に、ファイルが展開されるようになっています。
Windows (PowerShell) の場合
Expand-Archive -Path .\ntt-ptc-2020-materials.zip -DestinationPath .\
macOSの場合
unzip ntt-ptc-2020-materials.zip
注意: macOSの場合、ZIPファイルをFinderで展開しないでください。リポジトリ内にある必要なファイルが削除されてしまいます。
競技VMはVagrantコマンドを使って起動できます。 ローカルのディスク領域が足りない問題を回避するため、Vagrantの実験機能をオンにする必要があります。
Windows (PowerShell) の場合
$env:VAGRANT_EXPERIMENTAL="disks"; vagrant up
macOSの場合
VAGRANT_EXPERIMENTAL="disks" vagrant up
デフォルトでは、競技VMが1台、ベンチマーカが1台起動します。 初回起動時にAnsibleが走り、自動で環境が作られます。相当の時間がかかるのでお待ちください。
IPアドレスが衝突する場合は、Vagrantfileを修正してください。 デフォルトでは、192.168.33.11-13, 101 にVMが起動する設定になっています。
起動時間をできるだけ短縮するため、競技VMはデフォルトで1台起動するようになっています。
台数を追加して負荷分散に取り組むなどしたい場合は、Vagrantfile内の APP_COUNT
を増やしてください(最大は3です)。
その後改めて vagrant up
してください。その際はホストのメモリの枯渇にご注意ください。
本戦のレギュレーションのうち、技術に関連する部分は下記のとおりです。
- 競技時間は6時間
- 参加者は与えられたソフトウェア、もしくは自ら競技時間中に実装したソフトウェアを用います
- 運営から、高速化対象のソフトウェアとして複数言語で実装したWebアプリケーションが与えられます
- 各言語ごとの実装において、性能が同一であることは保証されません
- 次のことは行っても差し支えありません
- 各サーバのソフトウェアの入れ替え
- 設定の変更
- ソフトウェアのソースコードの変更および入れ替え
- 次のことは禁止します
- 与えられたサーバ以外の外部リソースを利用する行為(例:自身で持ち込んだ計算機への処理の委譲など)
- (注:当日は各チームに対してVMが3台割り当てられており、その内側で処理を完結させてください、というニュアンスです)
- 高速化対象のソフトウェアのうち、次の点を変更すること
- アクセス先のURI
- レスポンス (HTML) のDOM構造、JavaScript/CSSファイルの内容(ただし、表示に影響しない範囲での修正は許可される)
- 画像および動画等のメディアファイルの内容
- 与えられたサーバ以外の外部リソースを利用する行為(例:自身で持ち込んだ計算機への処理の委譲など)
- 次の点に留意してください
- サーバ再起動後に全てのアプリケーションコードが正常に動作する状態にすること
- ベンチマーク実行時にアプリケーションに書き込まれたデータがサーバ再起動後も取得できること
VMへは、 vagrant ssh
を利用してログインしてください。
また、競技用のコードは ptc-user
ユーザで管理されているので、ユーザの切り替えも実施してください。
vagrant ssh app1
sudo su - ptc-user
home dirに、 app/
ディレクトリがあり、その中に言語別の実装が入っています。
初期状態では競技アプリは起動していないので、下記コマンドで起動してください。
sudo systemctl start nplus_${言語}
また、 app1
の 80/tcp はVirtualBoxホストの8001/tcpにフォワードされます。
ホストのブラウザから http://localhost:8001
にアクセスすることで、ブラウザでアプリケーションの動作を確認できます。
詳しくは Vagrantfile
を確認してください。
appと同様に、 vagrant ssh
を利用して接続してください。
ベンチマーカは ptc_admin
ユーザで管理されているので、ユーザの切り替えも実施してください(ユーザー名の真ん中がアンダースコアである点に注意してください)。
vagrant ssh bench1
sudo su - ptc_admin
~/bench
に移動すると、ベンチマークのスクリプト群が配置されています。
ベンチマークは、 run.sh
で実行できます。
cd ~/bench
./run.sh
run.shは、192.168.33.11 (app1) に対してベンチマークを実施します(本戦でもベンチマーク対象は先頭のVM 1台のみでした)。
ベンチマークは3つの段階があり、実際のスコアの測定はSTEP3で行われます。
- DB初期化
- (API整合性チェック)
- 事情によりスキップしています。詳細は下記の「おことわり」をご覧ください。
- ベンチマーク
- WarningやErrorが出ますが無視してください。
STEP3が終了後、標準出力にスコアが出力されます。
STEP3: Succeeded in benchmark for 192.168.33.11. Caluculating score...
________________________________________________________________________
< Congratulations! Score: 239, Success requests: 119, Failed requests: 0 >
------------------------------------------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
問題の特性と環境上の都合から、ベンチマーカの動作を本戦当日と変更しています。変更した点は主に次のポイントです。
現在時刻がAPI整合性チェックの成否に関わるため、API整合性チェックそのものを実行しないようにしてあります(必ずエラーが出てしまう)。 そのような設計になったのは考慮漏れであると言わざるを得ません。お詫びします。
結果の如何に関わらずAPIテストを実行したい場合は、 run.sh
に -t
オプションをつけて実行してください。
なおSTEP2が失敗した場合はSTEP3へは進まず、エラー終了します。
負荷を次の通り軽減しています。
- Audiences, artists, oldUsers(トークンが無効になっているユーザー)の同時アクセス数を1にした(本戦ではそれぞれ12, 4, 4)
ベンチマークを走行させるには非常に多くのメモリを必要とします。本戦と同等の負荷をかけるためにはRAMが少なくとも16GB以上必要なことがわかっており、少なくともラップトップで走行させるのは現実的ではないためです。この関係でキャンペーンレベルを2または3に設定するとベンチマーカが異常終了します。
ホストのメモリが潤沢にある場合はベンチマーカのメモリを増やせます。 Vagrantfile
の bench1
ノードにおける vb.memory
の値を調節してください。
本戦と同等の処理負荷をかけるには、 run.sh
に -o
オプションをつけて実行してください。キャンペーンレベル1でベンチマーカのメモリが16GB以上あれば完走できると考えられますが、検証していません。
STEP3が異常終了して、メッセージ中に fatal error: runtime: out of memory
と表示されるときはホストのメモリが不足しています。ブラウザなどメモリを多く使うアプリケーションを終了してください。
このリポジトリ上のファイルはすべて現状有姿で提供され、NTTコミュニケーションズ株式会社は明示的・暗黙的に関わらずあらゆる保証を提供いたしません。 詳しくは LICENSE をご覧ください。
本戦に利用した環境をそのまま提供することを目的としているため、このリポジトリに対するpull requestには応答いたしません。ご了承ください。
This repository is under NO maintenance.
動作に必要な環境を準備の上、手順通りに操作しても環境が起動できないといったトラブルに関しては、 上記にかかわらずIssueでの報告を受け付けます。なお回答に時間を要する場合がある点をご了承ください。
ただしVagrantやVirtualBoxのインストール方法、Hyper-Vを削除・無効化する方法など必要な環境を準備する方法にはお答えできません。
© NTT Communications Corporation 2020