我认为,应该存在某种类型的内存损坏。问题主要发生在分配大量内存的进程上(尤其是浏览器和cc1plus)。大量内存使用的 JVM 几乎在启动时就死掉了,Eclipse 甚至无法创建它的第一个窗口。该问题几乎总是由空指针取消引用引起的段错误。
我的经历:
- Windows 和 OSX 在 ESXi 中运行相同的进程,不会出现该现象。
- 但是:具有不同内核(3.6 和 4.1 之间)的 Linux 会显示。不同发行版的 Linux(我尝试过 debian、ubuntu 和 opensuse)也会显示。
- 32 位客户机即使是 Linux 也没有问题。
- 尽管 PCI 直通已激活,但如果没有它(甚至在 BIOS 中关闭了 IOMMU),问题就会出现。
- 将 esxi 5.5 升级到 6 没有任何帮助。
其他信息:
- 我在主机上运行了memtest一整晚,没有发现任何问题。
- 在主机上使用 64 位操作系统(因此,没有虚拟化),问题就不会出现。
- 崩溃主要发生在进程分配大量内存之后。
- 该问题几乎总是发生在用户空间中(但其原因可能是内核空间很少分配大量内存)。
- 关闭加速或将客户操作系统切换到“其他 linux”或“其他 64 位操作系统”都没有帮助。
- 关闭来宾机器上的 SMP(即只给它们一个 CPU 核心)并没有帮助。使用其他 CPU 设置(各种多插槽/多核设置,将客户机限制为各种 CPU 核心)没有任何效果。
- 限制来宾操作系统内存也没有帮助,尽管来宾仅运行少数内存消耗低的进程,可以无缝工作。
- 刚上电就不会出现这个问题。它仅在发生一些大的内存无分配周期之后才会出现(例如,仅在 Firefox 中单击几分钟后)。
- 将虚拟 SCSI 控制器类型从 LSI 更改为 vmware 半虚拟,或关闭交换没有帮助。
我认为,某些东西会在大量调用时损坏(清零)来宾操作系统内存brk()
。
有人遇到这个问题吗?还可以采取哪些其他措施来提高狩猎效率?
答案1
问题解决了。
这是一个损坏的内存模块,memtest 无法检测到。 :-)
即使在 Windows 和 OSX 上也会出现此问题,但时间比较晚。
永远不要忘记:memtest 找不到总是每个公羊都有问题!原因是:memtest 循环访问内存并对其进行复杂的操作。但是让内存区域长时间不使用是不行的。
DIMM 内存本质上是一个大型电容器阵列。这些电容器慢慢失去电荷。因此,DIMM需要定期刷新存储器,即需要定期读出和写回其内容。
如果没有发生,记忆就会失去其内容。这种内存刷新是由硬件发生的,主要是在主板/CPU 的内存控制器中。
它们还有另一个功能:读出存储器的内容清除电容器(它们非常小,因为这是在存储芯片中集成尽可能多的电容器的唯一方法)。因此,每次读取内存后,必须将其内容写回。
memtest 无法检测到与此刷新机制相关的问题。
尽管可以检测到内存测试是否适用于某种方法,但它会检查一半内存并让另一半保持安静,并且仅在长时间延迟后才在它们之间进行切换。但直到现在它才在 memtest 中实现。