排除来自mysql的内存不足错误消息

我们有一个networking应用程序(机架表),这给我们的生产箱上的悲伤。 每当用户尝试运行search,它会给出以下错误:

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

我无法在我们的备份服务器上重新创build问题。 服务器匹配,除了在生产中,我们有16GB的内存,我们的备份,我们有8GB的事实。 这是一个有争议的问题,因为两者都运行32位的操作系统,所以只能使用4GB的内存。 我们也build立了一个交换分区…

下面是我从生产中的“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匹配。 生产的数据库被复制到备份服务器上…所以数据也匹配。

我想我们的select是:

 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之前,我想知道两台服务器之间是否还有其他的东西需要比较……看看备份的工作情况如何。 在我们没有考虑到的地方肯定有区别。

有一件事我想要尝试的只是重新启动服务器,看看是否修复它。 如果是这样,它可能表明内存泄漏的问题。 ?? 任何build议,将不胜感激。

编辑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 

我预测这个问题是由于一个系统closures了VM overcommit引起的。

使用sysctl vm.overcommit_memory检查值

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

顺便说一下,对于数据库服务器,我不build议重新开启。 你不想使用交换文件。

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