星中有光 發表於 2023-11-25 23:57:00

MySQL运行在docker容器中会损失多少性能

<h2 id="前言">前言</h2>
<p>自从使用docker以来,就经常听说MySQL数据库最好别运行在容器中,性能会损失很多。一些之前没使用过容器的同事,对数据库运行在容器中也是忌讳莫深,甚至只要数据库跑在容器中出现性能问题时,首先就把问题推到容器上。</p>
<p>那么到底会损失多少,性能损失会很多吗?</p>
<p>为此我装了两个MySQL,版本都是8.0.34。一个用官网二进制包安装,另一个用docker hub的MySQL镜像安装。两个MySQL都运行在同一台机器,但不同时运行,先后运行测试。测试工具用的sysbench,运行在另一台机器。</p>
<blockquote>
<p>提前声明:测试流程比较简单,只是用sysbench测了混合读写场景,测试次数也较少,不具有权威性。感兴趣的话,可以自行完善测试流程。</p>
</blockquote>
<p>如果对后文没什么兴趣,这里也可以直接说结论:<strong>单表百万级以下时,非容器和容器的性能差异并不多。单表千万级时,容器MySQL大概会损耗10% ~ 20%的性能。</strong></p>
<table>
<thead>
<tr>
<th style="text-align: center">应用</th>
<th style="text-align: center">版本</th>
<th style="text-align: center">备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">Debian</td>
<td style="text-align: center">12.0</td>
<td style="text-align: center">操作系统。4C16G</td>
</tr>
<tr>
<td style="text-align: center">docker</td>
<td style="text-align: center">20.10.17</td>
<td style="text-align: center">容器运行时</td>
</tr>
<tr>
<td style="text-align: center">MySQL(非docker)</td>
<td style="text-align: center">8.0.34</td>
<td style="text-align: center">基于官方的二进制安装包</td>
</tr>
<tr>
<td style="text-align: center">MySQL(docker)</td>
<td style="text-align: center">8.0.34</td>
<td style="text-align: center">使用docker hub的镜像</td>
</tr>
<tr>
<td style="text-align: center">sysbench</td>
<td style="text-align: center">1.0.20</td>
<td style="text-align: center">压测工具</td>
</tr>
</tbody>
</table>
<h2 id="mysql配置">MySQL配置</h2>
<p>MySQL安装后创建测试用的sysbench用户和sysbench数据库,调整innodb_buffer_pool_size为2GB。</p>
<p>docker容器的网络配置为bridge,挂载数据目录。</p>
<h2 id="sysbench命令">sysbench命令</h2>
<ul>
<li>准备数据</li>
</ul>
<pre><code class="language-bash">sysbench --db-driver=mysql --mysql-host=192.168.3.21 --mysql-port=3306 --mysql-user=sysbench --mysql-password=123456 --mysql-db=sysbench --table_size=10000000 --tables=20 --threads=4 oltp_read_write prepare
</code></pre>
<ul>
<li>执行测试</li>
</ul>
<pre><code class="language-bash">sysbench --db-driver=mysql --mysql-host=192.168.3.21 --mysql-port=3306 --mysql-user=sysbench --mysql-password=123456 --mysql-db=sysbench --time=300 --threads=8 --report-interval=10 oltp_read_write run
</code></pre>
<ul>
<li>清理测试数据</li>
</ul>
<pre><code class="language-bash">sysbench --db-driver=mysql --mysql-host=192.168.3.21 --mysql-port=3306 --mysql-user=sysbench --mysql-password=123456 --mysql-db=sysbench --table_size=10000000 --tables=20 --threads=4 oltp_read_write cleanup
</code></pre>
<h2 id="测试结果">测试结果</h2>
<p>单表1000w数据,20张表,测试4次。</p>
<table>
<thead>
<tr>
<th style="text-align: center">MySQL运行环境</th>
<th style="text-align: center">测试序列</th>
<th style="text-align: center">总SQL执行数</th>
<th style="text-align: center">每秒SQL数</th>
<th style="text-align: center">每秒事务数</th>
<th style="text-align: center">延迟时间(平均)</th>
<th style="text-align: center">延迟时间(95%)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">非容器</td>
<td style="text-align: center">1</td>
<td style="text-align: center">3798093</td>
<td style="text-align: center">12658.84</td>
<td style="text-align: center">632.78</td>
<td style="text-align: center">12.64</td>
<td style="text-align: center">20.00</td>
</tr>
<tr>
<td style="text-align: center">非容器</td>
<td style="text-align: center">2</td>
<td style="text-align: center">3914578</td>
<td style="text-align: center">13047.91</td>
<td style="text-align: center">652.28</td>
<td style="text-align: center">12.26</td>
<td style="text-align: center">17.01</td>
</tr>
<tr>
<td style="text-align: center">非容器</td>
<td style="text-align: center">3</td>
<td style="text-align: center">4059867</td>
<td style="text-align: center">13531.79</td>
<td style="text-align: center">676.46</td>
<td style="text-align: center">11.82</td>
<td style="text-align: center">15.55</td>
</tr>
<tr>
<td style="text-align: center">非容器</td>
<td style="text-align: center">4</td>
<td style="text-align: center">3772390</td>
<td style="text-align: center">12574.00</td>
<td style="text-align: center">628.58</td>
<td style="text-align: center">12.72</td>
<td style="text-align: center">19.65</td>
</tr>
<tr>
<td style="text-align: center">容器</td>
<td style="text-align: center">1</td>
<td style="text-align: center">3230678</td>
<td style="text-align: center">10768.41</td>
<td style="text-align: center">538.28</td>
<td style="text-align: center">14.86</td>
<td style="text-align: center">26.20</td>
</tr>
<tr>
<td style="text-align: center">容器</td>
<td style="text-align: center">2</td>
<td style="text-align: center">3538573</td>
<td style="text-align: center">11794.68</td>
<td style="text-align: center">589.62</td>
<td style="text-align: center">13.57</td>
<td style="text-align: center">19.29</td>
</tr>
<tr>
<td style="text-align: center">容器</td>
<td style="text-align: center">3</td>
<td style="text-align: center">3567943</td>
<td style="text-align: center">11892.56</td>
<td style="text-align: center">594.50</td>
<td style="text-align: center">13.45</td>
<td style="text-align: center">17.63</td>
</tr>
<tr>
<td style="text-align: center">容器</td>
<td style="text-align: center">4</td>
<td style="text-align: center">3616204</td>
<td style="text-align: center">12053.53</td>
<td style="text-align: center">602.58</td>
<td style="text-align: center">13.27</td>
<td style="text-align: center">17.32</td>
</tr>
</tbody>
</table>
<p>平均统计:</p>
<table>
<thead>
<tr>
<th style="text-align: center">MySQL运行环境</th>
<th style="text-align: center">总SQL执行数</th>
<th style="text-align: center">每秒SQL数</th>
<th style="text-align: center">每秒事务数</th>
<th style="text-align: center">延迟时间(平均)</th>
<th style="text-align: center">延迟时间(95%)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">非容器</td>
<td style="text-align: center">3,886,232</td>
<td style="text-align: center">12,953.14</td>
<td style="text-align: center">647.53</td>
<td style="text-align: center">12.36</td>
<td style="text-align: center">18.05</td>
</tr>
<tr>
<td style="text-align: center">容器</td>
<td style="text-align: center">3,488,350</td>
<td style="text-align: center">11,627.3</td>
<td style="text-align: center">581.25</td>
<td style="text-align: center">13.79</td>
<td style="text-align: center">20.11</td>
</tr>
<tr>
<td style="text-align: center">环比</td>
<td style="text-align: center">-10.24%</td>
<td style="text-align: center">-10.24%</td>
<td style="text-align: center">-10.24%</td>
<td style="text-align: center">+11.57%</td>
<td style="text-align: center">+11.41%</td>
</tr>
</tbody>
</table>
<p>在测千万级数据量之前,测过几轮几十万级的数据量,非容器和容器版的MySQL并没有多大区别。当数据量逐渐增多时,差异就愈加明显。目前测单表1000w已经出现10%左右的性能损耗,如果单表数据继续增大,性能损耗应该也会更多。</p>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:花酒锄作田,转载请注明原文链接:https://www.cnblogs.com/XY-Heruo/p/17856386.html</p><br><br>
来源:https://www.cnblogs.com/XY-Heruo/p/17856386.html
頁: [1]
查看完整版本: MySQL运行在docker容器中会损失多少性能