2020年11月18日

学生も迎え、チューニングコンテストを独自に開催
Webアプリケーションのスピード化を競う「NTT Performance Tuning Challenge」

チケット予約サイト「n-plus」の画面イメージ

課題となったチケット予約サイト「n-plus」

NTTコミュニケーションズ株式会社(以下、NTT Com)とNTTリミテッド・ジャパン株式会社の有志メンバーで構成するNTT Performance Tuning Challenge 2020事務局(以下、N-PTC事務局)は2020年9月、NTTグループの技術者のスキルアップを支援するWebアプリケーションチューニングコンテスト「NTT Performance Tuning Challenge」を開催しました。全てリモート開催でしたが、NTTグループと、NTT Comグループに興味を持ってくれている学生にも門戸を広げ、計115人が参加しました。大会の様子や参加者がチャレンジした課題について、そして、事務局メンバーがこのコンテスト開催を通じて得たものをご紹介します。


エンジニアから注目が高まるチューニングコンテスト

近年、Webアプリケーションを開発するエンジニアの間では、実践的な技術を競うチューニングイベントが人気を博しています。LINE株式会社が2011年から主催している「ISUCON」が本家ですが、今年の大会(予選)には1000人を超える参加者がありました。競技に参加することで、「プログラミング」「ミドルウエア・OS」「各種アルゴリズム」「ボトルネックの調査」の知識や実践力が磨かれ、スキルアップにつながるためです。また、競技を進める上で「チーム力」も求められます。

NTT Comグループでも、2019年度にグループ社員を対象に「N-ISUCON」を開催(開発者ブログ)。NTTグループ内のエンジニアが集うイベント「NTT Engineers Festa」で取り組みを発表したところ「NTT Comグループ以外からも参加できるようにしてほしい」という声が挙がり、さらに、学生向けのTech WorkshopとしてN-ISUCONを実施した際も非常に好評でした。

そこで今年度は、NTTグループや学生に門戸を広げ、名称を「NTT Performance Tuning Challenge」に変えて開催することにしました。新型コロナウイルス感染症対策として全てリモートで実施しましたが、NTT Comグループ64人、NTTグループ(NTT Comグループを除く)36人、学生15人の計115人(47チーム)が参加してくれました。

あらためて説明すると、NTT Performance Tuning Challengeは、N-PTC事務局がISUCONの出題内容を参考に独自に作成・アレンジした課題(Webアプリケーション)を、制限時間内にいかに高速化できるかを競うチーム対抗のプログラミングコンテストです。チーム構成は最大3人。スコアは、N-PTC事務局が準備したベンチマーカーで計測し、最も優れたスコアを出したチームが優勝となります。

NTTグループ内で開催している「NTT Coding Challenge」というイベントの姉妹大会として位置づけられているほか、ISUCON参加に向けた“模試”としても利用してもらえるよう、大会の前後には練習会や課題のポイント解説も行います。

NTT Performance Tuning Challenge当日の様子

初めてのリモート開催とあって運営はいろいろと手探りでしたが、開会式やボトルネックの解説、優勝インタビューを含む閉会式はTeamsの音声通話を利用、競技中のアナウンスはSlackを活用しました。

当日のスコアボードは下図の通りです。今年は、昨年以上に混乱した様子で進行しました。スコアが大きく動いたのは午後からで、数チームが団子状態から抜け出しましたが、それでも、事務局メンバーが想定していたより低い点数に。大会終了30分前に点数を一気に伸ばしたチームが出てきて、勝敗が決しました。最後の上がり幅はとても大きく、上位チームの完勝と言える点差が付きました。

大会終了時点のスコアボードのイメージ

大会終了時点のスコアボード

優勝したのは、NTTテクノクロスから参加したチーム「新米」。NTT Comグループの中での最上位は、2位の「レゾベアーズ」(NTTレゾナントとNTT Comとの混合チーム)でした!

順位のイメージ、1位新米、2位レゾベアーズ、3位Masato、4位情シス若手、5位SMB

優勝チームの「新米」や学生メンバーで参加してくれた「Кошка」の皆さんが、ブログでNTT Performance Tuning Challengeについて書いてくれています。こちらもお読みいただければと思います(社外サイトにつながります)。

【課題解説】チケット予約サイト「n-plus」

ここで、課題の解説を行います。今年は、イベント用のチケット予約サイト「n-plus」を出題しました。

