业务高峰期,mysql负载高,连接数过多,导致服务器CPU I/O很大

MySql 码拜 6年前 (2016-02-05) 837次浏览
    首先说下数据库和服务器的配置:
操作系统:Red Hat Enterprise Linux Server release 5.6
cpu核数:8
内存:16G
数据库版本:5.5.28
数据库引擎:Innodb,但是其中有一张很小的表为MyISAM
数据库的最大连接数设置的是1024,在业务高峰期的时候,经常会收到告警短信,报告processlist连接数过高,能达到600-800
这时本人登上数据库show processlist查看,几乎都是sleep状态的会话。
同时服务器的磁盘读写会非常高,而且cpu只有其中2-3个核的I/O会变得很高,以下为部分状况截图:
业务高峰期,mysql负载高,连接数过多,导致服务器CPU I/O很大
业务高峰期,mysql负载高,连接数过多,导致服务器CPU I/O很大
业务高峰期,mysql负载高,连接数过多,导致服务器CPU I/O很大
通过压测发现,磁盘的读写会被一个读进程给堵着,导致个别CPU的核的I/O很高,但是其他核都没有被使用
下面是数据库的配置:
[client]
port = 3328
socket = /data/mysql/egame_user/3328/mysql.sock
[mysqld]
user = mysql
port = 3328
socket = /data/mysql/egame_user/3328/mysql.socki
server-id = 33281
skip-external-locking
skip-name-resolve
key_buffer = 16M
max_allowed_packet = 16M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log-error = /opt/srv/mysql/egame_user/3328/mysql_error.log
pid-file = /opt/srv/mysql/egame_user/3328/egame_user/3328.pid
datadir = /data/mysql/egame_user/3328
character_set_server = utf8
log-slow-queries = /data/mysql/egame_user/3328/slowquery.log
long_query_time = 0.05
binlog_format = MIXED
log-bin=mysql-bin
log_slave_updates=1
innodb_data_home_dir = /data/mysql/egame_user/3328/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data/mysql/egame_user/3328/
innodb_buffer_pool_size = 6G
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 200M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
wait_timeout=360000
interactive_timeout=360000
max_connections=1024
max_binlog_size = 1048576000
expire-logs-days=14
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
现在急需优化和解决,不知道是不是数据库配置的问题,还是服务器的性能问题呢?
问一下该怎么样解决呢?
解决方案

10

引用 2 楼 lvchenotl 的回复:
Quote: 引用 1 楼 yupeigu 的回复:

你查一下那个阻塞其他进程的这个进程,在执行什么sql或是任务

其中有大部分是在重复不停的在查询一张表,表数据量大致16万,虽然sql语句很简单,但是本人上午看了下sql的执行计划,每次查询都是全表扫描的…莫非是原因是这个导致IO高的吗?

照理假如都是全表扫描,且数据量不大,数据在查询之后就会缓存到内存。
但是假如内存吃紧,可能刚放到内存的数据,就被挤出去了,建议先优化一下这个sql,建个索引试试。

10

应该不是磁盘问题    把慢查询时间设置缩小   把无索引的sql的设置了  跑一天 用pt-query-digest跑个结果

10

记录下慢日志,看下sql跑的慢的,优化下sql
太多的查询使得myisam表锁表

10

long_query_time = 0.05
设置这么低?岂不是时时刻刻在写slow log,和开启全日制差不多了吧。
改成 long_query_time = 1 试试看呢?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明业务高峰期,mysql负载高,连接数过多,导致服务器CPU I/O很大
喜欢 (0)
[1034331897@qq.com]
分享 (0)