问题描述
服务器系统负载持续高,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 可用于检测顶级用户并阻止对滥用连接的访问。
还没有内容