Linux系统内存使用率与top进程展示使用率不一致问题

简介: 使用top/htop工具查看的内存占用率与free/云监控不一致问题

问题现象如下:

情况1:free -m查看内存使用了1.1G,但是空闲free只有88m

情况2:used直接使用了90%+,其余没有看出占用

top查看进程,只有java占用了不到50%,折算下来空闲内存应该至少还有600M左右,但是实际可用已经没有了。

原因:

简单理解内存分为物理内存和虚拟内存(swap),这里不考虑swap问题。

物理内存又被系统划分为了Buffers、Cached、Active、Inactive,这4大块,其中buffer是给文件的缓冲大小,cache是做内存缓存的,active是活跃内存,inactive是非活跃内存。

其中active又包含了Active(file)、Active(anon)、pagecahce等等,这里不做详细解释,可自行搜索【meminfo详解】

其实平时我们查看具体的内存占用普遍使用free -h去查看,但是要查具体哪个进程占用了内存会考虑使用top,这就产生了问题。

首先,free -h会显示内存总量、使用量、剩余量、cache占用量不包含在已使用量之中,会引起客户误判,不去考虑这个buffer/cache的占用。

其次,top看进程内存占用,也不会去考虑哪个进程使用了多少cache。

所以这就造成了使用率不一致的情况。标准解决,使用命令查看物理内存占用详情。

以MB为单位显示:

cat /proc/meminfo | awk '{print $1,$2/1024" MB"}'|column -t

以GB为单位显示:

cat /proc/meminfo | awk '{print $1,$2/(1024*1024)" GB"}'|column -t

显示的明明白白,清清楚楚。

然后具体情况具体分析,看是哪一块占用了,根据meminfo详解去对照解释。

关于cache、pagecache等的释放命令:

1、sync (将未落盘的内存脏数据同步到磁盘,防止内存数据丢失)

2、

# echo 1 > /proc/sys/vm/drop_caches;

# echo 2 > /proc/sys/vm/drop_caches

# echo 3 > /proc/sys/vm/drop_caches

对于1、2、3的解释:

echo 1是释放页缓存,echo 2 是释放slab,而echo 3就是既释放页缓存,又释放slab


查看Buffer&Cache被哪些进程占用

使用hcache工具查看:

示例:

相关文章
|
5天前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
20天前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
95 2
|
2天前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
9 1
|
10天前
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
13 4
|
14天前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
15天前
|
Linux Windows
检测进程内存的活跃程度
检测进程内存的活跃程度
|
4天前
|
存储 监控 安全
探究Linux操作系统的进程管理机制及其优化策略
本文旨在深入探讨Linux操作系统中的进程管理机制,包括进程调度、内存管理以及I/O管理等核心内容。通过对这些关键组件的分析,我们将揭示它们如何共同工作以提供稳定、高效的计算环境,并讨论可能的优化策略。
11 0
|
16天前
|
Linux
查看进程的内存使用信息
查看进程的内存使用信息
|
16天前
|
Unix Linux
linux中在进程之间传递文件描述符的实现方式
linux中在进程之间传递文件描述符的实现方式
|
17天前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
39 0