我有一台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

这是一台16GB的机器,我要在上面部署一个Java应用程序,它将使用3个JVM实例,它们的典型组合内存需求将接近1GB.

如何确保在不影响该机器上当前运行的其他应用程序的情况下安全地部署上述应用程序.可以从上面的内存快照中找到吗?

还有什么其他统计数据可以帮助我做出决定,我该如何收集这些统计数据?

推荐答案

(这篇文章可能有点晚了,但是经常有人问这个问题,所以我会试一试)

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性能,但其他进程可以拥有更多内存.因此,就大多数意图和目的而言,that memory is free.

这就是为什么free包含第二行,其中高速缓存被认为是空闲的:

-/+ buffers/cache:    4254224    3941060

当人们想知道他们是否有足够的空闲内存用于某个特定目的时,第二行是他们应该看到的.

在上面的例子中,根据Mem:行,有大约57MB的可用内存.但是,如果读第二行,实际上大约有3.9 GB可以在不强制活动进程交换的情况下使用.作为旁注,还有大约760 MB很少使用的数据被交换掉,以便在主内存中为进程和缓存留出更多空间.

大约在同一时间,/proc/meminfo的内容:

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

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

MemFree:未使用的物理内存——freeMem:行中显示的可用内存.

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

Cached:用于从磁盘读取文件的内存缓存.它不包括交换缓存内存.

SwapCached:曾经被调出,然后又调回,但仍在交换空间中的内存.如果需要,它的内容可以丢弃(非常快!),无需更换(速度较慢).

所以,要对实际可用的内存进行半准确的估计

MemFree + Buffers + Cached + SwapCached

这是一个很好的起点——第二行显示的是free.

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

编辑:

关于这个"问题"有点幽默的链接:

http://www.linuxatemyram.com/

编辑2:

为了证实关于记忆使用分析几乎是一种艺术形式的 comments :

在现代Linux系统上,即使是free次,也会丢失大部分缓存数据.从我的系统的/proc/meminfo开始:

SReclaimable:    2253576 kB

这大约是2GB的内存,由system slab分配器用于缓存目录条目等,它是可回收的(也就是说,如果需要,它可以被清除并由进程使用).然而,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:行空闲数据.

第二个命令将所有缓冲数据推送到磁盘.它允许在下一步释放更多缓存内存.

第三个命令是集合中最重要的一个,它强制内核丢弃尽可能多的缓存数据(页面缓存、目录项、索引 node 等).

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

最后一个命令再次启用交换空间——只有在也使用了第一个命令时才有必要.

应该注意的是,这些命令应该由root用户执行,以便获得必要的权限.

Linux相关问答推荐

在不影响ROS2安装的情况下更新Ubuntu Linux中的CMake

Docker 不保留 chown 用户设置

Linux 上 Ada 任务优先级的语义是什么?

jinja2.exceptions.TemplateSyntaxError:预期标记,,得到整数(支持十六进制,八进制和二进制整数文字)

使用sed命令将记录中的字符串替换为DD-MMM-YYYY日期格式

如何删除文件中不需要的字符(使用 shell 脚本)

`std::cout` 是如何实现的?

Bash - 如何根据 names.txt 重命名目录中的文件

使用 awk 或 sed 删除特定字符

在 Python 上模拟鼠标点击

Linux C程序:如何找到函数所属的库

我可以在 Ubuntu 上使用 Homebrew 吗?

在 mac 上通过 ssh 连接到 amazon aws linux 服务器

如何在 Linux 上取消关机?

Supervisord - 将进程标准输出重定向到控制台

Vim 增量搜索

网络共享文件夹上的 GIT 存储库中的并发性

适用于 Windows、Linux、MacOS X 的跨平台脚​​本

学习内核编程

如何在 docker 容器中运行 cron 作业(job)