Linux集群和自动化维1.5.2 利用tuning-primer脚本来调优MySQL数据库

1.5.2 利用tuning-primer脚本来调优MySQL数据库

MySQL在线上稳定运行一段时间后,就可以调用MySQL调优脚本tuning-primer.sh来检查参数的设置是否合理,该脚本的下载地址为:

http://www.day32.com/MySQL/tuning-primer.sh。

该脚本使用“SHOW STATUS LIKE…”和“SHOW VARIABLES LIKE…”命令获得MySQL的相关变量和运行状态。然后根据推荐的调优参数对当前的MySQL数据库进行测试。最后根据不同颜色的标识来提醒用户需要注意的各个参数设置。

当前版本会处理如下这些推荐的参数:

Slow Query Log(慢查询日志)

Max Connections(最大连接数)

Worker Threads(工作线程)

Key Buffer(Key缓冲)

Query Cache(查询缓存)

Sort Buffer(排序缓存)

Joins(连接)

Temp Tables(临时表)

Table(Open & Definition)Cache(表缓存)

Table Locking(表锁定)

Table Scans(read_buffer)(表扫描,读缓冲)

InnoDB Status(InnoDB状态)

笔者之前所在公司的主营业务是CPA电子广告平台,公司规模比较小,所以没有配备专业的MySQL DBA,线上的MySQL数据库(四核CPU)服务器问题比较多,用tuning-primer.sh脚本扫描后发现有如下问题:

MySQL数据库有时连接非常慢,严重时会被拖死。

通过show full processlist命令可以发现大量的“unauthenticated user”连接,数据库肯定每次都要响应,所以速度越来越慢,解决方法其实很简单:在mysql.cnf里添加skip-name-resolve,即不启用DNS反向解析。

发生这种情况的原因其实也很简单,MySQL的认证实际上是user+host的形式(也就是说user可以相同),所以MySQL在处理新连接时会试着去解析客户端连接的IP,启用参数skip-name-resolve后MySQL授权的时候就只能使用纯IP的形式了。

数据库在繁忙期间负载很大,长期达到了13,远远超过了系统平均负载4,这个肯定是不正常的。

通过脚本扫描,发现没有新建thread_cache_size,所以加上了thread_cache_size=256,然后重启数据库,数据库的平均负载一下子降到了5~6。

发现数据库里有张new_cheat_id表,读取很频繁,而且长期处于Sending data状态。

怀疑是磁盘I/O压力过大所致,所以操作如下:

explain SELECT
count(new_cheat_id)  FROM new_cheat WHERE
account_id = '14348612' AND offer_id = '689'\G;

显示结果如下所示:

***************************
1. row ***************************

           id: 1

  select_type: SIMPLE

        table: new_cheat

         type: ALL

possible_keys:
NULL

          key: NULL

      key_len: NULL

          ref: NULL

         rows: 2529529

        Extra: Using where

1 row in set
(0.00 sec)

上面出现的这种问题很严重,new_cheat没有建好索引,导致每次都要全表扫描2 529 529行记录,严重消耗了服务器的I/O资源,所以立即建好索引,并用show
index命令查看了表索引:

show index from
new_cheat;

命令显示结果如下所示:

+-----------+------------+------------+--------------+--------------+-

| Table     | Non_unique | Key_name   | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed
| Null | Index_type | Comment |

+-----------+------------+------------+--------------+--------------+-

| new_cheat
|          0 | PRIMARY    |           
1 | new_cheat_id | A         |     2577704 |     NULL | NULL   |     
| BTREE      |         |

| new_cheat
|          1 | ip         |            1 | ip           | A         |    
1288852 |     NULL | NULL   |     
| BTREE      |         |

| new_cheat
|          1 | account_id |            1 | account_id   | A        
|     1288852 |     NULL | NULL   |     
| BTREE      |         |

+-----------+------------+------------+--------------+--------------+-

3 rows in set
(0.01 sec)

再来查看explain结果:

