mysql优化有2个关键字
connection pool
Thread cache
先简单说下docker + mysql
在docker里运行mysql性能计划没有什么区别, 只要别像我一样用snap安装docker 这样相当于又封了一层, 结果并发只能跑3-4QRS
mysql有两个目录需要挂载:/var/lib/mysql
里面保存数据库数据/etc/mysql/
里面保存着数据库配置的参数
比如最大连接数max_connections 默认是 151show variables like ‘max_connections‘;
修改方式:
- 可以直接在数据库中临时修改, mysql重启后丢失
set GLOBAL max_connections=152;
- 在配置文件里修改并重启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进行处理)
- 线程池 (一个线程负责处理多个 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