问题描述

服务器系统负载持续高,CPU长时间接近100%,访问承载能力差,网站时常502无法访问,执行top命令,mysqld占用极高,可以通过以下方法进行排查和解决mysql导致的高io问题。这种情况,通常是由于SQL语句优化不到位造成的。

1、开启慢查询日志,查看查询语句,针对性的对sql语句优化,特别是可以添加索引等方法,减少查询事件。

2、通过使用show processlist;命令。

3、配置服务器也是优化的一部分。

以下为实现步骤:

1、登录mysql

mysql -u root -p

2、查看慢查询SQL是否启用

show variables like 'log_slow_queries';

ON是开启,OFF则为禁用

3、开启慢查询命令

set global log_slow_queries = on;

方法二、使用show processlist

1、登录mysql

mysql -u root -p

2、输入show processlist;命令

show processlist;

注意state字段中如果包含大量的Sending data、Waiting for tabls、或各种lock(锁),大因为这些SQL造成的数据库拥堵

优化对应的SQL,开启查看慢查询日志,分析sql语句进行优化。

方法三、合理优化配置项

 

检查一下 MySQL 设置,有助于确定内存使用情况,从而为 MySQL 分配合适的值。

innodb_buffer_pool_size

缓存在InnoDB存储的缓冲池中完成。缓冲池的大小对系统性能起着关键作用,并被指定为可用RAM的50-70%之间的值。如果池大小太小,将导致页面过度刷新,如果太大,将由于内存竞争而导致交换。

key_buffer_size

在 MYISAM 存储引擎的情况下,此参数有助于确定缓存,需要根据RAM设置KEY_BUFFER_SIZE,其大小约为RAM大小的20%。

max_connections

为了在任何时刻为 MySQL 分配尽可能多的连接数,并避免单个用户使服务器过载,需要使用max_connections。每个线程使用RAM的一部分进行缓冲区分配,因此它根据RAM的大小限制最大连接数。

一个近似的公式:

max_connections = (Available RAM – Global Buffers) / Thread Buffers 最大连接数 = (有效内存 - 全局缓冲容量)/ 线程缓冲容量

query_cache_size

当不经常更改且Web服务器接收许多相同查询时,查询高速缓存可能会很有用。查询缓存将SELECT语句的文本与发送到客户端的相应结果一起存储。

因此,此参数仅用于此类应用程序服务器,否则将被禁用,并为其他服务器设置为零。

为了避免资源争用,尽管启用了该功能,但应将该值设置为10MB左右的最小值。

阻止滥用资源的程序

当网站受到攻击时,有可能在短时间内建立异常高的连接数量。MySQL 中的 PROCESSLIST 可用于检测顶级用户并阻止对滥用连接的访问。