Linux 上的 MySQL 内存不足

Linux 上的 MySQL 内存不足

操作系统: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_sizethread_stackjoin_buffer_sizemax_connections

另一个解决方案是稍微降低这个max_connections数字。有了这么大的线程缓冲区内存,innodb_buffer_pool_size所有与 InnoDB 相关的变量就不再是问题了。

您还可以尝试弄清楚您的应用程序是否真的需要大量的sort_buffer_sizejoin_buffer_size。如果不是,请将这些值记下来。

希望它有帮助。

相关内容