n-plusには、大きく分けて「観客向け」と「イベント主催者向け」の2つの機能があります。観客向けには、イベント表示やチケットの予約(購入)、予約の確認・キャンセル機能を、イベント主催者向けには、イベントの登録や更新、観客の予約確認などの機能を提供します。

チケット予約サイト「n-plus」のチケット予約、観客向け機能の画面イメージ

観客向け機能の画面

チケット予約サイト「n-plus」のチケット予約、イベント主催者向け機能の画面イメージ

イベント主催者向け機能の画面

そして、今年度の題材には、業務でもよく取り扱う“権限”の概念を取り入れました。具体的には、n-plusへの認証方法として、JSON Web Token(以下、JWT)を採用しています。本来、JWTを用いた認証はアンチパターンとして知られていますが、問題となるボトルネックの1つとして採用しました。

n-plusに盛り込んだ代表的なボトルネックの紹介

n-plusは応答が遅く、非常にユーザー体験の悪いサイトとなっています。これは、パフォーマンスを下げるボトルネック(原因)をいくつも盛り込んでいるため。盛り込んだ代表的なボトルネックは以下の通りです。

  • N+1クエリ
  • Indexが"全く"はられていないテーブル
  • 画像データが保存されたカラム
  • 失効したJWTをテキストファイルで保存し続ける

ここでは、「失効したJWTをテキストファイルで保存し続ける」というボトルネックについて紹介します。

先述したように、認証はJWTを利用します。n-plusにユーザーがログインした際、JWTのトークンが生成され、ログイン中はこのトークンを利用することでログイン状態を維持します。また、JWTには有効期間を設定することができ、この期間を過ぎるとトークンは無効化される仕組みです。

ユーザーが自らログアウトを行った場合も考えてみましょう。ログアウト後にユーザーが無効なトークンでアクセスした際には、ログインが必要となる操作ができないよう、提示されたトークンが有効かどうかをチェックする必要があります。

今回の課題では、無効なトークンをテキストファイルで保存していました。初期状態として100万件(172MB)のリストを保持しています。これは、証明書の失効リスト(CRL)からアイデアを得て取り入れたものです。

この実装には、2つの問題点があります。1つは、ディスク(HDD/SSD)からのファイルの読み込みが非常に遅いということです。一般的には、メモリからの読み込みに比べ、最大で80倍程度の時間がかかることが知られています。もう1つは、保持しているリストのうち9割はすでに有効期限が切れており、無駄な照合が実行されているという点です。

解決策として、失効済みトークンをRedis(インメモリDB)やMySQL(RDB)に保存することでディスクアクセスに比べ高速に処理できるようにする方法や、有効期限切れのトークンをリストから排除するという方法があります。

事務局メンバーの声

チケット予約サイト「n-plus」の画面イメージ

実装のcommit数(赤が開催週)

今年のN-PTC事務局メンバーは12人でしたが、問題が複雑になったこともあり、昨年以上に締め切りに追われる状況でした。開催が近づくにつれcommit数が増えていくような開発で、「実践DDD(締切駆動開発)だ」などと笑っていました。

大変な時もありましたが、事務局メンバーもNTT Performance Tuning Challengeに取り組むことで、さまざまな学びを得ることができました。具体的には、以下のような点です。

  • 同一題材を複数の言語で実装するため、普段使わない言語の特徴などが学べる
  • 新たなメンバーで開発を行うため、いつもとは違う観点でのレビューを受けたり、便利なツールを知ることができる

競技に参加しているメンバーも、事務局の立場で参加するメンバーも、共に技術を磨き高め合えるのがチューニングコンテストのいいところです。

第2位だった「レゾベアーズ」がスコアアップのためにどのような対策を講じたのか、そのために日々心掛けてきたことをこちらで紹介しています。社内はもちろん、社外イベントへの参加状況などについてもご紹介します。

日々の取り組みが実を結んだ! レゾベアーズの「NTT Performance Tuning Challenge 2020」参戦記

社員メッセンジャー

NTTリミテッド・ジャパンICTインフラサービス部

花川 直己

企業向けクラウドサービスECL2.0のベアメタルサーバーと専用ハイパーバイザーの開発をしています。趣味で社内イベントなどを実施し、ソフトウエアエンジニアが楽しいと思える環境づくりのお手伝いなどもしています。

関連記事

お問い合わせ

NTT Comでは、いつでもご連絡をお待ちしています。
ご用件に合わせて、下記の担当窓口からお問い合わせください。