概要

この文章は2023年4月頃から6月に至るまでコンテストのunratedが連続してしまった問題についての報告と対応についてまとめたものです。

ご利用いただいている皆様にご不便をおかけしてしまい、大変申し訳ありませんでした。

unratedが連続した要因として、大きく2つの問題が連続したことによって2ヶ月にわたる障害へと繋がってしまいました。以下はその2つについてそれぞれ説明いたします。

DDoS攻撃によってatcoder.jpにアクセスしづらい状況が頻発したこと

この項目は、DDoS攻撃により、2023年4月頃からatcoder.jpにアクセスしづらくなっていた障害についてまとめたものになります。

概要

4月ごろから、弊社の運営する atcoder.jpを標的としたDDoS攻撃を受けました。それによる防ぎきれないトラフィックにより、通常のユーザにも影響が発生してしまい、障害となってしまいました。

発生日時(当社のログによる)

影響範囲

原因

これまでに行ったコンテスト中のアクセスを大幅に超えるアクセス数であり、コンテスト時に増強しているサーバ数であっても処理しきれないアクセスでした。

対応

  1. リクエストの制限

悪意ある膨大なリクエストを受けた場合にシステムが応答不能となるのを避けるため、悪意あるリクエストを遮断する措置を取りました。

  1. サーバの増強

大量のリクエストを捌けるよう、サーバの増強を行いました

  1. 不要なリクエストの削減や高速化

リクエストの制限や単純にサーバの台数を増やすだけでなく、処理の高速化を図り負荷軽減を行いました。

これらの対応により、6/22現在、5/26以降のDDoSによる攻撃による障害が発生していないことを確認しております。

[2023/6/23 追記] atcoder.jpでは、平常時とコンテスト時で予想されるアクセス数の差異に応じて、適切な数のアプリケーションサーバにて運用しています。特に、コンテスト時においては、DDoS攻撃などのリスクを考慮し、大幅なアプリケーションサーバの増強を実施しています。この対策により、予想の困難なDDoS攻撃によるサーバへの影響を最小限に抑えることができます。安定したパフォーマンスの確保に努めており、コンテストへの影響を最小限に抑えることが目的です。

現在検討中のさらなる対応

採点の遅れによりコンテストが通常通り実施できなかったこと

この項目は、ジャッジ、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サーバの強化を行った上で負荷テストを行い正常にコンテストが実施できると判断するに至っております。

発生日時

影響範囲

原因

根本的な原因はジャッジサーバの増加に対して適切なapiサーバの設定、増強を行わなかったことです。

対応

上記対応後、ABC304およびABC306における提出の3倍に相当する負荷テストを実施し、問題ないことを確認しております。

検討中の対応・再発防止策

経緯

日付時間発生事案/対処
2023/6/321:48ごろジャッジキューに提出が滞留しているアラートを検知
2023/6/321:52問題セットとしてTLEの多いものになっていると判断し、ジャッジを追加
2023/6/322:01ジャッジをさらに追加
2023/6/322:33RDSの名前解決に失敗しているログから、ジャッジ台数が多すぎることによる問題への対処を検討
2023/6/416:00ごろ検証の結果RDSの名前解決に失敗していたのはARPテーブルのサイズが原因だと判明。設定を変更、ジャッジ台数を増やしても同様のエラーが起きないことを確認
2023/6/1721:54ジャッジキューに提出が滞留しているアラートを検知
2023/6/1800:59ABC304と同様の提出を行う負荷テストを実施
2023/6/1801:30ABC304を模した負荷テストにて、ジャッジキューに提出が滞留する現象を確認
2023/6/1801:53apiサーバにて監視しているメトリクスに異常はみられなかったが、ネットワーク転送量が異常に低い値を保っていたため、インスタンスタイプの変更を実施
2023/6/1802:30ABC304を模した負荷テストにて、ジャッジが正常に動作するのを確認
2023/6/1803:19ABC306を模した負荷テストを実施
2023/6/1804:59ABC306を模した負荷テストが正常に動作するのを確認
2023/6/1805:14ABC304中に提出されたソースコードを一斉にジャッジし、立てたジャッジがすべてフルで稼働することを確認

※負荷テストを行う際、キャッシュが無い状態を再現するために、毎回ジャッジを新規に立て直して行っています。

度重なるコンテスト unrated によりユーザの皆様に多大なご迷惑をおかけしてしまい大変申し訳ございませんでした。引き続き安定したコンテスト運営に向けて全力で取り組んでまいります。