YCSB_对mongodb进行性能测试
<h1 class="topictitle1">1、YCSB介绍</h1><p>YCSB,全称为“Yahoo!Cloud Serving Benchmark”,是雅虎开发的用来对云服务进行基础测试的工具,其内部涵盖了常见的NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等等。在运行YCSB的时候,可以配置不同的workload和DB,也可以指定线程数&并发数等其他参数。</p>
<h1>2、安装环境</h1>
<p>基于参考文档(https://github.com/brianfrankcooper/YCSB/tree/master/mongodb )安装java,maven,ycsb </p>
<p>注意,下面工具均需要根据linux系统类型和位数下载对应的rpm包,否则安装不了。使用uname -m 可查看</p>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211223144719878-1303058549.png" alt="" loading="lazy"></p>
<h3><span style="font-size: 1.17em">2.1 安装Java</span></h3>
<p><span style="font-size: 1.17em">下载地址:https://www.oracle.com/java/technologies/downloads</span><br></p>
<p><span style="font-size: 1.17em"><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215161806629-1583127900.png" alt="" width="1078" height="483" loading="lazy" style="font-size: 14px"></span></p>
<p>使用命令安装rpm包</p>
<div class="cnblogs_code">
<pre>rpm -ivh 包名</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215164644188-2117552643.png" alt="" loading="lazy"></p>
<p> 安装后如果想卸载使用命令</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> remove java -y</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215164749050-2030929808.png" alt="" loading="lazy"></p>
<h3>2.2 安装Maven</h3>
<p>下载地址:https://maven.apache.org/download.cgi</p>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215162318724-1522411115.png" alt="" width="1259" height="309" loading="lazy"></p>
<p>解压工具包</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">tar</span> -zxvf apache-maven-<span style="color: rgba(128, 0, 128, 1)">3.8</span>.<span style="color: rgba(128, 0, 128, 1)">4</span>-bin.<span style="color: rgba(0, 0, 255, 1)">tar</span>.gz</pre>
</div>
<p>将解压包的bin目录路径添加到环境变量并使修改文件立即生效</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">echo</span> '<span style="color: rgba(128, 0, 0, 1)">export PATH=$PATH:/root/apache-maven-3.8.4/bin'</span> >> /etc/<span style="color: rgba(0, 0, 0, 1)">profile
source </span>/etc/profile</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215165757434-1349583504.png" alt="" loading="lazy"></p>
<h3>2.3 YCSB</h3>
<p>下载地址:https://github.com/brianfrankcooper/YCSB/releases</p>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215155518695-1511708790.png" alt="" loading="lazy"></p>
<p>解压安装包</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">tar</span> -zxvf ycsb-<span style="color: rgba(128, 0, 128, 1)">0.5</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>.<span style="color: rgba(0, 0, 255, 1)">tar</span>.gz</pre>
</div>
<p>到此,环境部署完成!</p>
<p>输入命令简单验证下环境是否可用</p>
<div class="cnblogs_code">
<pre>./bin/ycsb load mongodb</pre>
</div>
<p>正常情况显示下图内容</p>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215171236223-1105633967.png" alt="" loading="lazy"></p>
<div>
<div>
<h1><strong>3、YCSB主要目录说明</strong></h1>
<ul>
<li>bin:目录下有个可执行的ycsb文件,是用户操作的命令行接口。ycsb主逻辑是:解析命令行、设置java环境,加载java-libs,封装成可以执行的java命令,并执行。</li>
<li>workloads:目录下有各种workload的模板,可以基于workload模板进行自定义修改。<br>
默认的6种测试场景如下:<br>
1)workloada:读写均衡型,50%/50%,Reads/Writes<br>
2)workloadb:读多写少型,95%/5%,Reads/Writes<br>
3)workloadc:只读型,100%,Reads<br>
4)workloadd:读最近写入记录型,95%/5%,Reads/insert<br>
5)workloade:扫描小区间型,95%/5%,scan/insert<br>
6)workloadf:读写入记录均衡型,50%/50%,Reads/insert</li>
</ul>
</div>
<h1>
4、YCSB主要参数说明</h1>
<h2>命令参数</h2>
</div>
<p>假如处于ycsb工具目录下,命令格式如下:</p>
<div class="cnblogs_code">
<pre>./bin/ycsb command database </pre>
</div>
<ul>
<li>command:常用<strong> load</strong>(用于压测前的数据准备)和 <strong>run</strong>(执行压测) </li>
<li>database:压测数据库名称</li>
<li>options:<strong>-P</strong>(指定workload文件)<strong>-p key=value</strong>(覆盖workload中属性)<strong>-threads</strong> (进程数)<strong>-s</strong>(执行过程中是否打印状态信息)</li>
</ul>
<h2>workload属性参数</h2>
<ul>
<li>recordcound:load阶段加载到数据库的纪录条数 (default: 0) ,run阶段操作的数据范围(注:run阶段该值不能大于load阶段的值,否则会出现 Nothing updated for key的错误,该错误会影响update操作的正确性)</li>
<li>operationcount:run阶段执行的操作总数</li>
<li>readallfields:查询时是否读取所有字段true或者读取一个字段false(default: true)</li>
<li>fieldcount: 每条记录的字段个数 (default: 10)</li>
<li>fieldlength: 每个字段的数据长度 (default: 100)</li>
<li>readproportion: 读操作比例 (default: 0.95)</li>
<li>updateproportion: 更新操作比例 (default: 0.05)</li>
<li>insertproportion: 插入操作比例 (default: 0)</li>
<li>insertstart:第一个插入值的偏移量(default: 0)</li>
<li>scanproportion: 扫描作业比例 (default: 0)</li>
<li>readmodifywriteproportion: 读取一条记录修改它并写回的比例 (default: 0)</li>
<li>requestdistribution: 请求的分布规则 uniform, zipfian or latest (default: uniform)</li>
<li>mongodb.url:待测试mongo实例的连接地址</li>
<li>mongodb.database:测试时使用的数据库名称(default: ycsb)<strong>注:</strong>该参数在实际使用过程为生效,但也不报错,版本原因?</li>
<li>table: 测试表的名称 (default: usertable)</li>
</ul>
<h1>5、压测过程</h1>
<h2>5.1 加载数据</h2>
<div class="cnblogs_code">
<pre>./bin/ycsb load mongodb -s -P ./workloads/workloada -threads <span style="color: rgba(128, 0, 128, 1)">100</span> -p insertstart=<span style="color: rgba(128, 0, 128, 1)">0</span> -p recordcount=<span style="color: rgba(128, 0, 128, 1)">1000000</span> -p readproportion=<span style="color: rgba(128, 0, 128, 1)">0</span> -p updateproportion=<span style="color: rgba(128, 0, 128, 1)">0</span> -p insertproportion=<span style="color: rgba(128, 0, 128, 1)">1</span> -p fieldcount=<span style="color: rgba(128, 0, 128, 1)">5</span> -p fieldlength=<span style="color: rgba(128, 0, 128, 1)">2048</span> -p requestdistribution=uniform -p mongodb.url=mongodb:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mongouser:autotest@192.168.0.230:27017/admin -p mongodb.database=ycsb_test -p table=t1 > ./load_result.txt</span></pre>
</div>
<p>上面命令是加载100W条数据,每条数据5个字段,数据长度2048。加载完后数据大小大约10GB,耗时5分钟,可以在 load_result.txt文件查看执行结果,主要用来查看执行失败时的错误。</p>
<p> 正常执行的结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211215183259501-1744825068.png" alt="" loading="lazy"></p>
<h2>5.2 执行测试</h2>
<div class="cnblogs_code">
<pre>./bin/ycsb run mongodb -s -P ./workloads/workloada -threads 100 -p recordcount=1000000 -p operationcount=1000000 -p insertstart=0 -p insertcount=0 -p readproportion=0.95 -p updateproportion=0.05 -p insertproportion=0 -p fieldcount=5 -p fieldlength=2048 -p mongodb.url=mongodb://mongouser:autotest123@192.168.0.230:27017/admin -p table=t1 > ./run_result.txt</pre>
</div>
<p>上面命令:</p>
<ul>
<li>recordcount=1000000:表示操作加载的100W条数据(该值必须小于等于加载的记录数,否则会影响update操作的准确性)</li>
<li>operationcount=1000000:表示读写共执行100W次(可以随意填写,可用来控制压测时间</li>
<li>insertcount=0,readproportion=0.95,updateproportion=0.05:表示插入数据占比0,读占比95%,更新占比5%</li>
</ul>
<p> 执行结果</p>
<p><img src="https://img2020.cnblogs.com/blog/1610045/202112/1610045-20211216102556787-1934612745.png" alt="" loading="lazy"></p>
<p>结果字段说明:</p>
<ul>
<li>RunTime(ms):数据加载所用时间,单位毫秒(ms)</li>
<li>Throughput(ops/sec):吞吐量,即ops(每秒操作次数)</li>
<li>Operations:操作的总次数</li>
<li>AverageLatency(us):平均响应延时,单位是微秒(us)</li>
<li>MinLatency(us):最小响应时间,单位是微秒(us)</li>
<li>MaxLatency(us):最大响应时间,单位是微秒(us)</li>
<li>95thPercentileLatency(us):95%的操作延时,单位是微秒(us)</li>
<li>99thPercentileLatency(us):99%的操作延时,单位是微秒(us)</li>
<li>Return=OK:成功返回数,这个值不符合测试要求,则证明测试失败.</li>
<li>开头的代表只读的操作记录,其他还有例如上面的,等,其他可以理解的就是字面意思,不能理解也不需要太过关注.</li>
</ul>
<p> </p><br><br>
来源:https://www.cnblogs.com/testlearn/p/15693366.html
頁:
[1]