解决 mysql 内存不足错误消息

解决 mysql 内存不足错误消息

我们有一个 Web 应用程序(racktables),它给我们的生产设备带来了麻烦。每当用户尝试运行搜索时,它都会出现以下错误:

Pdo exception: PDOException

SQLSTATE[HY000]: General error: 5 Out of memory (Needed 2057328 bytes) (HY000)

我无法在我们的备份服务器上重现该问题。除了生产服务器有 16GB RAM 而备份服务器有 8GB 之外,服务器的配置都相同。不过这是一个没有实际意义的问题,因为两者都运行 32 位操作系统,因此只使用 4GB RAM。我们还设置了一个交换分区...

以下是我在生产中使用“free -m”命令得到的结果:

prod:/etc# free -m
             total         used         free       shared      buffers
Mem:          3294         1958         1335            0          118
-/+ buffers:               1839         1454
Swap:         3817          109         3707
prod:/etc# 

我已检查以确保两个盒子上的 my.cnf 匹配。生产数据库已复制到备份服务器上...因此数据也匹配。

我想我们的选择是:

A) convert the o/s to 64 bit so we can use more RAM. 
B) start tweaking some of the innodb settings in my.cnf. 

但在尝试 A 或 B 之前,我想知道是否还有其他东西需要比较两台服务器……看看备份工作是否正常。一定存在一些我们没有考虑到的差异。

我想尝试的一件事就是重新启动服务器,看看是否能解决问题。如果能,则可能表明存在内存泄漏问题。?? 任何建议都将不胜感激。

编辑1

这些是运行 ulimit 命令的结果(两个服务器都有相同的结果)

prod:/etc# ulimit -a
-f: file size (blocks)             unlimited
-t: cpu time (seconds)             unlimited
-d: data seg size (kb)             unlimited
-s: stack size (kb)                8192
-c: core file size (blocks)        0
-m: resident set size (kb)         unlimited
-l: locked memory (kb)             64
-p: processes                      26303
-n: file descriptors               1024
-v: address space (kb)             unlimited
-w: locks                          unlimited
-e: scheduling priority            0
-r: real-time priority             0

答案1

我预测该问题是由一个系统关闭了 VM 过量提交而引起的。

使用 sysctl vm.overcommit_memory 检查该值

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

顺便说一句,对于数据库服务器,我不建议重新启用过量提交。您不想使用交换文件。

答案2

我创建了一个脚本来模拟备份服务器上的负载。然后我能够重现该问题。最后我不得不将“join_buffer_size”设置添加到 my.cnf 中,这解决了该问题。

相关内容