このトピックでは、さまざまな仕様の複数の ApsaraDB for MongoDB レプリカセットインスタンスへの最大接続数のストレステストを実行する方法について説明します。テストは、Elastic Compute Service(ECS)インスタンスから ApsaraDB for MongoDB インスタンスにアクセスすることで実施されます。
テスト環境
ECS インスタンスと ApsaraDB for MongoDB インスタンスを作成します。詳細については、「レプリカセットインスタンスを作成する」および「ECS インスタンスを作成する」をご参照ください。
次の表は、テストで使用される ECS インスタンスと ApsaraDB for MongoDB インスタンスの構成を示しています。
構成項目 | ECS インスタンス | クラウドディスクを使用する ApsaraDB for MongoDB インスタンス | ローカルディスクを使用する ApsaraDB for MongoDB インスタンス |
リージョンとゾーン | 北京ゾーン H | 北京ゾーン H | 北京ゾーン H |
ネットワークタイプ | Virtual Private Cloud(VPC) | VPC | VPC |
インスタンスカテゴリ | c6e、パフォーマンスが向上したコンピューティング最適化インスタンスファミリ | 汎用および専用 | 汎用および専用 |
インスタンスタイプ | ecs.c6e.2xlarge | 3 つの利用可能なインスタンスタイプ。詳細については、「テスト結果」をご参照ください。 | 2 つの利用可能なインスタンスタイプ。詳細については、「テスト結果」をご参照ください。 |
ストレージタイプ | エンタープライズ SSD(ESSD)AutoPL ディスク | ESSD | ローカル SSD |
イメージまたはエンジンバージョン | Alibaba Cloud Linux 3.2104 LTS 64 ビット | 4.19.91-26.al7.x86_64 | 3.10.0-327.ali2017.alios7.x86_64 |
カーネルバージョン | 該当なし |
|
|
テストで使用される ApsaraDB for MongoDB インスタンスは、プライマリノード、セカンダリノード、および非表示ノードで構成される 3 ノードアーキテクチャを採用しています。
テストで使用される ECS インスタンスと ApsaraDB for MongoDB インスタンスは、同じリージョンの同じゾーンにデプロイされ、平均ラウンドトリップ時間(RTT)は 0.103 ミリ秒です。
テストツール
テストでは、オープンソースの Yahoo Cloud Serving Benchmark(YCSB)0.17.0 ツールが使用されます。
説明YCSB は、複数のタイプのデータベースのパフォーマンスをベンチマークするために使用できる Java ツールです。YCSB のインストールと使用方法の詳細については、YCSB をご覧ください。
テストでは、カスタム接続ストレステストプログラムが使用されます。詳細については、「96,000 接続のストレステストに関する追加情報」をご参照ください。
テスト方法
- ECS インスタンスの [プライマリプライベート IP アドレス] を ApsaraDB for MongoDB インスタンスのホワイトリストに追加します。詳細については、「インスタンスの IP アドレスホワイトリストを変更する」をご参照ください。説明 ECS コンソール にログインし、プライマリ プライベート IP アドレス[ネットワーク情報][インスタンスの詳細] ページの セクションで ECS インスタンスの を表示できます。
- ECS インスタンスに接続します。詳細については、「ECS コンソール(エクスプレスバージョン)を使用して ECS インスタンスを作成および管理する」をご参照ください。
YCSB ツールを使用してテストデータを読み込みます。
// ycsb run コマンドを実行します。 ./bin/ycsb.sh load mongodb -s -p workload=site.ycsb.workloads.CoreWorkload -p recordcount=10000000 -p mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin" -p table=test -threads 8
次の設定を変更します。
recordcount=1000000
: ApsaraDB for MongoDB インスタンスにロードされるデータの総量。mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin"
: ApsaraDB for MongoDB インスタンスの接続文字列。テストでは、データベースアカウントは test、データベースは admin です。説明ApsaraDB for MongoDB コンソール の [データベース接続] ページの [内部接続 - VPC] セクションでエンドポイントを取得できます。
threads 8
: テストで使用されるクライアントの同時スレッド数。
次のコマンドを実行して、パフォーマンストレステストを実行します。
./bin/ycsb.sh run mongodb -s -p workload=site.ycsb.workloads.CoreWorkload -p recordcount=10000000 -p operationcount=5000000 -p readproportion=50 -p updateproportion=50 -p requestdistribution=zipfian -p mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin&maxPoolSize=8000" -p table=test -threads 8000
次の設定を変更します。
recordcount=1000000
: ApsaraDB for MongoDB インスタンスにロードされるデータの総量。operationcount=5000000
: 読み取りおよび書き込み操作の総数。insertproportion=0
: ロード操作の比率。readproportion=50
: 読み取り操作の比率。updateproportion=50
: 更新操作の比率。mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin"
: ApsaraDB for MongoDB インスタンスの接続文字列。テストでは、データベースアカウントは test、データベースは admin です。説明ApsaraDB for MongoDB コンソール の [データベース接続] ページの [内部接続 - VPC] セクションでエンドポイントを取得できます。
上記のコマンドを実行するときは、
maxPoolSize
パラメータを構成する必要があります。そうしないと、デフォルトの接続数は 100 になります。この場合、テスト中にMongoWaitQueueFullException
エラーが返され、想定される最大接続数に到達できません。
テストで使用される ApsaraDB for MongoDB インスタンスのモニタリング情報を表示します。詳細については、「ノードモニタリング(以前の基本モニタリング)」をご参照ください。
ノード監視[ノードモニタリング] タブで、テストに対応する期間を選択して、[CPU 使用率]、[メモリ使用量]、[QPS]、[接続数]、および メトリックを表示します。
96,000 接続のストレステストに関する追加情報
YCSB テストは Java 環境に依存します。Java 仮想マシン(JVM)の最大ヒープメモリサイズは制限されています。テストで 20,000 を超える同時スレッドを使用すると、Cannot allocate memory
エラーが返され、テストが中断されます。
JAVA_OPTS
パラメータの値を増やした後も、エラーが発生します。この問題を解決するには、カスタム接続ストレステストプログラムを使用します。ストレステストプログラムは、循環的にいくつかのスレッドを生成します。各スレッドは MongoClient を生成します。MongoClient がクエリを実行した後、MongoClient は解放されずに一定期間接続を維持します。
ストレステストクライアントが実行されている単一のマシンには、ポート数が限られています。したがって、マシンは 32 コアと 128 GB のメモリの仕様で接続のストレステスト(最大 96,000 接続)の要件を満たすことができません。この場合、複数のマシンで同じストレステストプログラムを実行する必要があります。
次の Bash コマンドを実行して、マシンの現在のポート範囲をクエリします。
sysctl net.ipv4.ip_local_port_range
結果例:
net.ipv4.ip_local_port_range = 40000 65535
次のコマンドを実行して、マシンのポート範囲を拡張してから、接続ストレステストを実行します。
sudo sysctl -w net.ipv4.ip_local_port_range="10240 65535"
テスト結果
ESSD を使用するインスタンス
4 コア 8 GB メモリの専用インスタンス
最大接続数: 8,000
QPS | 接続数 | 接続使用率 | CPU 使用率 | メモリ使用量 |
[ノードの監視] タブで分レベルのコレクション粒度を選択した場合、粒度内で到達した最大接続数はタブに表示されません。実際の接続数は 8,000 に達します。これは、詳細な監視を構成するか、serverStatus
コマンドの出力にある connections
サブドキュメントを確認することで確認できます。
32 コア 128 GB メモリの専用インスタンス
最大接続数: 96,000
QPS | 接続数 | 接続使用率 | CPU 使用率 | メモリ使用量 |
最大接続数が 96,000 の場合のテストに使用されるツールは、最大接続数が 8,000 および 16,000 の場合のテストに使用されるツールとは異なります。したがって、QPS、CPU 使用率、およびメモリ使用量に関連する上記のモニタリングスクリーンショットには、不一致があります。
8 コア 32 GB メモリの汎用インスタンス
最大接続数: 16,000
QPS | 接続数 | 接続使用率 | CPU 使用率 | メモリ使用量 |
ローカルディスクを使用するインスタンス
16 コア 64 GB メモリの汎用インスタンス
最大接続数: 32,000
QPS | 接続数 | 接続使用率 | CPU 使用率 | メモリ使用量 |
ノード監視タブで分レベルのコレクション粒度を指定した場合、100% の CPU 使用率によってコレクションコマンドがタイムアウトするため、16 コアおよび 64 GB のメモリを搭載した汎用インスタンスでは、いくつかの時点での接続数が監視されません。この場合、分レベルの谷が発生し、その時点での実際の接続数は 32,000 のままです。
2 コア 16 GB メモリの専用インスタンス
最大接続数: 8,000
QPS | 接続数 | 接続使用率 | CPU 使用率 | メモリ使用量 |
まとめ
さまざまな仕様とストレージタイプの ApsaraDB for MongoDB レプリカセットインスタンスは、仕様に対応する最大接続数に到達できます。
最大接続数に達すると、ApsaraDB for MongoDB は後続の接続を拒否します。接続の確立に失敗したため、リクエストのレイテンシが高いか、アプリケーションでスタックします。
同時接続数が多いほど、CPU やメモリなどのリソースがより多く消費されます。ビジネス要件に基づいて、インスタンスへの接続数を調整することをお勧めします。