摘要:命令壓測完后數據庫大小是壓測報告二八原則壓測寫入億條每條日志大小,個字段,字段長度為。表數據大小,表存儲大小,一秒。索引掃描結論日志查詢效率隨著記錄條目增加,掃描效率會下降。按秒響應結果為目標,掃描條目應控制在條以內。
我的專欄地址:我的segmentfault,歡迎瀏覽 一、ycsb壓測工具 1.1ycsb workload
ycsb的workloads目錄下保存了6種不同的workload類型,代表了不同的壓測負載類型,詳細的介紹列在下面:
workloada:混合了50%的讀和50%的寫;
workloadb:Read mostly workload,混合了95%的讀和5%的寫,該workload側重于測試集群的讀能力;
workloadc:Read only,100%只讀
workloadd:Read latest workload,插入數據,接著就讀取這些新插入的數據
workloade:Short ranges,短范圍scan,不同于隨機讀,每個測試線程都會去scan一段數據
workloadf:Read-modiy-wirte,讀改寫,客戶端讀出一個記錄,修改它并將被修改的記錄返回
fieldcount: 每條記錄字段個數 (default: 10) fieldlength: 每個字段長度 (default: 100) readallfields: 是否讀取所有字段true或者讀取一個字段false (default: true) readproportion: 讀取作業比例 (default: 0.95) updateproportion: 更新作業比例 (default: 0.05) insertproportion: 插入作業比例 (default: 0) scanproportion: 掃描作業比例 (default: 0) readmodifywriteproportion: 讀取一條記錄修改它并寫回的比例 (default: 0) requestdistribution: 請求的分布規則 uniform, zipfian or latest (default: uniform) maxscanlength: 掃描作業最大記錄數 (default: 1000) scanlengthdistribution: 在1和最大掃描記錄數的之間的分布規則 (default: uniform) insertorder: 記錄被插入的規則ordered或者hashed (default: hashed) operationcount: 執行的操作數. maxexecutiontime: 執行操作的最長時間,當然如果沒有超過這個時間以運行時間為主。 table: 測試表的名稱 (default: usertable) recordcount: 加載到數據庫的紀錄條數 (default: 0)1.3 BinData
BinData()的第一個參數是BSON二進制子類型,如上所述,它是以下之一:
generic: x00 (0) function: x01 (1) old: x02 (2) uuid_old: x03 (3) uuid: x04 (4) md5: x05 (5) user: x80 (128)1.4ycsb操作命令
加載數據: ./bin/ycsb load mongodb -P workloads/test_insert > result_insert_10000.log 跑壓測: ./bin/ycsb run mongodb -P workloads/test_insert > result_insert_10000.log二、mongodb操作 2.1操作命令
清空表 db.col.remove({}) 查詢一條記錄 db.usertable.find().limit(1) 刪庫: db.dropDatabase() 查看執行效率:db.usertable.find({"_id":"user4520119406760868179"}).explain("executionStats") 查看索引 :db.usertable.getIndexes() 集合文檔數:db.usertable.count() 恢復備份:mongorestore -h 127.0.0.1:27017 --gzip -db collectionName /path 集合記錄數列表: db.getCollectionNames().forEach((name) => {print(name+","+db[name].stats().count)}) 集合按記錄條數排序: db.getCollectionNames().map((name) => db[name]).sort((a,b) => {return a.count()-b.count()}).forEach((db) => {print(db.getName()+","+db.count())}) 查看執行效率:db.log.find({"uid":"508076972", "time":{"$gt":ISODate("2019-01-17T00:01:11Z")}}).explain("queryPlanner") 查看io: iostat -xdm 1 10三、壓測步驟 3.1 ycsb壓測
參考:http://lsr1991.github.io/2015/04/25/ycsb-document-translation-running-a-workload/
1、對mongo進行 95%寫入 , 5%查詢的測試
2、對mongo進行 100% scan的查詢的測試
結果:
3.1.1寫1億條日志,hashed寫入:每條日志 大小1KB, 16個字段,字段長度為64。
top命令:
io:
壓測完后數據庫大小是 136GB:
ycsb 136.250GB
ycsb壓測報告:
[OVERALL], RunTime(ms), 2909439 [OVERALL], Throughput(ops/sec), 34370.88730851549 [TOTAL_GCS_PS_Scavenge], Count, 10132 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 14302 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.4915724302863886 [TOTAL_GCS_PS_MarkSweep], Count, 1 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 27 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 9.280139573299182E-4 [TOTAL_GCs], Count, 10133 [TOTAL_GC_TIME], Time(ms), 14329 [TOTAL_GC_TIME_%], Time(%), 0.4925004442437184 [CLEANUP], Operations, 100 [CLEANUP], AverageLatency(us), 1252.63 [CLEANUP], MinLatency(us), 1 [CLEANUP], MaxLatency(us), 125055 [CLEANUP], 95thPercentileLatency(us), 6 [CLEANUP], 99thPercentileLatency(us), 9 [INSERT], Operations, 100000000 [INSERT], AverageLatency(us), 2873.72475394 [INSERT], MinLatency(us), 141 [INSERT], MaxLatency(us), 169476095 [INSERT], 95thPercentileLatency(us), 8035 [INSERT], 99thPercentileLatency(us), 20767 [INSERT], Return=OK, 1000000003.1.2二八原則壓測 mongo寫入1億條
每條日志 大小608B, 16個字段,字段長度為38B。
top:
io:
壓測完后庫的大小是82GB:
> show dbs admin 0.000GB config 0.000GB local 0.000GB ycsb_1yi 0.697GB ycsb_28 82.100GB
ycsb壓測報告:
[OVERALL], RunTime(ms), 1732198 [OVERALL], Throughput(ops/sec), 57730.12092151128 [TOTAL_GCS_PS_Scavenge], Count, 8024 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 10927 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.6308170313093538 [TOTAL_GCS_PS_MarkSweep], Count, 2 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 42 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.002424665078703474 [TOTAL_GCs], Count, 8026 [TOTAL_GC_TIME], Time(ms), 10969 [TOTAL_GC_TIME_%], Time(%), 0.6332416963880572 [CLEANUP], Operations, 100 [CLEANUP], AverageLatency(us), 73.68 [CLEANUP], MinLatency(us), 1 [CLEANUP], MaxLatency(us), 7155 [CLEANUP], 95thPercentileLatency(us), 3 [CLEANUP], 99thPercentileLatency(us), 12 [INSERT], Operations, 100000000 [INSERT], AverageLatency(us), 1716.96953065 [INSERT], MinLatency(us), 141 [INSERT], MaxLatency(us), 20643839 [INSERT], 95thPercentileLatency(us), 6279 [INSERT], 99thPercentileLatency(us), 147433.1.1寫1億條日志,順序寫入:
top:
io:
壓測完后庫的大小是115GB:
test 173.805GB admin 0.000GB config 0.000GB local 0.000GB ycsb_1yi 0.697GB ycsb_1yi_ordered 115.750GB ycsb_insert_1w 0.012GB ycsb_search 12.562GB
ycsb壓測報告:
[OVERALL], RunTime(ms), 1803374 [OVERALL], Throughput(ops/sec), 55451.61458466186 [TOTAL_GCS_PS_Scavenge], Count, 5738 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 8131 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.4508770781878856 [TOTAL_GCS_PS_MarkSweep], Count, 1 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 27 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0014971935937858703 [TOTAL_GCs], Count, 5739 [TOTAL_GC_TIME], Time(ms), 8158 [TOTAL_GC_TIME_%], Time(%), 0.4523742717816715 [CLEANUP], Operations, 100 [CLEANUP], AverageLatency(us), 54.86 [CLEANUP], MinLatency(us), 0 [CLEANUP], MaxLatency(us), 5343 [CLEANUP], 95thPercentileLatency(us), 7 [CLEANUP], 99thPercentileLatency(us), 19 [INSERT], Operations, 100000000 [INSERT], AverageLatency(us), 1796.96847349 [INSERT], MinLatency(us), 147 [INSERT], MaxLatency(us), 8028159 [INSERT], 95thPercentileLatency(us), 1518 [INSERT], 99thPercentileLatency(us), 3451 [INSERT], Return=OK, 100000000插入性能總結:
規格 | 文檔大小 | count操作記錄數 | _id值 | threads壓測端線程數 | throughput(per second)吞吐 | RAL(us)讀延時** | WAL(us)寫延時** |
---|---|---|---|---|---|---|---|
16核32G | 大小1KB, 16個字段,字段長度為64 | 1億 | hashed | 100 | 34370 | - | 2873 |
16核32G | 大小608B, 16個字段,字段長度為38B | 1億 | hashed | 100 | 57730 | - | 1716 |
16核32G | 大小1KB, 27個字段,字段長度為38B | 1億 | ordered | 100 | 55451 | - | 1796 |
可與阿里云版mongodb性能進行對比:阿里云mongodb性能測試結果頁面
3.2 場景測試 執行命令:db.usertable.find({"field1":"joe"}).explain("executionStats")
db.usertable.find({"field1":"joe","field2":"jack"}).explain("executionStats")
場景1:1千萬條成1KB, 掃表時間250秒, 一秒掃4W條。mongo庫 12GB,一秒49MB。({"field1":"joe"}) 場景2:1千萬條成1KB, 掃表時間322秒。(({"field1":"joe","field2":"jack"}) 場景3:1億條成600B, 掃表時間1800秒, 一秒掃5.5W條。mongo庫 82GB,一秒46.7MB。({"field1":"joe"})生產數據查詢: 全表掃描簡單條件:
場景1掃描字段({"uid":"508076972"}):233393233(2.3億)條,每條547B, 掃表時間518秒, 一秒掃450566條。表存儲大小56GB,一秒108MB。 場景2掃描字段({"eid":"508076972"}):233393233(2.3億)條,每條547B, 掃表時間564秒, 一秒掃413817條。表存儲大小56GB,一秒99MB。 場景3掃描字段({"eid":"508076972"}):119963485(1.2億)條,每條532B, 掃表時間290秒, 一秒掃413667條。表存儲大小25GB,一秒87MB。 場景4掃描字段({"eid":"508076972"}):10144088(1千萬)條,每條536B, 掃表時間28秒, 一秒掃362288條。表數據大小5GB,表存儲大小2.5GB,一秒91MB。 場景5掃描字段({"uid":"508076972"}):10144088(1千萬)條,每條536B, 掃表時間45秒, 一秒掃225424條。表數據大小5GB,表存儲大小2.5GB,一秒56MB。
場景4和5有點奇怪,索引字段的效率還不如非索引字段。通過驗證,發現是索引字段第一次查詢在建立緩存,場景5后續的查詢都在5秒左右完成。
全表掃描復合條件:場景1掃描字段({"eid":"32435346465ddf4","gamechannel":"1010031002"}):233393233(2.3億)條,每條547B, 掃表時間562秒, 一秒掃415290條。表存儲大小56GB,一秒100MB。 場景2掃描字段({"uid":"508076972","eid":"32435346465ddf4"}):233393233(2.3億)條,每條547B, 掃表時間534秒, 一秒掃437065條。表存儲大小56GB,一秒105MB。全表掃描結論
場景2掃描字段({"uid":"508076972","time":"32435346465ddf4"}):秒出結果。
日志查詢效率: 40W記錄/秒, 90MB/秒。 (單字段一次全表掃描,如果復合條件查詢加上相應掃描時間)
索引掃描 time + 非uid:場景1掃描字段({ "time":{"$gt":ISODate("2019-01-17T00:01:11Z"), "$lt":ISODate("2019-01-18T00:01:11Z")}}):16537187(1千萬)條,每條547B, 掃表時間23秒, 一秒掃719008條。 場景2掃描字段({ "time":{"$gt":ISODate("2019-01-19T00:01:11Z"), "$lt":ISODate("2019-01-20T00:01:11Z")}}):17110050(1千萬)條,每條547B, 掃表時間27秒, 一秒掃633705條。 場景3掃描字段({ "time":{"$gt":ISODate("2019-01-19T00:01:11Z"), "$lt":ISODate("2019-01-19T12:01:11Z")}}):11050895(1千萬)條,每條547B, 掃表時間13秒, 一秒掃850068條。 場景4掃描字段({ "eid":"508076972","time":{"$gt":ISODate("2019-01-17T00:01:11Z"), "$lt":ISODate("2019-01-18T00:01:11Z")}}):16537187(1千萬)條,每條547B, 掃表時間26秒, 一秒掃636045條。 場景5掃描字段({ "time":{"$gt":ISODate("2019-01-19T00:01:11Z"), "$lt":ISODate("2019-01-19T10:01:11Z")}}):9423255(1千萬)條,每條547B, 掃表時間10秒, 一秒掃9423255條。 場景6掃描字段({ "time":{"$gt":ISODate("2019-01-17T00:01:11Z"), "$lt":ISODate("2019-01-19T00:01:11Z")}}):32972256(3千萬)條,每條547B, 掃表時間86秒, 一秒掃383398條。 場景7掃描字段({ "time":{"$gt":ISODate("2019-01-17T00:01:11Z"), "$lt":ISODate("2019-01-20T00:01:11Z")}}):50082445(5千萬)條,每條547B, 掃表時間95秒, 一秒掃527183條。 場景8掃描字段({"eid":"508076972", "time":{"$gt":ISODate("2019-01-17T00:01:11Z"), "$lt":ISODate("2019-01-18T00:01:11Z")}}):3586078(3百萬)條,每條547B, 掃表時間5秒, 一秒掃717215條。 場景9掃描字段({"eid":"508076972", "time":{"$gt":ISODate("2019-01-18T00:01:11Z"), "$lt":ISODate("2019-01-19T00:01:11Z")}}):4250364(4百萬)條,每條547B, 掃表時間7秒, 一秒掃607194條。索引掃描結論
日志查詢效率: 隨著記錄條目增加,掃描效率會下降。 按10秒響應結果為目標,掃描條目應控制在 1000W條以內。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77438.html
閱讀 2161·2021-09-04 16:40
閱讀 1453·2021-08-13 15:07
閱讀 3605·2019-08-30 15:53
閱讀 3194·2019-08-30 13:11
閱讀 1069·2019-08-29 17:22
閱讀 1811·2019-08-29 12:47
閱讀 1469·2019-08-29 11:27
閱讀 2221·2019-08-26 18:42