Đánh giá mongoDB với YCSB
Như 1 bài trước mình có hướng dẫn mọi người cài đặt mongodb với docker(https://viblo.asia/p/cai-dat-mongo-cluster-voi-docker-m68Z0NN25kG) hôm nay mình sẽ dùng 1 tool khá phổ biến (YCSB) để tiến hành đánh giá hiệu năng của thằng này xem sao nhé Các bạn cài ycsb theo hướng dẫn sau: ...
Như 1 bài trước mình có hướng dẫn mọi người cài đặt mongodb với docker(https://viblo.asia/p/cai-dat-mongo-cluster-voi-docker-m68Z0NN25kG) hôm nay mình sẽ dùng 1 tool khá phổ biến (YCSB) để tiến hành đánh giá hiệu năng của thằng này xem sao nhé Các bạn cài ycsb theo hướng dẫn sau: https://github.com/brianfrankcooper/YCSB Sau khi các bạn cài đặt mongodb theo như bài viết trước đó của mình. Để ý có 2 services như sau
router0: image: mongo command: mongos --configdb configRs/configsvr0:27017,configsvr1:27017,configsvr2:27017 --port 27017 volumes: - /etc/localtime:/etc/localtime:ro - ./scripts/sharding_replicaset:/scripts/sharding_replicaset ports: - 27017:27017 links: - configsvr2 router1: image: mongo command: mongos --configdb configRs/configsvr0:27017,configsvr1:27017,configsvr2:27017 --port 27017 volumes: - /etc/localtime:/etc/localtime:ro - ./scripts/sharding_replicaset:/scripts/sharding_replicaset ports: - 27018:27017 links: - router0
Đây là 2 routers dùng để giao tiếp với người dùng. router0 có map port 27017 (port mặc định của mongodb khi bạn cài độc lập) ra ngoài. Như vậy từ bên ngoài mình chỉ cần gọi đến url dạng như sau là có thể truy cập vào cả mạng mongodb rồi
mongodb://localhost/healthCareDB
Vì sao chúng ta không cần map cổng ở đây, vì khi gọi mongodb-url, sẽ mặc định lấy cổng là 27017, mà trong cụm docker mình tạo ra, router0 map đúng cổng mặc định của mongo, nên mặc định url sẽ nhận. healthCareDB là tên database mình tạo ra. đây sẽ là database được test. OK, đầu tiên để test, mình phải load data vào cụm trước chứ. Mọi người chạy lệnh ycsb sau:
./bin/ycsb load mongodb -P workloads/workloada -p mongodb.url="mongodb://localhost/healthCareDB?w=1" -p recordcount=100000 -s -threads 32 > outputLoad.txt
Các tham số có ý nghĩa như sau: w = 1, nghĩa là trong 1 replica, chỉ cần ghi thành công 1 node là ok, các node khác sẽ được đồng bộ sau. recordcount là số lượng bản ghi muốn ghi vào cụm. -p có ý nghĩa là property. sau -p là hàng loạt tham số của lệnh ycsb này. -threads 32 nghĩa là có 32 client cùng ghi. Kết quả trả về file outputLoad.txt có dạng như sau:
mongo client connection created with mongodb://localhost:27017/healthCareDB?w=1 [OVERALL], RunTime(ms), 279319.0 [OVERALL], Throughput(ops/sec), 3580.135973564276 [TOTAL_GCS_PS_Scavenge], Count, 26.0 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 110.0 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.039381495709207036 [TOTAL_GCS_PS_MarkSweep], Count, 0.0 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0.0 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0 [TOTAL_GCs], Count, 26.0 [TOTAL_GC_TIME], Time(ms), 110.0 [TOTAL_GC_TIME_%], Time(%), 0.039381495709207036 [CLEANUP], Operations, 1.0 [CLEANUP], AverageLatency(us), 2213.0 [CLEANUP], MinLatency(us), 2212.0 [CLEANUP], MaxLatency(us), 2213.0 [CLEANUP], 95thPercentileLatency(us), 2213.0 [CLEANUP], 99thPercentileLatency(us), 2213.0 [INSERT], Operations, 1000000.0 [INSERT], AverageLatency(us), 276.660963 [INSERT], MinLatency(us), 197.0 [INSERT], MaxLatency(us), 35871.0 [INSERT], 95thPercentileLatency(us), 327.0 [INSERT], 99thPercentileLatency(us), 369.0 [INSERT], Return=OK, 1000000
Nhìn qua file kết quả, ta có các thông số cơ bản như là runtime, throughput, maxLatency và minLatency. về Latency mình đã nói ở những bài trước. Như vậy thay đổi tham số threads ta sẽ có nhiều file output khác nhau.
Như câu lệnh trên là lệnh load dữ liệu, nghĩa là thực hiện 100% ghi. Các lệnh khác (update, read) sẽ có dạng như sau:
./bin/ycsb run mongodb -P workloads/workloadc -p mongodb.url="mongodb://localhost:27017/healthCareDB?w=1" -p operationcount=100000 -s
để ý workloads/workloadc là các kịch bản test được định nghĩa ở đây: https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads Bạn hoàn toàn có thể định nghĩa 1 kịch bản test riêng cho mình bằng các truy cập thư mục ycsb/workloads và tạo ra các file workloads với nội dung như sau:
recordcount=1000 operationcount=1000 workload=com.yahoo.ycsb.workloads.CoreWorkload readallfields=true readproportion=0.5 updateproportion=0.5 scanproportion=0 insertproportion=0 requestdistribution=zipfian
OK, vậy đây là kết quả sau khi chạy test với số lượng threads từ 1-120.