为什么 CentOS 将一半内存用于 devtmpfs 或 tmpfs?

为什么 CentOS 将一半内存用于 devtmpfs 或 tmpfs?

我最近将虚拟机从 12GB 升级到 64GB,发现在没有运行任何应用程序的情况下,分配了一半的内存。升级后,虚拟机负载混乱,大多数时候虚拟机无响应。

htop我在和上都找不到ps哪个进程正在分配此内存,但我在输出中发现df -h某些分区(例如/tmp、和 )/sys/fs/cgroup正在使用文件系统中的 32G,并使用 中的 32GB 。/run/dev/shmtmpfs/devdevtmpfs

我理解这个内存是共享的,这就是内存使用的原因,新的应用程序可能会使用这些分区占用的内存。如果我错了,请纠正我。但是,该free -mh命令报告大约 20GB 的内存可用于新应用程序。 “免费”栏也是如此。

输出df -h

Filesystem           Size  Used Avail Use% Mounted on
...
devtmpfs              32G     0   32G   0% /dev
tmpfs                 32G     0   32G   0% /dev/shm
tmpfs                 32G   49M   31G   1% /run
tmpfs                 32G     0   32G   0% /sys/fs/cgroup
tmpfs                 10G   17M   10G   1% /tmp
...

输出free -mh

               total        used        free      shared  buff/cache   available
Mem:            62G         41G         21G         24M        106M         21G

px aux程序使用更多内存来看,为 75MB /usr/lib/systemd/systemd-journald。我没有那一刻的输出,也没有vmstattop -b 1命令的输出。

在另一台 128GB 的​​ Centos 机器上,我注意到tmpfs使用了 64GB,但是,输出中的“可用”列仍然free -mh表明新应用程序最多可以分配 123GB,即使根据“空闲”列有 59GB 可用空间。

后一个例子似乎是正确且可以理解的。但前者我无法理解。

我在向 java 应用程序分配超过 12GB 的内存时遇到问题 ( ES_HEAP_SIZE=12g),我想知道是否应该考虑采取任何措施来改善内存行为。另外,我想更好地理解这个tmpfs分区背后的原因以及为什么它分配一半的系统内存。有什么办法可以减小devtmpfs和的大小吗tmpfs?它如何影响系统?

该系统是Centos 7.1.1503带内核版本3.10.0-229.el7.x86_64。预先非常感谢您。

后记:java应用程序挂起,我什至无法执行pshtop,唯一的解决方案是执行killall -9 java。系统也开始反应迟钝。

2017/01/11 更新

现在,由于执行了更多应用程序,因此正在运行更多进程。输出lsof -n | grep deleted为空。我做了ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n哪些报告:

  • 143 个小于 1MB 的进程。
  • 55 个进程的大小在 1 到 10MB 之间,总计 221MB。
  • 只有 5 个进程超过 10MB,它们是:
    • python 14.89 MB
    • rsyslogd 26 MB
    • systemd-journald 47.83 MB
    • kibana 78.72 MB
    • java 13456 MB

不过,该free -mh命令报告以下内容,我不知道其余的内存被消耗在哪里。

              total        used        free      shared  buff/cache   available
Mem:            62G         54G        5.5G        478M        3.2G        7.8G

2017/01/16 更新

问题已经解决了。首先,这个问题存在不同的问题。

tmpfs内存使用量与或无关,devtmpfs但与 vmware 主机的内存膨胀有关。这与 8GB 配额(与虚拟机的内存分配相矛盾)一起导致了所报告的奇怪行为,其中虚拟机负载混乱。 dmesg 中提到的有错误vmballoon_work

我找不到有关此问题的任何信息,这表明这可能是主机的问题,所以我认为这个问题/答案可能对未来的问题有用。关键点是这些 dmesg 消息:

CPU: 6 PID: 10033 Comm: kworker/6:0 Not tainted 3.10.0-229.el7.x86_64 #1
Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 09/17/2015
Workqueue: events_freezable **vmballoon_work** [vmw_balloon]
task: ffff88001d4ead80 ti: ffff880b9bad8000 task.ti: ffff880b9bad8000
RIP: 0010:[<ffffffff812edd71>]  [<ffffffff812edd71>] __list_del_entry+0x31/0xd0
RSP: 0000:ffff880b9badbd68  EFLAGS: 00010246
RAX: ffffffffa032f3c0 RBX: ffffea0000000003 RCX: dead000000200200
RDX: ffffea001107ffe0 RSI: ffff88103fd969f0 RDI: ffffea0011040020
RBP: ffff880b9badbd68 R08: ffffea0011040020 R09: ffff88103fb94000
R10: 0000000000000020 R11: 0000000000000002 R12: ffff88103ff9d0d0
R13: 0000000000000002 R14: ffffff8000000001 R15: 0000000000000002
FS:  0000000000000000(0000) GS:ffff88103fd80000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 00000000016ba024 CR3: 0000000267e1c000 CR4: 00000000000407e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Stack:
 ffff880b9badbd80 ffffffff812ede1d ffffffffa032f3c0 ffff880b9badbdb0
 ffffffffa032d04e ffffffffa032f4c0 ffff880155bd4180 ffff88103fd92ec0
 ffff88103fd97300 ffff880b9badbe18 ffffffffa032d388 ffffffffa032f4c8
Call Trace:
 [<ffffffff812ede1d>] list_del+0xd/0x30
 [<ffffffffa032d04e>] vmballoon_pop+0x4e/0x90 [vmw_balloon]
 [<ffffffffa032d388>] vmballoon_work+0xe8/0x720 [vmw_balloon]
 [<ffffffff8108f1db>] process_one_work+0x17b/0x470
 [<ffffffff8108ffbb>] worker_thread+0x11b/0x400
 [<ffffffff8108fea0>] ? rescuer_thread+0x400/0x400
 [<ffffffff8109739f>] kthread+0xcf/0xe0
 [<ffffffff810972d0>] ? kthread_create_on_node+0x140/0x140
 [<ffffffff8161497c>] ret_from_fork+0x7c/0xb0
 [<ffffffff810972d0>] ? kthread_create_on_node+0x140/0x140

我要感谢瑞·F·里贝罗他关于tmpfs和 的回答devtmpfs。我把标题从为什么 CentOS 将一半内存用于 devtmpfs 或 tmpfs?我的 CentOS 虚拟机使用了一半的内存在哪里?并添加了一些标签。

答案1

您的devtmpfstmpfs文件系统实际上并没有使用 GB 的内存;它们可能会增长到 32GB,但这个大小只是它们增长的上限。这个上限也是可配置的,并不是它们使用的;它们只占用 RAM 中有内容的部分。

如果您仔细查看 df:
/dev使用的内存少于 1M,因此显示为 0,
/dev/shm同样的事情,
/sys/fs/cgroup同样的情况,
/tmp正在使用 17 MB,
/run正在使用 49 MB。

因此,您的 devtmpfs、tmpfs 文件系统组合使用的 RAM 不到 70MB。 (兆字节,请注意)

消耗 RAM 的肯定不是那些文件系统。

正如我所说,如果您感到困扰,您可以更改它们的上限值,但目前我将重点关注您的 JVM 参数配置为使用多少 RAM。

最终,根据 OP 反馈,vmware 主机存在内存膨胀问题,并且 dmesg 中提到 vmballoon_work 时出现错误。

这与 VM 管理程序中的 8GB 配额一起导致了所报告的奇怪行为,其中 VM 负载混乱,因此确实确认这些文件系统不是罪魁祸首。

相关内容