想知道Linux机器上是否有足够的内存来部署新应用程序

问题描述 投票:41回答:2

我有一个Linux机器,当执行/ proc / meminfo时其内存快照为:

MemTotal:     16413388 kB
**MemFree:         48296 kB**
Buffers:        193600 kB
Cached:        1986448 kB
SwapCached:     874512 kB
Active:       15034264 kB
Inactive:       713672 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     16413388 kB
LowFree:         48296 kB
SwapTotal:     8385920 kB
SwapFree:      4682408 kB
Dirty:            3124 kB
Writeback:           0 kB
Mapped:       13005560 kB
Slab:           257784 kB
CommitLimit:  16592612 kB
Committed_AS: 59624324 kB
PageTables:     233748 kB
VmallocTotal: 536870911 kB
VmallocUsed:    267064 kB
VmallocChunk: 536603555 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     2048 kB

这是一台16 GB的计算机,我要在其上部署Java应用程序,它将有3个jvm实例,并且它们的组合典型内存需求将接近1 GB。

我想知道在不影响当前正在该计算机上运行的其他应用程序的情况下部署该应用程序是否安全。通过查看上面的内存快照,我们可以找出来吗?

[还有哪些其他统计数据可以帮助我决定这一点,以及如何收集这些统计数据?

java linux unix memory-management
2个回答
129
投票
(对于OP来说可能有点晚了,但这是经常被问到的,所以我会给它一个机会)

free通常显示如下内容:

total used free shared buffers cached Mem: 8195284 8137708 57576 0 1232328 2651156 -/+ buffers/cache: 4254224 3941060 Swap: 18892216 759852 18132364

人们在试图找出他们有多少可用内存时倾向于看Mem:行。不幸的是,这句话很容易引起误解,因为Linux内核试图通过(至少)通过以下方式最佳地利用可用内存:

  • 它将缓存来自I / O子系统(例如磁盘)的数据,以便在需要时可以随时使用。
  • 它会主动将在一段时间内处于非活动状态的进程移出交换空间,而为活动进程缓存数据。这往往倾向于提高吞吐量而不是响应性,因此某些人调整其内核以更改此行为。

第一点是关于free的混乱根源,因为Mem:行包括用于缓存已用内存量的内存。但是,出于性能原因,内核将尽可能多地缓存。实际上,在已经运行了一段时间的任何Linux系统上,可用内存趋于接近零-未使用的内存浪费了内存。

但是,如果另一个进程需要,则内核可以释放高速缓存。尽管它将在一定程度上影响I / O性能,但其他进程可以具有更多的内存

不使用交换空间。因此,出于大多数意图和目的,该内存是可用的

这就是free包含第二行,其中高速缓存被视为空闲的原因:

-/+ buffers/cache: 4254224 3941060

第二行是人们想知道他们是否有足够的空闲内存用于特定目的时应该查看的内容。

在上面的示例中,根据Mem:行,大约有57 MB的可用内存。但是,如果读取第二行,则实际上可以使用大约3.9

GB

,而无需强制活动进程进行交换。附带说明一下,还交换了约760 MB的很少使用的数据,以在主内存中留出更多空间用于处理和缓存。大致同时,/proc/meminfo的内容:

MemTotal: 8195284 kB MemFree: 57660 kB Buffers: 1232352 kB Cached: 2651156 kB SwapCached: 119936 kB . . .

MemTotal:内核检测到的可用物理内存。

[MemFree:未使用的物理内存-Mem:free行中显示的可用内存。

Buffers:相对临时存储原始磁盘块。

Cached:从磁盘读取的文件的内存缓存。它不包含SwapCached内存。

SwapCached:曾经被换出然后又换回但仍在交换空间中的内存。如果需要,可以将其内容丢弃(非常快!),而不必将它们换出(更慢)。

因此,对实际可用的内存进行半准确的估算

MemFree + Buffers + Cached + SwapCached

是一个很好的起点-第二行显示free

自然,内存管理以及相关的统计和测量比这更复杂。 free所示的数字充其量仅是估计值,因为如果您想进一步研究,还有很多其他变量需要考虑。对于经常执行内存使用优化的人们来说,这几乎是一种艺术形式。

编辑:

关于此“问题”的幽默链接:

http://www.linuxatemyram.com/

编辑2:

确认关于内存使用分析的评论几乎是一种艺术形式:

甚至free都丢失了现代Linux系统上的大部分缓存数据。从我系统上的/proc/meminfo

SReclaimable: 2253576 kB

[这是系统slab分配器用于缓存目录条目等的大约2GB的内存,它是可回收的(即,如有必要,进程可以清除并使用它)。但是free不会将其视为缓存内存,也不会在任何计算中输入它,因此它显示为已用内存。

slabtop实用程序,如果可用,则允许系统管理员找出slab缓存的用途。

使free显示系统实际内存使用情况的一种方法(仅对于root用户是这样的:

# swapoff -a # sync # echo 3 > /proc/sys/vm/drop_caches # free total used free shared buffers cached Mem: 8195284 3181468 5013816 0 8656 228832 -/+ buffers/cache: 2943980 5251304 Swap: 0 0 0 # swapon -a

第一个命令禁用交换空间。如果可用内存可能不足以容纳已换出的数据,则不应发出该消息-在这种情况下,必须在其内存使用情况计算中考虑Swap:空闲行。

第二个命令将所有缓冲的数据推入磁盘。它允许在下一步中释放更多的缓存。

第三个命令是集合中最重要的命令-它强制内核丢弃尽可能多的缓存数据(页面缓存,目录条目,inode等)。

然后free最终在其-/+ buffers/cache:行中显示了正在运行的进程实际使用的内容。值得注意的是,即使在删除所有缓存的数据之后,内核仍会迅速再次开始缓存-在这种情况下,它在几秒钟内已经达到了将近250MB的缓存数据。

最终命令再次启用交换空间-仅在也使用第一个命令的情况下才有必要。

应注意,这些命令应由root用户执行以具有必要的特权。


0
投票
可用的-m总可用免费共享buff /缓存可用
© www.soinside.com 2019 - 2024. All rights reserved.