explain SELECT
count(new_cheat_id)  FROM new_cheat WHERE
account_id = '14348612' AND offer_id = '689'\G;

显示结果如下所示:

***************************
1. row ***************************

           id: 1

  select_type: SIMPLE

        table: new_cheat

         type: ref

possible_keys:
account_id

          key: account_id

      key_len: 4

          ref: const

         rows: 6

        Extra: Using where

1 row in set
(0.00 sec)

大家可以发现,加好了索引后,此SQL通过account_id索引直接读取了6条记录(请对比关注rows这行)就获得了查询结果,系统负载由5~6直接降到了3.07~3.66了,这个负载还是能在可接受范围之内的。

MySQL的explain命令可用于SQL语句的查询执行计划(QEP)。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的。这条命令并没有提供任何调整建议,但它提供的重要信息能够帮助你做出调优决策。

最后要说明一点的是,对于网站来说,MySQL单机优化对整体性能提升的作用毕竟有限,尤其是在MySQL单机写入方面,如果在工作中遇到了那种对MySQL即时写入和读取速度要求很高的场景,建议大家可以多关注分布式的SQL解决方案,例如Hadoop的HBase和AWS的RedShift等分布式SQL系统。

时间: 2024-10-25 17:59:20

Linux集群和自动化维1.5.2 利用tuning-primer脚本来调优MySQL数据库的相关文章

Linux集群和自动化维2.6.2 统计类脚本

2.6.2 统计类脚本 统计工作一直是Shell和Python脚本的强项,我们完全可以利用sed.awk再加上正则表达式,写出强大的统计脚本来分析我们的系统日志.安全日志及服务器应用日志等. 1. Nginx负载均衡器日志汇总脚本 以下脚本是用来分析Nginx负载均衡器的日志的,作为Awstats的补充,它可以快速得出排名最前的网站和IP等,脚本内容如下(此脚本在CentOS 5.8/6.4 x86_64下均已测试通过): #!/bin/bash   if [ $# -eq 0 ]; then

Linux集群和自动化维2.6.4 开发类脚本

2.6.4 开发类脚本 业务需求在不断地变化,有时候互联网上的开源方案并不能全部解决,这个时候就需要自己写一些开发类的脚本来满足工作中的需求了,虽然很多时候脚本都可以独立运行,但笔者的做法还是尽量将其return结果写成Nagios能够识别的格式,以便配合Nagios发送报警邮件和信息. 1.监测redis是否正常运行 笔者接触的线上NoSQL业务主要是redis数据库,多用于处理大量数据的高访问负载需求.为了最大化地利用资源,每个redis实例分配的内存并不是很大,有时候程序组的同事导入数据量

Linux集群和自动化维导读

Preface  前言 为什么要写这本书 笔者从事系统运维和网站架构设计的工作已有10多年,现在在一家外企担任云平台架构师.云计算是现在的主流技术,未来也有很好的发展趋势,云计算的流行对于传统的运维知识体系来说,其实也造成了冲击,有很多读者经常向笔者咨询工作中的困惑,比如从事系统运维工作3-5年后就不知道该如何继续学习和规划自己的职业生涯了.因此笔者想通过此书,跟大家分享一下自己的工作经验和心得(包括传统运维和云平台运维工作的区别与对比),以期解决大家在工作中的困惑.本书提供了大量项目实践和线上

Linux集群和自动化维1.3 如何根据服务器应用选购服务器

1.3 如何根据服务器应用选购服务器   无论物理服务器是选用IDC托管还是AWS EC2云主机(以下为了简略说明,将它们统称为服务器),我们都要面临一个问题,那就是选择服务器的硬件配置,选购硬件配置时要根据服务器的应用需求而定.因为只通过一台服务器是无法满足所有的需求,并解决所有的问题的.在设计网站的系统架构之前,应该从以下方面考虑如何选购服务器: 服务器要运行什么应用. 需要支持多少用户访问. 需要多大空间来存储数据. 业务有多重要. 服务器网卡方面的考虑. 安全方面的考虑. 机架安排是否合

