我正在尝试使用 Azul 的 ZingVM 进行一些测试,这需要预先分配大量内存。
问题是,在我的服务器(运行 Cent OS 5.8)上,它有 16GB 的内存,重启后将使用超过 8GB 的内存...像这样(我重启服务器,用 ssh 登录,然后free -m
立即运行):
total used free shared buffers cached
Mem: 16048 8281 7767 0 1 19
-/+ buffers/cache: 8260 7788
Swap: 18047 0 18047
显然,缓冲区和缓存不会占用 8GB 内存。这是一个每天运行 Apache Tomcat 的应用程序服务器(用于测试),我确信 Tomcat 不会自动启动。
我尝试找出哪个进程使用了如此大量的内存top
,但却发现使用内存量最高的进程只使用了 4460k……
但是我有另一台服务器(使用 Cent OS 5.8)运行 mysql。此数据库服务器的内存使用情况正常。现在我正在数据库服务器上测试 ZVM,并且 Zing 在启动时分配 65% 的内存,重新启动后,显示free -m
:
total used free shared buffers cached
Mem: 16048 10942 5105 0 3 55
-/+ buffers/cache: 10883 5165
Swap: 18047 0 18047
所以...如果我们忽略 Zing 使用的 16GB 的 65%(大约 10GB),重启后使用的内存应该只有几 MB。
现在我只是在测试是否可以在 ZingVM 下运行 Tomcat。然后我需要在另外两台 Cent OS 服务器上进行实际测试,不幸的是,这两台服务器存在同样的问题。也就是说,我们有 4 台服务器,其中 3 台服务器存在此问题。
导致此问题的原因可能是什么? 我可以在不重新安装这些机器上的操作系统的情况下解决此问题吗?
更新:
以下是我尝试将 zing-system-tool 设置为使用时报告的内容75%(这是内存的默认值)。当我指定 85% 时,输出模式完全相同。
Fatal error: Not enough free memory (memoryForAzulBytes (12620660736) > MemFree (8142327808)).
zing-memory: ERROR: Configure pmem failed
Fatal error: os::safeSystem: command '/sbin/service zing-memory restart' failed.
下面是数据库服务器上成功分配的内存(我这次指定了68%,旧值是65%;ZST 会自行释放保留的内存):
Info: azulPmemPages: 5456.
INFO: az_pmem_reserve_pages (num2mPages 5456) succeeded
INFO: az_pmem_fund_transfer (to 7, from 0, bytes 11442061312) succeeded
INFO: az_pmem_fund_transfer (to 1, from 7, bytes 570425344) succeeded
INFO: az_pmem_fund_transfer (to 3, from 7, bytes 570425344) succeeded
INFO: az_pmem_fund_transfer (to 0, from 7, bytes 10301210624) succeeded
Info: You can now start Java processes up to -Xmx9824m or -Xmx9g.
Info: Azul pmem initialized successfully.
zing-memory: INFO: start successful
zing-memory: INFO: restart successful
更新 2:
我在有问题的服务器的 /proc/meminfo 中看到了这一点:
HugePages_Total: 4096
HugePages_Free: 4096
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
而在数据库服务器上,它全为 0。这可能是内存占用的原因吗?
答案1
好的,我明白了:
请参阅问题中的我的更新 2。这就是原因。
Hugepage 是保留的;除非指定,否则应用程序不会使用它。因此 ZST 无法分配内存。
当我将Hugepage设置为零时,内存立即被释放,ZST成功分配内存。
答案2
在有问题的服务器上尝试slabtop
,看看内核是否出于某种原因分配了大量的 RAM。例如,XFS 可以为其缓存分配大量内存,而这些内存在缓冲区/缓存列中根本不可见(尽管 XFS 会在需要时释放内存)。