我们有一个 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 中,这解决了该问题。