内容简介:学习MySQL数据库技术,一个非常重要的技能就是性能调优。通常情况下,都是自下而上的调优方法,主要包括运行环境、配置参数、SQL性能和系统架构设计调优等。本文从多线程的角度,简单描述MySQL并发参数及其调优。
前言
学习 MySQL 数据库技术,一个非常重要的技能就是性能调优。通常情况下,都是自下而上的调优方法,主要包括运行环境、配置参数、 SQL 性能和系统架构设计调优等。
本文从多线程的角度,简单描述MySQL并发参数及其调优。
MySQL并发模型
架构
Innodb用自己的线程调度机制来控制线程如何进入innodb内核工作,并执行相关的操作。
- 当一个线程需要进入到Innodb存储引擎层(以下简称Innodb),Innodb会检查已经进入到Innodb存储引擎层的线程总数是否超过innodb_thread_concurrency;
- 如果超过了,则该线程需要等待innodb_thread_sleep_delay毫秒再次进行尝试;
- 如果尝试仍然失败,该线程将会进入到FIFO的队列中进行等待唤醒(此时状态为sleeping)。
- 一旦该thread进入到INNODB中,该线程将会获得innodb_concurrency_tickets次通行证,即该线程在接下来的innodb_concurrency_tickets次进入到INNODB中都不需要再进行检查,可直接进入。
- 线程尝试两次进入INNODB存储引擎层的目的是,减少等待线程的数量以及减少上下文切换。
Innodb的这种两阶段的机制减少了操作系统因为线程之间的上下文切换带来的开销。
Innodb并发参数
-
innodb_thread_concurrency
- 同一时刻能够进入innodb层并发执行的线程数量。如果超过CPU核数,某些线程就会处于就绪状态;若Server层线程数超过这个数值,多余的线程会被放到wait queue队列中等待;
- 默认值:0,表示不限制线程并发执行的数量,所有请求都会被认为是可调度的。此时,innodb_thread_sleep_delay的值会被忽略
- 范围:0 ~ 1000
-
innodb_commit_concurrency
- 同一时刻允许同时commit的线程数量
- 默认值:0,即不限制
- 范围:0 ~ 1000
- 如果 innodb_thread_concurrency 设置的有点大innodb_commit_concurrency应该做出相应的调整,否则会造成大量线程阻塞。
-
innodb_concurrency_tickets
- thread进入INNODB中,会获得innodb_concurrency_tickets次通行,该线程在接下来的innodb_concurrency_tickets次进入到INNODB中不需要再进行检查,可直接进入。
- 默认值:5000
- 范围:0 ~ 4294967295
-
innodb_thread_sleep_delay
- 线程未能进入INNODB存储引擎,需要等待innodb_thread_sleep_delay毫秒再次尝试进入;即进入wait queue前sleep的时间;
- 单位:微妙
- 默认值:10000
建议值
如下建议来自MySQL官网。详情请参考 https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_thread_concurrency
- 如果一个工作负载中,并发用户线程的数量小于64,建议设置innodb_thread_concurrency=0;
- 如果工作负载一直较为严重甚至偶尔达到顶峰,建议先设置innodb_thread_concurrency=128,并通过不断的降低这个参数,96, 80, 64等等,直到发现能够提供最佳性能的线程数。
- 例如,假设系统通常有40到50个用户,但定期的数量增加至60,70,甚至200。你会发现,性能在80个并发用户设置时表现稳定,如果高于这个数,性能反而下降。在这种情况下,建议设置innodb_thread_concurrency参数为80,以避免影响性能。
- 如果你不希望InnoDB使用的虚拟CPU数量比用户线程使用的虚拟CPU更多(比如20个虚拟CPU),建议通过设置innodb_thread_concurrency 参数为这个值(也可能更低,这取决于性能体现),如果你的目标是将MySQL与其他应用隔离,你可以考虑绑定mysqld进程到专有的虚拟CPU。
- 但是需要注意的是,这种绑定,在myslqd进程一直不是很忙的情况下,可能会导致非最优的硬件使用率。在这种情况下,你可能会设置mysqld进程绑定的虚拟CPU,允许其他应用程序使用虚拟CPU的一部分或全部。
- 在某些情况下,最佳的innodb_thread_concurrency参数设置可以比虚拟CPU的数量小。
- 定期检测和分析系统,负载量、用户数或者工作环境的改变可能都需要对innodb_thread_concurrency参数的设置进行调整。
观察
可以通过如下命令观察参数及状态。
mysql> show variables like '%concurrency%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | innodb_commit_concurrency | 0 | | innodb_concurrency_tickets | 5000 | | innodb_thread_concurrency | 0 | | thread_concurrency | 10 | +----------------------------+-------+ 4 rows in set (0.00 sec)
mysql> select trx_id,trx_state,trx_query,trx_operation_state,trx_concurrency_tickets from information_schema.innodb_trx ; +----------+-----------+--------------------------------------+---------------------+-------------------------+ | trx_id | trx_state | trx_query | trx_operation_state | trx_concurrency_tickets | +----------+-----------+--------------------------------------+---------------------+-------------------------+ | 45956096 | RUNNING | select count(*) from tb_test | committing | 0 | +----------+-----------+--------------------------------------+---------------------+-------------------------+ 1 row in set (0.38 sec)
mysql> show engine innodb status \G; *************************** 1. row *************************** Type: InnoDB Name: Status: ===================================== 180612 11:27:51 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 4 seconds ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 40092798, signal count 27800089 Mutex spin waits 0, rounds 1448336939, OS waits 27203399 RW-shared spins 5866534, OS waits 2555867; RW-excl spins 16147805, OS waits 6633709 ------------ TRANSACTIONS ------------ Trx id counter 0 918627542 Purge done for trx's n:o < 0 918627313 undo n:o < 0 0 History list length 63 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0 918627510, not started, process no 13429, OS thread id 1193253184 ... ---TRANSACTION 0 918627539, not started, process no 13429, OS thread id 1075824960 MySQL thread id 29133262, query id 378160869 localhost 127.0.0.1 test -------- FILE I/O -------- I/O thread 0 state: waiting for i/o request (insert buffer thread) I/O thread 1 state: waiting for i/o request (log thread) I/O thread 2 state: waiting for i/o request (read thread) I/O thread 3 state: waiting for i/o request (write thread) Pending normal aio reads: 0, aio writes: 0, ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 Pending flushes (fsync) log: 0; buffer pool: 0 18053159 OS file reads, 61697040 OS file writes, 34602915 OS fsyncs 2.75 reads/s, 16384 avg bytes/read, 4.75 writes/s, 4.75 fsyncs/s ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 5, seg size 7, 664776 inserts, 664776 merged recs, 13693 merges Hash table size 17393, node heap has 22 buffer(s) 37.99 hash searches/s, 36.74 non-hash searches/s --- LOG --- Log sequence number 21 621309414 Log flushed up to 21 621309414 Last checkpoint at 21 621282806 0 pending log writes, 0 pending chkp writes 32082113 log i/o's done, 4.75 log i/o's/second ---------------------- BUFFER POOL AND MEMORY ---------------------- Total memory allocated 21774746; in additional pool allocated 1044224 Dictionary memory allocated 639320 Buffer pool size 512 Free buffers 0 Database pages 490 Modified db pages 52 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages read 70252515, created 255750, written 41909328 2.75 reads/s, 0.00 creates/s, 0.00 writes/s Buffer pool hit rate 991 / 1000 -------------- ROW OPERATIONS -------------- 0 queries inside InnoDB, 0 queries in queue 1 read views open inside InnoDB Main thread process no. 13429, id 1167427904, state: sleeping Number of rows inserted 372775, updated 74210855, deleted 4797, read 3912463894 0.00 inserts/s, 12.75 updates/s, 0.00 deletes/s, 134.72 reads/s ---------------------------- END OF INNODB MONITOR OUTPUT ============================ 1 row in set (0.00 sec) ERROR: No query specified
Reference
- http://imysql.com/2014/09/05/mysql-faq-why-close-query-cache.shtml
- http://imysql.com/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml
- https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html
- https://dev.mysql.com/doc/refman/5.7/en/innodb-performance-thread_concurrency.html
- https://bugs.mysql.com/bug.php?id=42101 (Race condition in innodb_commit_concurrency)
- http://www.ovaistariq.net/496/tuning-innodb-configuration/#.WWjWEtOGM_U
- https://www.linuxidc.com/Linux/2017-06/144814.htm
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解Nginx(第2版)
陶辉 / 机械工业出版社 / 2016-2 / 99.00元
本书致力于说明开发Nginx模块的必备知识,第1版发行以后,深受广大读者的喜爱.然而由于Ng,nx功能繁多且性能强大,以致必须了解的基本技能也很庞杂,而第1版成书匆忙,缺失了几个进阶的技巧描述,因此第2版在此基础上进行了完善。 书中首先通过介绍官方Nginx的基本用法和配置规则,帮助读者了解一般Nginx模块的用法,然后重点介绍了女口何开发HTTP模块(含HTTP过滤模块)来得到定制化的Ng......一起来看看 《深入理解Nginx(第2版)》 这本书的介绍吧!