如何提升Docker环境下.net core应用与MySql之间的数据库并发连接性能

5 篇文章 2 订阅
4 篇文章 0 订阅

    笔者使用jmeter做压测发现,并发使用200线程(5秒全部启动)时就会出现不少错误,为了解决这个问题做了一番优化,一下是优化后的总结经验。

增加MySQL的最大连接数

MySQL 5.7的默认最大连接数为151,如果要增加该值,需在数据库配置文件*.cnf里增加如下设置项,重启容器服务即可

[mysqld]
max_connections=500

 增加.Net Core的数据库连接池最大值

.Net Core的MySQL连接字串的数据库连接池最大默认是100,当并发测试超过这个数时,会提示相关错误,可以在数据库连接字串里使用maximumpoolsize定义数据库连接池最大值

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;maximumpoolsize=200;

验证方法

在MySQL验证设置

show variables like '%max_connections%';

 并发测试时,在MySQL里输入以下命令查看并发连接数

show processlist;

 看看过去达到的最大连接数,使用如下命令

show global status like '%Max_used_connections%';

结果类似如下: 

 

增加容器的TCP连接队列最大值

     笔者使用Jmeter做压测发现,应用和数据库都部署在docker里时,偶尔会出现数据库连接超时,查MySQL日志提示Aborted Connection, 查应用提示 Command Timeout,  怀疑是两个容器之间的tcp连接的性能问题,后查询到linux默认的TCP监听队列只有128,将该值改大后再做压测,问题出现次数减少。

设置方法如下,在docker-compose.yml里对MySQL容器增加如下配置。

sysctls:
  - net.core.somaxconn=500

启动后,docker exec -it mysql sh 附加到容器里,使用如下命令查看值是否生效 

cat /proc/sys/net/core/somaxconn  

数据库容器使用Host的网络模式

     数据库超时尽管减少,但多次压测仍会有少量偶发数据库连接超时失败,如果直接用本地window环境运行应用去连接docker里的数据库却一直不会出现这个问题。经反复研究和查找网上资料,发现根本原因是: 数据库容器和其他容器都是采用bridge网络模式,应用服务和数据库服务之间的通信是“容器”和“容器”之间通信,其网络性能不如“容器”与“宿主机”之间的通信。

   见参考文章 理解Docker单机容器网络_xuguokun1986的博客-CSDN博客 结论   

  笔者将数据库容器的网络模式改成host, 再用jmeter压测多次后问题不再复现。

  docker-compose.yml配置网络模式为host方法

network_mode: "host"   

  host模式意味着容器直接使用宿主机的IP和端口, 应用容器要访问数据库容器时需使用docker0接口的IP地址。可在宿主机使用命令 :   ip addr  查看docker0的ip地址,如下图:

 

参考:

MySQL 默认最大连接数是多少?_寰宇001的博客-CSDN博客_mysql默认最大连接数作者:mohan87821000 来源:https://blog.51cto.com/5250070/1672803上午刚工作10分左右,同事说在使用jira时出现问题,具体截图如下:通过上图的报错信息:定位为mysql数据库连接数的问题解决方法:1.登录mysql进行查看Mysql –uroot –p123456mysql> show variables like'%max_connections%';+-----------------+-------+| Variable_.https://blog.csdn.net/qq_40907977/article/details/114259394

Connection Pool size - MySqlConnection - ConnectionStrings.com'Connection Pool size' connection string. Connection Pool size with MySqlConnection for connections to MySQL.https://www.connectionstrings.com/mysql-connector-net-mysqlconnection/connection-pool-size/

python - docker container increase listen queue size beyond 128 - Stack Overflowhttps://stackoverflow.com/questions/43243483/docker-container-increase-listen-queue-size-beyond-128

       compose-spec/spec.md at master · compose-spec/compose-spec · GitHubThe Compose specification. Contribute to compose-spec/compose-spec development by creating an account on GitHub.https://github.com/compose-spec/compose-spec/blob/master/spec.md#sysctls

 
理解Docker单机容器网络_xuguokun1986的博客-CSDN博客Docker容器是近两年最 火的IT技术之一,用“火山爆发式“来形容Docker的成 长也不为过。Docker在产品服务的devops 运维、云 计算(CaaS)、大数据以及企业内部应用等领域正在被越来越多的接受和广泛应用。Docker技术的本质在于提升计算密度和提升部署效率,高屋 建瓴的讲,它的出现符合人类社会对绿色发展的追求,降低资源消耗,提升资源的单位利用率。不过经历了两年多的发展,https://blog.csdn.net/xuguokun1986/article/details/53513397 How to make Network_Mode : "host" work in docker-compose.yml file - Stack Overflowicon-default.png?t=M0H8https://stackoverflow.com/questions/56521484/how-to-make-network-mode-host-work-in-docker-compose-yml-file

Docker(十四)-Docker四种网络模式 - 圆圆测试日记 - 博客园Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看: none模式,使用--net=none指定,该模式关闭了容器的网络https://www.cnblogs.com/zhuochong/p/10069293.html 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值