本文通過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工具載入測試資料。
./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錯誤,從而導致測試無法繼續進行。
OpenJDK 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
OpenJDK 64-Bit Server VM warning: DBWrapper: report latency for each error is false and specific error codes to track for latency are: []INFO: os rrno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 12288 bytes for committing reserved memory.
OpenJDK 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
# An error report file with more information is saved as:
# /root/ycsb-0.17.0/hs_err_pid101727.log
DBWrapper: report latency for each error is false and specific error codes to track for latency are: []
OpenJDK 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
DBWrapper: report latency for each error is false and specific error codes to track for latency are: []OpenJDK 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
OpenJDK 64-Bit Server VM warning: DBWrapper: report latency for each error is false and specific error codes to track for latency are: []INFO: os rrno=12)
[thread 140023352145472 also had an error]
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f59ba0a2000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)
即便是臨時調大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子文檔來確認。
mgset-xxx:PRIMARY> db.serverStatus().connections
{
"current" : 7854,
"available" : 146,
"totalCreated" : 7857,
"internal_current" : 27,
"internal_available" : 7973,
"internal_totalCreated" : 7029,
"active" : 9,
"exhaustIsMaster" : 4,
"exhaustHello" : 2,
"awaitingTopologyChanges" : 6
}
獨享型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和記憶體等資源的開銷會越大。建議您根據實際業務情況,合理控制執行個體的串連數。
























