想知道在Linux机器上是否有足够的内存来部署新的应用程序
我有一个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。
我想知道部署该应用程序是否安全,而不会影响当前在该机器上运行的其他应用程序。 通过查看上面的内存快照我们可以找出?
还有什么其他统计数据可以帮助我做出决定,以及如何收集这些数据?
(OP可能有点晚了,但是这个问题经常被问到,所以我会试试看)
free
通常显示这样的事情:
total used free shared buffers cached Mem: 8195284 8137708 57576 0 1232328 2651156 -/+ buffers/cache: 4254224 3941060 Swap: 18892216 759852 18132364
当试图找出他们有多less空闲的内存时,人们往往会看Mem:
行。 不幸的是,这行很容易让人误解,因为Linux内核试图通过以下方式来最佳地利用可用内存:
-
它将caching来自I / O子系统(如磁盘)的数据,以便在需要时可以随时使用。
-
它会主动将已经处于非活动状态的进程逐渐迁移到交换空间,以便为活动进程caching数据。 这往往倾向于吞吐量而不是响应能力,所以有些人调整他们的内核来改变这种行为。
第一点是关于free
的混淆的原因,因为Mem:
行包含用于在使用的内存量中caching的内存。 尽pipe如此,为了性能的原因,内核将尽可能地caching。 事实上,在任何已经运行一段时间的Linux系统中,空闲内存往往接近于零 – 未使用的内存浪费了内存。
但是,如果其他进程需要,内核可以释放高速caching内存。 虽然会在一定程度上影响I / O性能,但其他进程可以在不使用交换空间的情况下拥有更多的内存。 因此,对于大多数意图和目的, 这个记忆是免费的 。
这就是为什么free
包含第二行,其中caching内存被认为是免费的:
-/+ buffers/cache: 4254224 3941060
第二行是当人们想知道是否有足够的空闲内存用于某种目的时,应该关注的内容。
在上面的例子中,根据Mem:
行,有〜57 MB的可用内存。 但是,如果读取第二行,则实际上可以使用大约3.9 GB的数据 ,而不会强制进行主动进程交换。 作为旁注,还有大约760 MB的已经被换出的很less使用的数据,为进程和caching在主内存中占用更多的空间。
几乎与此同时, /proc/meminfo
的内容:
MemTotal: 8195284 kB MemFree: 57660 kB Buffers: 1232352 kB Cached: 2651156 kB SwapCached: 119936 kB . . .
MemTotal
:内核检测到的可用物理内存。
MemFree
:未使用的物理内存 – Mem:
行中的free
Mem:
。
Buffers
:相对临时存储原始磁盘块。
Cached
:从磁盘读取文件的内存caching。 它不包括SwapCached内存。
SwapCached
:曾经换出的内存,然后交换回来,但仍然在交换空间。 如果需要,它的内容可以被丢弃(非常快!),而不必交换出来(较慢)。
所以,要有实际可用的内存的半精确估计
MemFree + Buffers + Cached + SwapCached
这是一个很好的起点,而第二条线是一个free
节目。
当然,内存pipe理和相关的统计和测量比这更复杂。 free
显示的数字仅仅是估计值,因为如果你想深入一些,还有很多其他variables需要考虑。 对于经常执行内存使用优化的人来说,这几乎是一种艺术forms。
编辑:
有关这个“问题”的幽默链接:
编辑2:
要确认关于记忆使用分析的评论几乎是一种艺术forms:
即使free
错过了现代Linux系统上的大部分caching数据。 从我的系统上的/proc/meminfo
:
SReclaimable: 2253576 kB
这大约是2GB的内存,系统板分配器用于caching目录条目等,它是可回收的(即它可以被清除,并在必要时进程使用)。 然而, free
不认为它caching内存,并没有进入它的任何计算,因此它显示为使用的内存。
slabtop
实用程序(如果可用)允许系统pipe理员查找slab高速caching的用途。
一种方式(仅限root用户)可以free
显示系统的实际内存使用情况如下:
# 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:
行。
第二个命令将所有缓冲的数据推送到磁盘。 它允许在下一步释放更多的高速caching。
第三个命令是集合中最重要的一个 – 它强制内核丢弃尽可能多的caching数据(页面caching,目录条目,inode等)。
然后free
最终显示正在运行的进程实际使用的是-/+ buffers/cache:
行。 很明显,即使在删除所有caching的数据后,内核也会很快开始caching – 在这种情况下,几秒钟内已经达到了将近250MB的caching数据。
最后一个命令再次启用交换空间 – 只有在使用第一个命令时也是如此。
应该注意的是,这些命令应该由root用户执行,以获得必要的权限。