社内ポータルサイトパッケージ負荷検証結果


モチヤで開発・販売している社内ポータルサイトパッケージは、組織構造に合わせたアクセス制御を行うシステムです。アクセスするユーザーに応じて、記事の表示・非表示が切り替わるため、Webサーバーの性能もそれなりに求められます。
毎月のサーバー費用は固定費となるため、どの程度の費用がかかるかで、システムを導入するか、しないか変わってくるかと思います。
そこで、特定の負荷に対してWebサーバーおよび、DBサーバーの性能が必要か負荷検証試験を行いました
応答性能に関してはP95(N=100 個のサンプルを最低利用率から最高利用率にソートした場合、95 番目の位置にあるサンプルを選択)に対して、応答速度が2000ms以内を達成できるかを検証しました。
- 目標: 「認証済みユーザー 200 同時接続でトップページ P95 2000ms 以内」
- 拡張: 400〜1000 VUs(Virtual Users) までのスケーラビリティとコスト/構成トレードオフ把握
テストデータ数
社内ポータルサイト(Drupal)には、1万人(10,000ユーザー)の社員がいる会社を想定し、以下のテスト用データを事前に登録します。
部署グループ
- 部署ツリーの深さ: 4
- 各階層毎の部署数 (全585部署)
- 第1階層の部署数: 1
- 第2階層の部署数: 8
- 第3階層の部署数: 64
- 第4階層の部署数: 512
- 部署グループとユーザーのマッピング
- 第1階層の部署に割り当てるユーザー数: 50
- 第2階層の部署に割り当てるユーザー数: 300ユーザー
- 第3階層の部署に割り当てるユーザー数: 1000ユーザー
- 第4階層の部署に割り当てるユーザー数: 8650ユーザー
- 属性グループ
- 役員, 正社員, 契約社員, パートの4つ
- 属性グループとユーザーのマッピング2
- 役員に割り当てるユーザー数: 30
- 正社員に割り当てるユーザー数: 7000
- 契約社員に割り当てるユーザー数: 1000
- パートに割り当てるユーザー数: 1970
テスト用記事数
- コンテンツタイプ1: 5000件
- コンテンツタイプ2: 5000件
- 各ノードに登録するアクセス制御の設定3
- 部署: 1-3個
- 部署の範囲: 「指定部署のみ」 or 「指定部署以下」
- 個別ユーザー: 0-3ユーザー
利用ライブラリとサーバー構成
AWS負荷試験環境
負荷検証のAWS環境は下記の通りで、負荷検証時には可用性を高めるため、Multi-AZを採用しています。
利用環境
- Drupal Core 11 + 階層構造によるアクセス権限制御 + Umami
- DB: Amazon RDS for MySQL (Graviton 世代 m7g 系/X86 m7i 系)
- 実行環境: AWS ECS Fargate (X86_64 と ARM64(Graviton))
- キャッシュ: ElastiCache (Valkey/Redis 相当), Drupal 標準キャッシュ
- データ/サイト: 負荷試験用スクリプトで生成
試験結果
全試験パターン結果は下記の通りです。
No | VUs | ECS Tasks | CPU Arch | RDS | P95(ms) | RPS | ボトルネック |
1 | 200 | 1 | x86_64 | m7g.large | 2836 | 86.8 | ECS CPU |
2 | 200 | 2 | x86_64 | m7g.large | 1366 | 174.6 | ECS CPU |
3 | 300 | 2 | x86_64 | m7g.large | 2110 | 174.5 | ECS CPU |
4 | 300 | 3 | x86_64 | m7g.large | 1301 | 288.2 | ECS CPU |
5 | 400 | 3 | x86_64 | m7g.large | 1792 | 288.6 | ECS CPU |
6 | 400 | 4 | x86_64 | m7g.large | 1303 | 400.1 | ECS CPU |
8 | 400 | 6 | x86_64 | m7g.large | 1063 | 491.2 | RDS CPU |
9 | 600 | 6 | x86_64 | m7g.large | 1575 | 481.0 | RDS CPU |
10 | 600 | 6 | x86_64 | m7g.xlarge | 1387 | 542.9 | ECS CPU |
11 | 600 | 8 | x86_64 | m7g.xlarge | 1045 | 774.0 | ECS CPU |
12 | 800 | 8 | x86_64 | m7g.xlarge | 1414 | 776.6 | ECS CPU |
13 | 1000 | 8 | x86_64 | m7g.xlarge | 1743 | 766.7 | ECS CPU |
14 | 800 | 6 | x86_64 | m7g.xlarge | 1907 | 563.0 | ECS CPU |
15 | 1000 | 6 | x86_64 | m7g.xlarge | 2441 | 576.1 | ECS CPU |
16 | 200 | 1 | x86_64 | m7i.large | 2692 | 93.8 | ECS CPU |
17 | 400 | 4 | x86_64 | m7i.large | 1403 | 350.8 | ECS CPU |
18 | 400 | 6 | x86_64 | m7i.large | 1224 | 434.9 | RDS CPU |
19 | 600 | 6 | x86_64 | m7i.large | 1717 | 428.4 | RDS CPU |
20 | 200 | 1 | ARM64 | m7g.large | 1676 | 143.9 | ECS CPU |
21 | 400 | 3 | ARM64 | m7g.large | 853 | 434.5 | ECS CPU |
22 | 600 | 6 | ARM64 | m7g.xlarge | 839 | 872.2 | ECS CPU |
23 | 800 | 6 | ARM64 | m7g.xlarge | 1131 | 870.7 | ECS CPU |
24 | 1000 | 6 | ARM64 | m7g.xlarge | 1411 | 869.9 | ECS CPU |
24 | 1000 | 8 | ARM64 | m7g.xlarge | 1342 | 940.0 | RDS CPU |
25 | 1000 | 4 | ARM64 | m7g.xlarge | 2131 | 565.3 | ECS CPU |
26 | 1000 | 5 | ARM64 | m7g.xlarge | 1709 | 715.3 | ECS CPU |
主要な性能結果(閾値: P95 ≤ 2000ms)
- X86_64 Fargate + RDS m7g.large(初期構成)での達成タスク数:
- 200 VUs: タスク 1 では 2836ms → タスク 2 で 1366ms (達成)
- 300 VUs: タスク 2 で 2110ms → タスク 3 で 1301ms (達成)
- 400 VUs: タスク 3 で 1792ms (達成済) / 4~6 でさらに短縮 (最良 1063ms ただし RDS CPU がボトルネック化)
- 600 VUs: タスク 6 + RDS m7g.large で 1575ms (RDS ボトルネック) → RDS を m7g.xlarge にすると 1387ms → タスク 8 で 1045ms
- 800 VUs: タスク 6 で 1907ms (達成) → 8 で 1414ms
- 1000 VUs: タスク 6 で 2441ms (未達) → 8 で 1743ms (達成)
スケーリング挙動分析
ECS タスク数 vs P95 改善率
- ボトルネックが ECS 側にある領域では「タスク数増加率」と「P95 改善率」はほぼ正の相関
例: 1→2 タスク ( +100% ) で P95 2836→1366ms ( +108% 改善換算 ) - タスクを増やしても RDS が先に飽和すると限界効用逓減 (例: 400 VUs で 3→6 タスクは改善するが途中で RDS CPU が支配的に)
アクセス制御モジュール観点の含意
- 階層構造による権限コントロールモジュールの 計算(ユーザー所属部署ツリー + 属性グループ展開)は CPU 集約的処理としてスレッド(= PHP FPM 相当プロセス/ワーカ)スケールで水平分散可能
- 階層クエリで RDS への参照頻度が増える状況では DB CPU 過負荷 → モジュール側キャッシュ (memory + persistent) のヒット率設計が重要
- 設計上、ユーザー単位の権限 を memory + persistent キャッシュに保存しており、同一リクエスト内 / 以降のリクエストでCPU / DB 負荷を抑制する戦略が機能していると推測
コスト試算
200VUsをP95 2000msを達成するには、1か月あたり、$953で、$1 150円で計算をすると、約14万円です。しかし実運用では夜間や、業務時間中に200VUsのアクセスは来ません。
AWS構成(構成詳細はお問合せいただきましたら開示させていただきます)
コスト試算をする上で、下記の通りとアクセス数を仮定します。
- 最もアクセスが集中する時間(業務開始時間など):1日1時間(200VUs)、約 $1.32/日
- アクセスが集中する時間:1日3時間(100VUs)、約 $2.91/日
- それ以外(夜間や、実業務が忙しい時間帯):1日20時間(20VUs)、約 $14.74/日
合計:$18.97/日、$569.1/日($1 = 150円、85,365円)
結論、上記条件における1か月のサーバー費用(実費)
※ この負荷検証結果は1万人規模の会社を想定した検証結果のデータです。記事数、ユーザー数、カスタマイズ内容、為替などにより価格は変動いたしますため、参考値としてご参照ください。またモチヤではサーバー利用料を定額で利用することもできます。
85,365円 / 月($1 = 150円換算)
ECSタスク数と、レスポンス速度増加率の相関
以下の表は、次の条件にマッチする負荷試験におけるECSのタスク数の増加率とレスポンス速度の増加率を表にしたものです。
- 負荷 (VUs) が同一である
- ボトルネックがECSにある
サンプル数は少ないですが、ECSタスク数の増加率とレスポンス速度の増加率がほぼ正の相関になっていることがわかります。
負荷 (VUs) | 変更前のタスク数 | 変更後のタスク数 | 変更前のレスポンス速度 | 変更後のレスポンス速度 | タスク数の増加率 (%) | 速度の増加率 (%) | 備考 |
200 | 1 | 2 | 2836 | 1366 | 100 | 107.61347 | No.1とNo.2の比較 |
300 | 2 | 3 | 2110 | 1311 | 50 | 60.94584287 | No.3とNo.4の比較 |
400 | 3 | 4 | 1792 | 1303 | 33.33333333 | 37.52877974 | No.5とNo.6の比較 |
600 | 6 | 8 | 1387 | 1045 | 33.33333333 | 32.72727273 | No.10とNo.11の比較 |
800 | 6 | 8 | 1907 | 1414 | 33.33333333 | 34.86562942 | No.12とNo.14の比較 |
1000 | 6 | 8 | 2441 | 1743 | 33.33333333 | 40.04589788 | No.13とNo.15の比較 |
1000 | 4 | 5 | 2131 | 1709 | 25 | 24.69280281 | No.26とNo.27の比較 |
1000 | 5 | 6 | 1709 | 1411 | 20 | 21.11977321 | No.24とNo.26の比較 |
今回、1000Vus P95 2000msまでの検証を行いましたが、恐らくこれ以上のアクセスにおいても、ECSのタスク数及び、RDSの性能をあげることで負荷に対応することが可能と考えています。
なお、1000Vusの場合は、$1,741.07で、日本円に換算しますと約26万円/月です。(AWS構成例はお問合せいただきましたら開示させていただきます)
社内ポータルサイトパッケージ
モチヤの社内ポータルサイトパッケージのサーバー利用料は、上記のAWS利用料(実費)+ サーバー保守及び/死活監視(40,000円/月)を行っている費用を上乗せしております。
https://www.mochiya.ad.jp/drupal/portal-site

阿部 正幸/ 代表取締役
Drupal歴15年、ウェブマーケティング、インフラ構築、AP開発が守備範囲です。
キャッチボール、筋トレ、日本酒、ウイスキーが好きです。天気の良い日に、誰かキャッチボールして、立呑に付き合ってください。
好きなDrupalモジュールはIMCEです。