RDS控制台提供了多种系统资源监控项,本文介绍MySQL实例各个性能指标的意义及计算方法,希望用户能更清楚如何使用RDS对实例进行性能监控。绝大多数MySQL性能指标可以通过以下两种方式获取:
(1)mysqladmin
使用mysqladmin extended-status命令获得的MySQL的性能指标,默认为累计值。如果想了解当前状态,需要进行差值计算;加上参数 -relative(-r),就可以看到各个指标的差值,配合参数-sleep(-i)就可以指定刷新的频率。
(2)Show global status
可以列出MySQL服务器运行各种状态值,累计值。同样的,如果想了解当前状态,需要进行差值计算。
mysqladmin extended-status命令及show global status得到的指标项特别多。实际应用中,重点关注以下性能指标:
1. 磁盘空间:
当前实例磁盘空间使用量。磁盘空间中主要包括了:数据文件、日志文件、其他文件(系统文件和临时文件)。
2. IOPS:
数据从磁盘读取到内存,或者数据从内存写到磁盘都需要消耗IO。IOPS即为每秒磁盘IO次数。
3. CPU利用率:
在RDS中,各实例之间相互独立、资源隔离,相互之间不存在CPU的抢占问题,但同一实例中的不同数据库之间是资源共享的。获取mysqld的进程ID后,通过top或ps命令即可查看实例的CPU利用率。
4. 连接数:
连接数是指用户能够创建多少个连接,也就是MySQL show processlist命令输出结果中运行着的线程个数。
当前总连接数: show processlist结果中的总线程个数
当前活跃连接数:show processlist结果中的活跃线程数(Command列状态为sleep的不计入在内)
更详细的说明,请参考:RDS最佳实践(一)-如何选择RDS
5. 网络流量:
Bytes_received/s:平均每秒的输入流量,单位byte/s
Bytes_sent/s:平均每秒的输出流量,单位byte/s
6. QPS/TPS:
TPS: 平均每秒事务数
QPS:平均每秒SQL语句执行次数
TPS= Com_insert/s + Com_update/s + Com_delete/s
QPS=Com_select/s + Com_insert/s + Com_update/s + Com_delete/s
7. Innodb缓冲池:
缓冲池(innodb buffer pool)简单来说就是一块内存区域。缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲、自适应哈希索引、InnoDB存储的锁信息、数据字典信息等。不能简单认为,缓冲池只是缓存索引页和数据页,它们只是占缓冲池很大的一部分而已。
在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,下一次再读相同的页时,首先判断该页是否在缓冲池中。若在,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘中的页。
innodb_buffer_pool_reads: 平均每秒从物理磁盘读取页的次数
innodb_buffer_pool_read_requests: 平均每秒从innodb缓冲池的读次数
innodb_buffer_pool_write_requests: 平均每秒向innodb缓冲池的写次数
innodb_buffer_pool_pages_dirty: 平均每秒innodb缓存池中脏页的数目
innodb_buffer_pool_pages_flushed: 平均每秒innodb缓存池中刷新页请求的数目
缓冲池的读命中率
innodb_buffer_read_hit_ratio = ( 1 – innodb_buffer_pool_reads/innodb_buffer_pool_read_requests) * 100
缓冲池的利用率
innodb_buffer_usage = ( 1 – innodb_buffer_pool_pages_free / innodb_buffer_pool_pages_total) * 100
缓冲池的脏块的百分率
innodb_buffer_pool_pages_dirty / innodb_buffer_pool_pages_total
8. Innodb读写量:
平均每秒读取的数据量:innodb_data_read
平均每秒写入的数据量:innodb_data_written
9. Innodb读写次数:
平均每秒Innodb从文件中读取的次数:innodb_data_reads
平均每秒Innodb从文件中写入的次数:innodb_data_writes
10. Innodb日志:
平均每秒向日志文件的物理写次数:innodb_log_writes
平均每秒日志写请求次数:innodb_log_write_requests
平均每秒向日志文件完成fsync()写数量:innodb_os_log_fsyncs
11. 临时表:
Created_tmp_disk_tables:MySQL执行语句时在磁盘上自动创建的临时表的数量
在某些情况下,MySQL服务器会自动创建内部临时表。用explain查看select语句的执行计划,如果extra列显示“using temporary”,即使用了内部临时表。一般情况下,MySQL会先创建内存临时表,内存临时表超过配置指定的值后,MySQL会将内存临时表导出到磁盘临时表。
使用临时表一般都意味着性能比较低,特别是使用磁盘临时表,性能更慢,因此我们在实际应用中应该尽量避免临时表的使用。常见的方法有:
1)创建索引:在ORDER BY或者GROUP BY的列上创建索引;
2)分拆很长的列:一般情况下,TEXT、BLOB,大于512字节的字符串,基本上都是为了显示信息,而不会用于查询条件, 因此表设计的时候,应该将这些列独立到另外一张表。
如果表的设计已经确定,修改比较困难,那么也可以通过优化SQL语句来减少临时表的大小,以提升SQL执行效率。
12. MyISAM Key Buffer
为了最小化磁盘I/O,MyISAM将最频繁访问的索引块(Index block)都放在内存中,这样的内存缓冲区我们称之为Key Cache,它的大小可以通过参数key_buffer_size来控制。在MyISAM的索引文件中,连续的单元组成一个Block,Index block的大小等于该BTree索引节点的大小。Key Cache就是以Block为单位的。
当MySQL请求(读或写)MyISAM索引文件中某个Index Block时,首先会看Key Cache队列中是否已经缓存了对应block。
如果有,就直接在Key Cache队列中进行读写了,不再需要请求磁盘。如果是写请求,那么Key Cache中的对应Block就会被标记为Dirty(和磁盘不一致)。在MyISAM在Key Cache成功请求(读写)某个Block后,会将该Block放到Key Cache队列的头部。
如果Key Cache中没有待请求(读或写)的Block,MyISAM会向磁盘请求对应的Block,并将其放到Key Cache的队列头部。队列如果满了,会将队列尾部的Block删除,该Block如果是Dirty的,会将其Flush到磁盘上。我们看到MyISAM维护了一个LRU(Least Recently Used)的Key Cache队列。队列中的Dirty Block会在Block被踢出队列时Flush到磁盘上。
MyISAM平均每秒key buffer利用率
Key_usage_ratio =Key_blocks_used/(Key_blocks_used+Key_blocks_unused)*100
MyISAM平均每秒key buffer读命中率
Key_read_hit_ratio=(1-Key_reads/Key_read_requests)*100
MyISAM平均每秒key buffer写命中率
Key_write_hit_ratio =(1-Key_writes/Key_write_requests)*100
13. MyISAM读写次数
key_read_requests: MyISAM平均每秒钟从缓冲池中的读取次数
Key_write_requests: MyISAM平均每秒钟从缓冲池中的写入次数
key_reads : MyISAM平均每秒钟从硬盘上读取的次数
key_writes : MyISAM平均每秒钟从硬盘上写入的次数
14. COMDML
Com_select/s:平均每秒select语句执行次数
Com_insert/s:平均每秒insert语句执行次数
Com_update/s:平均每秒update语句执行次数
Com_delete/s:平均每秒delete语句执行次数
15. ROWDML
innodb_rows_deleted: 平均每秒从innodb表删除的行数
innodb_rows_inserted: 平均每秒从innodb表插入的行数
innodb_rows_read: 平均每秒从innodb表读取的行数
innodb_rows_updated: 平均每秒从innodb表更新的行数