操作系统:Redhat Enterprise Linux 服务器版本 5.3(Tikanga)
架构:Intel Xeon 64位
MySQL Server 5.5.20 企业服务器高级版。
应用程序:Liferay。
我的数据库大小为 200MB。RAM 为 64GB。 内存消耗逐渐增加,我们内存不足。然后只有重新启动才能释放所有内存,但随后内存消耗过程又开始,并在不到一天的时间内达到 63-64GB。
参数详细:
密钥缓冲区大小=16M
innodb_buffer_pool_size=3GB
inndb_buffer_pool_instances = 3 复制代码
最大连接数=1000
innodb_flush_method=O_DIRECT
innodb_change_buffering=插入
读取缓冲区大小=2M
读取缓冲区大小=256K
这是我面临的一个严重的生产服务器问题。这背后的原因是什么以及如何解决。
这是今天下午 2 点的报告,昨天晚上 10 点左右 Linux 重启后。
free -m 的输出
已使用的、可用的、缓存的共享缓冲区总数 内存:64455 22053 42402 0 1544 1164 -/+ 缓冲区/缓存:19343 45112 交换:74998 0 74998
vmstat 2 5 的输出
进程 -----------内存---------- ---交换----- -----io---- --系统----- -----cpu------ rb swpd 免费 buff 缓存 si so bi bo in cs us sy id wa st 0 0 0 43423976 1583700 1086616 0 0 1 173 22 27 1 1 98 0 0 2 0 0 43280200 1583712 1228636 0 0 0 146 1265 491 2 2 96 1 0 0 0 0 43421940 1583724 1087160 0 0 0 138 1469 738 2 1 97 0 0 1 0 0 43422604 1583728 1086736 0 0 0 5816 1615 934 1 1 97 0 0 0 0 0 43422372 1583732 1086752 0 0 0 2784 1323 545 2 1 97 0 0
top -n 3 -b 的输出
顶部 - 14:16:22 启动 16:32,5 个用户,平均负载:0.79、0.77、0.93 任务:总计 345 个,其中 1 个正在运行,344 个正在休眠,0 个已停止,0 个僵尸 CPU:1.0%us、0.9%sy、0.0%ni、98.1%id、0.1%wa、0.0%hi、0.0%si、0.0%st 内存:总计 66002772k,已用 22656292k,可用 43346480k,缓冲区 1582152k 交换:总计 76798724k,已使用 0k,可用 76798724k,缓存 1163616k PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 6434 mysql 15 0 4095米 841米 5500 S 113.5 1.3 426:53.69 mysqld 1 根 15 0 10344 680 572 S 0.0 0.0 0:03.09 初始化 2 根 RT -5 0 0 0 S 0.0 0.0 0:00.01 迁移/0 3 根 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 4 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/0 5 根 RT -5 0 0 0 S 0.0 0.0 0:00.01 迁移/1
答案1
我遇到了类似的问题,基本上我改变了 mysqltuner.pl 脚本并使其更加详细并知道发生了什么。
基本上,内存使用情况,如果您使用任何版本的my-innodb-heavy-4G.cnf
配置文件,内存使用的主要部分将几乎像这样:
memory usage = min(tmp_table_size, max_heap_table_size)
+ key_buffer_size + query_cache_size
+ innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size
+ (max_connections *
(read_buffer_size + read_rnd_buffer_size
+ sort_buffer_size + thread_stack + join_buffer_size
)
)
这个总和并非包含所有因素,请参阅 mysqltuner.pl 脚本代码(并运行它)来查看所有因素。
因此,您似乎需要降低很多read_buffer_size
,,,和,read_rnd_buffer_size
因为它的总和是由乘以 1000 得到的。sort_buffer_size
thread_stack
join_buffer_size
max_connections
另一个解决方案是稍微降低这个max_connections
数字。有了这么大的线程缓冲区内存,innodb_buffer_pool_size
所有与 InnoDB 相关的变量就不再是问题了。
您还可以尝试弄清楚您的应用程序是否真的需要大量的sort_buffer_size
和join_buffer_size
。如果不是,请将这些值记下来。
希望它有帮助。