我最近将虚拟机从 12GB 升级到 64GB,发现在没有运行任何应用程序的情况下,分配了一半的内存。升级后,虚拟机负载混乱,大多数时候虚拟机无响应。
htop
我在和上都找不到ps
哪个进程正在分配此内存,但我在输出中发现df -h
某些分区(例如/tmp
、和 )/sys/fs/cgroup
正在使用文件系统中的 32G,并使用 中的 32GB 。/run
/dev/shm
tmpfs
/dev
devtmpfs
我理解这个内存是共享的,这就是内存使用的原因,新的应用程序可能会使用这些分区占用的内存。如果我错了,请纠正我。但是,该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
。我没有那一刻的输出,也没有vmstat
和top -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应用程序挂起,我什至无法执行ps
或htop
,唯一的解决方案是执行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
您的devtmpfs
和tmpfs
文件系统实际上并没有使用 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 负载混乱,因此确实确认这些文件系统不是罪魁祸首。