Linux集群和自动化维3.7.2 线上环境中的Fabric应用实例

3.7.2 线上环境中的Fabric应用实例 笔者线上的核心业务机器统一都是AWS EC2主机,机器数量较多,每个数据中心都部署了Fabric跳板机(物理拓扑图可参考图3-3),系统为Amazon Linux,内核版本为3.14.34-27.48.amzn1.x86_64,Python版本为Python 2.6.9. 如果公司项目组核心开发人员离职,线上机器就都要更改密钥,由于密钥一般是以组的形式存在的,再加上机器数量繁多,因此单纯通过技术人员手工操作,基本上是一项不可能完成的任务,但若是通过F

Linux集群和自动化维1.4.4 Linux下CPU使用率与机器负载的关系与区别

1.4.4 Linux下CPU使用率与机器负载的关系与区别  笔者的线上竞标业务机器,在业务最繁忙的一段周期内,发现Nginx单机并发活动的连接数超过了2.6万,机器负载(基本上不到4,Nagios监控系统并没有发送报警邮件和短信)和Nginx+Lua服务都是正常的,网卡流量并没有打满,但流量就是怎么也打不进去.经过深入观察,发现这段时期内每台机器的CPU利用率都已经很高了,基本都维持在99%-100%左右,这种情况应该是CPU资源耗尽了,导致不能再继续提供服务,所以这里有必要研究下CPU负载和

Linux集群和自动化维2.6.5 自动化类脚本

2.6.5 自动化类脚本 1.批量生成账户脚本 在内网开发环境中,有时需要为开发组的同事批量生成账户,如果手动添加的话会非常麻烦,这时可以写一段Shell脚本来自动完成这项工作.在首次登录时密码均是统一的,在移交给开发人员使用时让他们自行更改即可,脚本代码如下(此脚本在CentOS 5.8 / 6.4 x86_64下均已测试通过): #!/bin/bash #此脚本应用于开发环境下批量生成用户 for name in tom jerry joe jane yhc brain do       u

Linux集群和自动化维1.5.1 服务器物理硬件的优化

1.5.1 服务器物理硬件的优化  在对MySQL服务器进行硬件挑选时,应该从下面几个方面着重对MySQL服务器的硬件配置进行优化,也就是说将项目中的资金着重投入到如下几处: 磁盘寻道能力(磁盘I/O).笔者公司现在用的都是SAS15000转的硬盘,用6块这样的硬盘做RAID 10.MySQL数据库每一秒钟都在进行大量.复杂的查询操作,对磁盘的读写量可想而知,所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一.对于日均访问量在1000万PV以上的Discuz论坛,如果磁盘I/O性能不好,

Linux集群和自动化维1.4 CentOS 6.4 x86_64最小化安装后的优化

1.4 CentOS 6.4 x86_64最小化安装后的优化 购买了服务器以后要做的第一件事就是安装操作系统了,这里推荐安装CentOS 6.4 x86_64,安装系统时要 选择最小化安装(不需要图形),在使用服务器时要记住一个原则,系统安装的应用程序包越少,服务器就 会越稳定.至于服务器单机性能调优,应本着稳定安全的原则,尽量不要改动系统原有的配置(CentOS系 统自身的文件和内存机制就很优秀),以下配置优化部分也适合Amazon Linux系统,大家可以对比参考.

Linux集群和自动化维3.6 轻量级自动化运维工具Fabric介绍

3.6 轻量级自动化运维工具Fabric介绍 笔者公司目前的数据中心采用的是分布式部署方案,在全球多地都有数据中心.数据中心采用的是AWS EC2机器,在核心的数据中心里,EC2机器的数量比较多,基本上每个数据中心都在运行着几百台AWS EC2机器,而且业务繁忙的时候,会通过AWS AMI(Amazon系统映像)直接上线几十台相同业务的EC2机器,它们的机器类型.系统应用和配置文件基本上都是一模一样的,很多时候需要修改相同的配置文件和执行相同的操作,这个时候为了避免重复性的劳动就需要用到自动化运