概要
この文章は2023年4月頃から6月に至るまでコンテストのunratedが連続してしまった問題についての報告と対応についてまとめたものです。
ご利用いただいている皆様にご不便をおかけしてしまい、大変申し訳ありませんでした。
unratedが連続した要因として、大きく2つの問題が連続したことによって2ヶ月にわたる障害へと繋がってしまいました。以下はその2つについてそれぞれ説明いたします。
DDoS攻撃によってatcoder.jpにアクセスしづらい状況が頻発したこと
この項目は、DDoS攻撃により、2023年4月頃からatcoder.jpにアクセスしづらくなっていた障害についてまとめたものになります。
概要
4月ごろから、弊社の運営する atcoder.jpを標的としたDDoS攻撃を受けました。それによる防ぎきれないトラフィックにより、通常のユーザにも影響が発生してしまい、障害となってしまいました。
発生日時(当社のログによる)
- 2023/4/9 19:20 - 19:24
- 2023/4/15 10:12 - 10:13, 21:32 - 21:47, 22:11 - 22:14
- 2023/4/16 11:31 - 11:34
- 2023/4/18 09:20 - 09:21
- 2023/4/19 11:16 - 11:17, 19:52 - 19:53
- 2023/4/20 16:16 - 16:20
- 2023/4/22 21:02 - 21:03, 21:11 - 21:14, 21:22 - 21:26
- 2023/4/25 09:08 - 09:09, 10:34 - 10:35, 20:56 - 20:57
- 2023/4/26 17:53 - 17:53, 23:08 - 23:11
- 2023/4/27 12:58 - 13:01, 15:49 - 15:52, 19:16 - 19:16
- 2023/5/1 22:30 - 22:34
- 2023/5/2 20:43 - 20:45
- 2023/5/3 11:23 - 11:25, 12:49 - 12:50
- 2023/5/4 21:55 - 21:57, 22:07 - 22:07
- 2023/5/5 12:22 - 12:23, 21:20 - 21:22
- 2023/5/6 16:58 - 16:59
- 2023/5/8 20:45 - 20:46
- 2023/5/11 22:34 - 22:37
- 2023/5/13 21:08 - 21:10, 21:22 - 21:24, 22:32 - 22:36, 22:51 - 22:52
- 2023/5/14 17:49 - 17:50
- 2023/5/16 21:16 - 21:21, 21:29 - 21:31
- 2023/5/25 21:50 - 21:50, 21:55 - 21:55, 22:00 - 22:01, 22:07 - 22:08
- 2023/5/26 02:24 - 02:24
影響範囲
- atcoder.jpを利用しているすべてのユーザ
原因
- 悪意のある第三者からの200,000req/secを超えるリクエストに耐えられず、レスポンスが返せない状況に陥りました
これまでに行ったコンテスト中のアクセスを大幅に超えるアクセス数であり、コンテスト時に増強しているサーバ数であっても処理しきれないアクセスでした。
対応
- リクエストの制限
悪意ある膨大なリクエストを受けた場合にシステムが応答不能となるのを避けるため、悪意あるリクエストを遮断する措置を取りました。
- 通常のユーザには影響のない範囲で、単位時間あたりのリクエスト数を大幅に制限しました
- 上記リクエスト数によるアクセス制限をされてもなお異常なアクセスをし続けるIPアドレスを順次BANするようにしました
- DDoSに対応したWAFを導入しました
- 提出一覧ページをログイン必須にしました
- サーバが処理しきれないリクエストを受けたとき即座にエラーを返すようにしました
- リクエストの処理時間が想定外に長かった場合に中断するようにしました
- サーバの増強
大量のリクエストを捌けるよう、サーバの増強を行いました
- アプリケーションサーバの台数を増やしました
- 不要なリクエストの削減や高速化
リクエストの制限や単純にサーバの台数を増やすだけでなく、処理の高速化を図り負荷軽減を行いました。
- 特にアクセスの多かった一部ページをキャッシュするようにしました
- ブラウザタブのフォーカスが切れている際、clarとジャッジステータスの自動更新を抑制するようにしました
これらの対応により、6/22現在、5/26以降のDDoSによる攻撃による障害が発生していないことを確認しております。
[2023/6/23 追記] atcoder.jpでは、平常時とコンテスト時で予想されるアクセス数の差異に応じて、適切な数のアプリケーションサーバにて運用しています。特に、コンテスト時においては、DDoS攻撃などのリスクを考慮し、大幅なアプリケーションサーバの増強を実施しています。この対策により、予想の困難なDDoS攻撃によるサーバへの影響を最小限に抑えることができます。安定したパフォーマンスの確保に努めており、コンテストへの影響を最小限に抑えることが目的です。
現在検討中のさらなる対応
- CAPTCHAの導入
- 特定の環境下において正常に動作しない可能性があるため、導入の可否について慎重に検討してまいります
- より踏み込んだシステムの高速化
- 対応策で述べた不要なリクエストの削減・高速化は比較的即座に対処できるもののみしか行っておりません
- 現在抜本的な修正を行っております
採点の遅れによりコンテストが通常通り実施できなかったこと
この項目は、ジャッジ、apiサーバの設定ミスにより採点の遅れが発生し、2023/6/3のABC304および2023/6/17のABC306がunratedになってしまった障害についてまとめたものになります。
概要
AtCoderのジャッジシステムは実行を行い採点を行うジャッジサーバが複数台と、これらジャッジサーバを束ねるapiサーバと呼んでいる1台の管理サーバで構成されています。
2023/6/3に行われたABC304では、多数のTLEでジャッジが占有されたためジャッジ台数を追加したところ、ARPキャッシュがオーバーフローを起こしapiサーバに通信障害が発生しました。この問題については2023/6/5に対応いたしました。
2023/6/17に行われたABC306では別の問題が発生しました。
ジャッジを行うために必要なテストケースやソースコードをapiサーバから各ジャッジサーバに配布を行っているのですが、この通信量がボトルネックとなり、ジャッジに必要なデータ配布が完了しない事態となってしまいました。
今回、改めて調査を行った結果、原因が判明したため、apiサーバの強化を行った上で負荷テストを行い正常にコンテストが実施できると判断するに至っております。
発生日時
- 2023/6/3 21:50頃 - 01:00頃
- 2023/6/17 21:54 - 23:55頃
影響範囲
- atcoder.jpにおいて、問題やカスタムテストにソースコードを提出したユーザ
原因
根本的な原因はジャッジサーバの増加に対して適切なapiサーバの設定、増強を行わなかったことです。
- 1000台を超えるジャッジサーバの起動によりARPキャッシュがオーバーフローを起こしました
- これによりapiサーバからジャッジサーバやDBなどへの通信障害が発生し、正常にジャッジが行えなくなっていました
- apiサーバで確保されているネットワーク帯域を大幅に超える通信が発生したため、ジャッジに必要な各種ファイルのダウンロードが終了せずジャッジが開始されない現象が発生しました
- 今回のコンテストで問題が顕在化した要因については推測ではありますが、ジャッジサーバ台数やコンテストにおける提出数、ABCにおける問題数の増加により、以前よりもapiサーバのネットワーク通信量が増加したためと考えております
対応
- ARPキャッシュが溢れないよう、カーネルパラメータの見直しを行いました
- apiサーバの強化を行いました
上記対応後、ABC304およびABC306における提出の3倍に相当する負荷テストを実施し、問題ないことを確認しております。
検討中の対応・再発防止策
- 今後さらなるジャッジサーバの増加にも対応できるようにするためシステム構成の見直しを検討しています
- ジャッジデータをapiサーバからではなく、外部ストレージサービス等からダウンロードしてくることも検討しています
- 現時点でもAtCoderではサービスが正常に稼働していることを確認するために様々なメトリクスを取得していますが、今回の障害を踏まえて追加の監視項目を検討しております
経緯
日付 | 時間 | 発生事案/対処 |
---|---|---|
2023/6/3 | 21:48ごろ | ジャッジキューに提出が滞留しているアラートを検知 |
2023/6/3 | 21:52 | 問題セットとしてTLEの多いものになっていると判断し、ジャッジを追加 |
2023/6/3 | 22:01 | ジャッジをさらに追加 |
2023/6/3 | 22:33 | RDSの名前解決に失敗しているログから、ジャッジ台数が多すぎることによる問題への対処を検討 |
2023/6/4 | 16:00ごろ | 検証の結果RDSの名前解決に失敗していたのはARPテーブルのサイズが原因だと判明。設定を変更、ジャッジ台数を増やしても同様のエラーが起きないことを確認 |
2023/6/17 | 21:54 | ジャッジキューに提出が滞留しているアラートを検知 |
2023/6/18 | 00:59 | ABC304と同様の提出を行う負荷テストを実施 |
2023/6/18 | 01:30 | ABC304を模した負荷テストにて、ジャッジキューに提出が滞留する現象を確認 |
2023/6/18 | 01:53 | apiサーバにて監視しているメトリクスに異常はみられなかったが、ネットワーク転送量が異常に低い値を保っていたため、インスタンスタイプの変更を実施 |
2023/6/18 | 02:30 | ABC304を模した負荷テストにて、ジャッジが正常に動作するのを確認 |
2023/6/18 | 03:19 | ABC306を模した負荷テストを実施 |
2023/6/18 | 04:59 | ABC306を模した負荷テストが正常に動作するのを確認 |
2023/6/18 | 05:14 | ABC304中に提出されたソースコードを一斉にジャッジし、立てたジャッジがすべてフルで稼働することを確認 |
※負荷テストを行う際、キャッシュが無い状態を再現するために、毎回ジャッジを新規に立て直して行っています。
度重なるコンテスト unrated によりユーザの皆様に多大なご迷惑をおかけしてしまい大変申し訳ございませんでした。引き続き安定したコンテスト運営に向けて全力で取り組んでまいります。