我发现我的一些服务出现错误/崩溃,例如“分配内存错误”或“无法创建新进程”等。
我对此有点困惑,因为日志显示当时系统有大量可用内存(在一种情况下约为 26GB)并且没有在任何其他方面受到特别的压力。
在注意到 JVM 崩溃并出现类似错误以及添加“交换空间不足?”查询后,我进行了更深入的挖掘。
事实证明,有人为我们的区域配置了 2GB 的交换文件。我们的区域没有内存上限,目前可以使用 128GB 的 RAM。我们的 SA 计划在有机会时将其上限设为 32GB。
我目前的想法是,虽然有足够的内存供操作系统分配,但交换空间似乎严重不足(基于此处的其他答案)。似乎 Solaris 想要确保有足够的交换空间以防需要交换内容(即它保留了交换空间)。
这种想法对吗,还是有其他原因导致我在有大量内存可用并且交换空间似乎太小的情况下出现内存分配错误?
答案1
与其他一些实现令人讨厌的内存耗尽消除器或等效功能的操作系统不同,Solaris 不会过度使用内存(除非您使用非常具体的分配技术)。在进行常规内存分配时,操作系统会确保在需要时可用(即预留)。缺点是您需要有足够的虚拟内存空间来存储这些可能部分未使用的内存。
可用 RAM 与之无关,但它也计入虚拟内存大小。
当问题发生时,查看“swap -s”输出。
请注意,您可以通过添加交换文件或设备轻松增加交换区域。