获取 Linux 系统和 Docker 容器的内存使用情况

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 这是一段比我最初想象的更长的旅程。我的要点是:• Available Memory > Free Memory 即: 允许使用内存 > 空闲内存• 能用MemAvailable时,用MemAvailable• Docker 容器中的进程直接在主机操作系统中运行• 准确了解您正在测量的内容,尤其是在 Docker 容器中

最近,我开始监控我们一直在开发的 Node.js 应用程序。一段时间后,我发现它的内存使用率增长缓慢,3 天就增长了 20%。在以下 Node.js 代码中测量了内存使用情况。


const os = require("os");
const total = os.totalmem();
const free = os.freemem();
const usage = ((free - total) / total) * 100;

所以,它们基本上来自操作系统,在这种情况下是Docker 上的Alpine Linux。幸运的是,我还记录了应用程序进程的内存使用情况,但它们并没有增加。那么为什么操作系统内存使用量会增加呢?


缓冲区和缓存内存

我使用了top命令Shift+m(按内存使用情况排序)并比较了长时间运行的服务器上的进程和新部署的服务器上的进程。双方的流程几乎相同。唯一的区别是,buffers并且cached Mem在长期运行的情况下很高。

经过一些研究或谷歌搜索后,我得出结论,这不是问题。当应用程序进程要求更多内存时,大部分buffers和cached Mem被放弃。

其实free -m命令提供了一行used,并free采取缓冲区和缓存的考虑。

$ free -m
             total  used  free  shared  buffers cached
Mem:          3950   285  3665     183       12    188
-/+ buffers/cache:    84  3866
Swap:         1896     0  1896

那么,它们究竟是什么?根据的手册/proc/meminfo,这是一个伪文件和 的数据源free,top还有朋友:

Buffers %lu
       Relatively temporary storage for raw disk blocks that
       shouldn't get tremendously large (20MB or so).
Cached %lu
       In-memory cache for files read from the disk (the page
       cache).  Doesn't include SwapCached.

我仍然不确定到底Buffers包含什么,但它包含文件的元数据等,而且它的大小相对微不足道。Cached包含缓存的文件内容,称为页面缓存。操作系统保留页面缓存,而 RAM 有足够的可用空间。这就是为什么即使进程没有泄漏内存,内存使用量也在增加。

如果您有兴趣,/proc/meminfo 输出中的 Buffers 和 Cached 列有什么区别?在 Quora 上有关于Buffers和的更多详细信息Cached。


可用内存

那么,我们应该使用free + buffers + cached? /proc/meminfo有一个更好的指标,称为MemAvailable。

MemAvailable %lu (since Linux 3.14)
       An estimate of how much memory is available for
       starting new applications, without swapping.
$ cat /proc/meminfo
MemTotal:        4045572 kB
MemFree:         3753648 kB
MemAvailable:    3684028 kB
Buffers:           13048 kB
Cached:           193336 kB
...

它的背景在 Linux Kernel中的提交中得到了很好的解释,但本质上它排除了不可释放的页面缓存并包括可回收的平板内存。Linux v4.12-rc2 中的当前实现看起来仍然几乎相同。

free -m有available列的一些实现。例如,在 Boot2Docker 上:

$ free -m
       total  used  free  shared  buff/cache  available
Mem:    3950    59  3665     183         226       3597
Swap:   1896     0  1896

它也可以通过--mem-avail标志在 AWS CloudWatch 指标上使用。


关于 Docker 的一些背景

我的另一个问题是“Docker 中的这些指标是否相同?”。在深入探讨这个问题之前,让我们检查一下 docker 是如何工作的。

根据Docker 概述:底层技术,Docker 容器中的进程直接在其主机操作系统中运行,没有任何虚拟化,但由于这些 Linux 内核特性,它们与主机操作系统和其他容器有效隔离:

命名空间:隔离 PID、主机名、用户 ID、网络访问、IPC 等。

  • cgroups:限制资源使用
  • UnionFS : 隔离文件系统
    由于命名空间的原因,pscommand除了列出宿主操作系统中的其他进程外,还列出了Docker容器的进程,而它不能列出宿主操作系统或docker容器中其他容器的进程。

默认情况下,Docker 容器没有资源限制。所以,如果你在一台主机上运行一个容器,并且不限制容器的资源使用,这就是我的情况,容器的“空闲内存”与主机操作系统的“空闲内存”是一样的。


Docker 容器上的内存指标

如果您想从容器外部监控 Docker 容器的内存使用情况,这很容易。您可以使用docker stats.

$ docker stats
CONTAINER     CPU %  MEM USAGE / LIMIT  MEM %  NET I/O     BLOCK I/O  PIDS
fc015f31d9d1  0.00%  220KiB / 3.858GiB  0.01%  1.3kB / 0B  0B / 0B    2

但是,如果您想获取容器中的内存使用情况或获取更详细的指标,就变得复杂了。Linux 容器内的内存详细描述了困难。

/proc/meminfo和sysinfo,由Node.js使用os.totalmem()和使用os.freemem(),不是孤立的,如果您在 Docker 容器中使用top和等普通实用程序,您将获得主机操作系统的指标free。


要获取特定于 Docker 容器的指标,您可以在/sys/fs/cgroup/memory/. 不过,它们并未根据Linux 容器内的内存进行标准化。

$ cat /sys/fs/cgroup/memory/memory.usage_in_bytes
303104
$ cat /sys/fs/cgroup/memory/memory.limit_in_bytes
9223372036854771712

memory.limit_in_bytes如果没有限制,则返回一个非常大的数字。在这种情况下,您可以使用/proc/meminfo或使用它的命令找到主机操作系统的总内存。


结论


这是一段比我最初想象的更长的旅程。我的要点是:

  • Available Memory > Free Memory 即: 允许使用内存 > 空闲内存
  • 能用MemAvailable时,用MemAvailable
  • Docker 容器中的进程直接在主机操作系统中运行
  • 准确了解您正在测量的内容,尤其是在 Docker 容器中
相关文章
|
3天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
19 3
|
3天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
16 2
|
13天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
35 5
linux系统服务二!
|
3天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
18 3
|
6天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
23 6
|
6天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
31 6
|
7天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
33 5
|
7天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
25 3
|
10天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
7天前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####