有个客户10月18日应用接口都访问慢,nginx层面error显示连接拒绝,当时实施同学重启了java应用运行正常,但今天又卡死了,后台登录也登录不上去,看日志没异常,最终找到了数据库层面。
查看数据库相关日志:
/var/log/messages (系统日志)---无error日志
/mysqld.log 显示以下的warning报错
这个报错的意思是数据库的缓冲池找不到空闲块了。和缓冲池设置大小有关。
show variables like '%buffer%';
innodb_buffer_pool是 InnoDB
缓冲池,是一个内存区域保存缓存的 InnoDB
数据为表、索引和其他辅助缓冲区。innodb_buffer_pool_size 是这个缓冲池的大小,默认128M(即134217728 bytes)
如果不设置innodb_buffer_pool_size,在生产环境的sql执行效率将大大下降,原因是缓存的空间变小,能缓存的数据量有限,缓存的命中率大打折扣,会导致反复去磁盘上读数据,众所周知磁盘的速度远远低于内存的执行效率。
那设置多大合适呢?如何配置呢?
两种设置方式,区别在于MySQL的运行状态,静态设置需要重启MySQL,动态设置在MySQL运行期动态调整。
静态设置:
- 修改my.cnf,在
[mysqld]
作用域添加innodb_buffer_pool_size=2G
- 重启mysql。
动态设置:
- 执行
SET GLOBAL innodb_buffer_pool_size=计算值;
设置缓冲池大小。 - 执行
SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';
查询缓冲池大小改变状态,出现Completed resizing buffer pool at 时间戳
即完成。 - 执行
SELECT @@innodb_buffer_pool_size;
查询当前缓冲池大小。
如何查看系统的物理内存?确认设置的缓冲池大小合适呢?
free -h