本文通過ECS訪問ApsaraDB for MongoDB的方式,壓測ApsaraDB for MongoDB的不同規格複本集執行個體的最大串連數。
測試環境
建立ECS執行個體和ApsaraDB for MongoDB複本集執行個體。如何建立,請參見棄置站台集執行個體和建立ECS執行個體。
本次測試的執行個體配置如下:
配置項 | ECS執行個體 | ApsaraDB for MongoDB雲端硬碟架構執行個體 | ApsaraDB for MongoDB本地碟架構執行個體 |
地區及可用性區域 | 華北2(北京)可用性區域H | 華北2(北京)可用性區域H | 華北2(北京)可用性區域H |
網路類型 | Virtual Private Cloud | Virtual Private Cloud | Virtual Private Cloud |
執行個體規格類型系列 | 計算平衡增強型c6e | 通用型和獨享型 | 通用型和獨享型 |
執行個體規格 | ecs.c6e.2xlarge | 包含三種在售規格,詳情請參見測試結果。 | 包含兩種在售規格,詳情請參見測試結果。 |
儲存類型 | ESSD AutoPL雲端硬碟 | ESSD雲端硬碟 | 本地碟 |
執行個體或鏡像版本 | Alibaba Cloud Linux 3.2104 LTS 64位 | 4.19.91-26.al7.x86_64 | 3.10.0-327.ali2017.alios7.x86_64 |
MongoDB核心版本 | 不涉及 |
|
|
測試採用的ApsaraDB for MongoDB執行個體為標準複本集拓撲結構(三節點,包含一個主節點、一個從節點和一個隱藏節點)。
測試採用的ECS執行個體和ApsaraDB for MongoDB執行個體在同一地區及可用性區域下,RTT(Round-Trip Time)平均值為0.103ms。
測試載入器
本次壓力測試將採用開源社區的YCSB 0.17.0壓測工具。
說明YCSB是一款用Java編寫的支援多種資料庫的效能測試工具,具體安裝和使用方法請參見YCSB。
本次壓力測試將使用到自訂的串連數壓測程式,關於自訂的串連數壓測程式的介紹,請參見關於96000串連數測試的補充說明。
測試方法
- 將ECS執行個體的主私網IP添加到ApsaraDB for MongoDB執行個體的白名單中。如何添加,請參見修改白名單。說明 您可以登入ECS控制台,在執行個體詳情頁面的網路資訊地區查看ECS執行個體的主私網IP。
- 遠端連線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控制台,在資料庫連接頁面的私網串連 - 專用網路地區查看串連地址。
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控制台,在資料庫連接頁面的私網串連 - 專用網路地區查看串連地址。
您在使用上述命令是需要指定
maxPoolSize
參數,如果不指定該參數的話,其預設值僅為100,會導致測試過程中遇到MongoWaitQueueFullException
的錯誤,從而無法達到期望的最大串連數。
查看測試執行個體的監控資訊,具體操作,請參見基本監控。
您需要在基本監控頁簽下,選擇本次測試對應的時間段,查看執行個體的CPU使用率、記憶體使用量率、操作QPS數、串連數和串連數使用率指標。
關於96000串連數測試的補充說明
由於YCSB測試依賴於Java環境,但JVM的最大堆記憶體存在上限。在進行高並發數(threads > 20000)運行測試時會出現形如下圖的Cannot allocate memory
錯誤,從而導致測試無法繼續進行。
即便是臨時調大Java的JAVA_OPTS
配置參數也依舊會出現錯誤。為瞭解決該問題,您需要選擇使用自訂的串連數壓測程式。壓測程式的邏輯如下:迴圈產生若干線程,每個線程產生1個MongoClient用戶端,用戶端執行查詢後保持一段時間內部不釋放串連即可。
因為單台壓測用戶端機器的連接埠數量有限,所以單台壓測用戶端機器已無法滿足32核128 GB規格的串連數(最大串連數96000)測試,您需要在多台壓測用戶端機器上同時運行相同的壓測程式。
查詢壓測用戶端機器的當前連接埠範圍的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
目標最大串連數:8000
操作QPS數 | 串連數 | 串連數使用率 | CPU使用率 | 記憶體使用量率 |
受限於基本監控視圖的分鐘級採樣粒度,視圖中未能顯示當時達到的最大串連數資訊。實際上當時串連數已經達到了8000,您可以通過細粒度的監控或者serverStatus
結果的connections
子文檔來確認。
獨享型32核128 GB
目標最大串連數:96000
操作QPS數 | 串連數 | 串連數使用率 | CPU使用率 | 記憶體使用量率 |
因使用的壓測工具跟另外兩個測試不同,以上的QPS、CPU和記憶體使用量率監控截圖並不具備可比性。
通用型8核32 GB
目標最大串連數:16000
操作QPS數 | 串連數 | 串連數使用率 | CPU使用率 | 記憶體使用量率 |
本地碟版
通用型16核64 GB
目標最大串連數:32000
操作QPS數 | 串連數 | 串連數使用率 | CPU使用率 | 記憶體使用量率 |
受限於基本監控視圖的分鐘級採樣粒度,該通用型規格執行個體的部分採樣時間點由於CPU使用率滿導致採集命令逾時而失敗,監控出現斷點,因此會出現分鐘級的波穀,當時的實際串連數持續為32000。
獨享型2核16 GB
目標最大串連數:8000
操作QPS數 | 串連數 | 串連數使用率 | CPU使用率 | 記憶體使用量率 |
總結
不同規格、不同架構的ApsaraDB for MongoDB複本集執行個體均可以達到其規格對應的最大串連數。
當達到最大串連數之後,MongoDB會拒絕後續串連。業務側會因無法建立串連而出現請求延遲高或卡頓。
並發的串連數越多,執行個體的CPU和記憶體等資源的開銷會越大。建議您根據實際業務情況,合理控制執行個體的串連數。