优化mysql in docker

原文:优化mysql in docker

mysql优化有2个关键字
connection pool
Thread cache

先简单说下docker + mysql
在docker里运行mysql性能计划没有什么区别, 只要别像我一样用snap安装docker 这样相当于又封了一层, 结果并发只能跑3-4QRS
mysql有两个目录需要挂载:
/var/lib/mysql 里面保存数据库数据
/etc/mysql/ 里面保存着数据库配置的参数

比如最大连接数max_connections 默认是 151
show variables like ‘max_connections‘;

修改方式:

  1. 可以直接在数据库中临时修改, mysql重启后丢失

set GLOBAL max_connections=152;

  1. 在配置文件里修改并重启mysql
    配置文件在 /etc/mysql/my.cnf

比如想修改max_connections的话,
在[mysqld]下面添加 max_connections = 152

我没有首先修改max_connections因为默认是151, 但是并发起来200qps连接数只有10左右, 目前的瓶颈应该不是最大连接数的限制,
然后我再django setting 加上了数据库的连接池参数 , 默认为0 不使用连接池

online_database = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘,
‘NAME‘: ‘DB_NAME‘,
‘USER‘: ‘root‘,
‘PASSWORD‘: ‘ddjjhkk‘,
‘HOST‘: ‘192.168.20.211‘,
‘PORT‘: ‘3306‘,
‘CONN_MAX_AGE‘: 60,
}
}

加上之后, 并发由原来的200qps 到了260-300
数据库连接数从10提高到了30-70
按照django 但进程处理一个请求需要2-3ms来算妙并发应该在300左右

连接池这方面也可以直接在mysql这边设置

提高的这50qps说明创建数据库连接浪费了一些资源.

mysql thread_handling 有3种
1 没用thread 好像
2 one-thread-per-connection (每有一个来自客户端的connection就使用一个thread进行处理)

  1. 线程池 (一个线程负责处理多个 connection) 好像

连接池

connection pool 是客户端的概念, Django的话使用CONN_MAX_AGE来使用连接池

Threads Cached: 处于缓存中可以使用的thread,
通过变量thread_cache_size 修改与查看, 默认为8好像

建议修改64 set global thread_cache_size=64;

对于mysql来说, 与客户端的connection跟服务端的thread创建都需要消耗资源, 应该避免过多的创建新资源。

connection 通过客户端的connection pool
thread 通过mysql端的 Thread cache

优化mysql in docker

上一篇:Python面向对象编程、类


下一篇:MySQL的安装和介绍