暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql 缓存命中率、TPS、Table Cache状态量、QPS(每秒Query量)

原创 lair 2022-08-30
1585

1、简介:
众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍。故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率。MySQL数据库也不例外。在MySQL5.5之前,广泛使用的和默认的存储引擎是MyISAM。MyISAM使用操作系统缓存来缓存数据。InnoDB需要innodb buffer pool中处理缓存。所以非常需要有足够的InnoDB buffer pool空间。mysql数据库的pool可以缓存索引和行数据,值越大,IO读写就越少,如果单纯的做数据库服务,该参数可以设置到电脑物理内存的80%,但是也要根据服务器综合使用情况进行合理设置。

2、命中率计算:
(1)查询参数:
执行sql查看innodb_buffer_pool系列参数:

show status like ‘%innodb_buffer_pool_%’



(2)值计算公式:


(3)差值计算公式:
两次查询的innodb_buffer_pool_read_requests差

/(两次查询的innodb_buffer_pool_read_requests差

+两次查询的innodb_buffer_pool_read_ahead差

+两次查询的innodb_buffer_pool_reads差)

3、参数调优:
当上述两种公式计算的命中率较低的时候,说明mysql性能有所降低了,需要根据内存硬件的大小进行mysql的缓存命中率优化。Mysql的innodb缓存命中率的核心优化参数有三个:innodb_buffer_pool_instances、innodb_buffer_pool_chunk_size、innodb_buffer_pool_size。

innodb_buffer_pool_instances:是一个正整数即可,不要超过服务器的cpu核数。建议可以先设置服务器CPU核数的一半。

innodb_buffer_pool_chunk_size:是一个整数的MB、GB即可。

innodb_buffer_pool_size:该值是一个计算值,innodb_buffer_pool_instances*innodb_buffer_pool_chunk_size的结果值的一个整数倍数,否则该值设计的不合理,mysql会自动根据计算规则,计算一个小于该值的一个有效值。该值的大小在服务器物理内存的50%—80%之间,还要考虑该服务器上是否有其它应用使用内存等情况。

综上所述,对于mysql的innodb缓存命中率优化为:对mysql的innodb_buffer_pool_instances设置一个小于服务器CPU核数的一个正整数;对mysql的innodb_buffer_pool_chunk_size设置一个合理的MB或GB,让innodb_buffer_pool_size在该服务器物理内存的50%—80%范围内。设计好三个参数后,修改mysql的配置文件my.cnf,然后重新启动mysql服务即可。这三个参数也是根据自己服务器和mysql存储数据情况进行不断尝试和调试的。

例如:服务器16CPU核/64GB,对参数进行如下设置:



解释:32GB=8*1024MB*4,倍数为4,因此该值有效,服务器为16核,设计innodb_buffer_pool_instances为8比较合适也,服务器内存64GB,设计innodb_buffer_pool_size为32GB比较合适也。




运行中的mysql状态查看

对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态。

(1)QPS(每秒Query量)

QPS = Questions(or Queries) / seconds

mysql > show global status like 'Question%';

(2)TPS(每秒事务量)

TPS = (Com_commit + Com_rollback) / seconds

mysql > show global status like 'Com_commit';

mysql > show global status like 'Com_rollback';

(3)key Buffer 命中率

mysql>show global status like 'key%';

key_buffer_read_hits = (1-key_reads / key_read_requests) * 100%

key_buffer_write_hits = (1-key_writes / key_write_requests) * 100%

(4)InnoDB Buffer命中率

mysql> show status like 'innodb_buffer_pool_read%';

innodb_buffer_read_hits = (1 - innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%

(5)Query Cache命中率

mysql> show status like 'Qcache%';

Query_cache_hits = (Qcahce_hits / (Qcache_hits + Qcache_inserts )) * 100%;

(6)Table Cache状态量

mysql> show global status like 'open%';

比较 open_tables 与 opend_tables 值

(7)Thread Cache 命中率

mysql> show global status like 'Thread%';

mysql> show global status like 'Connections';

Thread_cache_hits = (1 - Threads_created / connections ) * 100%

(8)锁定状态

mysql> show global status like '%lock%';

Table_locks_waited/Table_locks_immediate=0.3% 如果这个比值比较大的话,说明表锁造成的阻塞比较严重

Innodb_row_lock_waits innodb行锁,太大可能是间隙锁造成的

(9)复制延时量

mysql > show slave status

查看延时时间

(10) Tmp Table 状况(临时表状况)

mysql > show status like 'Create_tmp%';

Created_tmp_disk_tables/Created_tmp_tables比值最好不要超过10%,如果Created_tmp_tables值比较大,

可能是排序句子过多或者是连接句子不够优化

(11) Binlog Cache 使用状况

mysql > show status like 'Binlog_cache%';

如果Binlog_cache_disk_use值不为0 ,可能需要调大 binlog_cache_size大小

(12) Innodb_log_waits 量

mysql > show status like 'innodb_log_waits';

Innodb_log_waits值不等于0的话,表明 innodb log buffer 因为空间不足而等待

(13)查看连接线程

show processlist;

比如命令:

>#show global status;

虽然可以使用:

>#show global status like %...%;


最后修改时间:2022-08-30 09:40:55
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论