内存Available 是怎么计算的

本文深入探讨Linux系统中/proc/meminfo文件显示的MemAvailable参数计算原理,揭示其大于Buffers+Cached+MemFree的原因。通过分析内核代码,解释了内存分配策略,包括低水位值的作用、可分配内存的限制条件,以及页缓存和可回收slab内存的考虑。

前段时间在看/proc/meminfo,计算内核态内存,用户态内存,还有X内存。

在看这些的时候发现个问题就是 MemAvailable 竟然大于 Buffers + Cached + MemFree,因为在我印象里一直认为Available会少于buff + cache + free的。

文件:fs/proc/meminfo.c  

于是扒代码分析:

	for_each_zone(zone)
		wmark_low += zone->watermark[WMARK_LOW];

	/*
	 * Estimate the amount of memory available for userspace allocations,
	 * without causing swapping.
	 *
	 * Free memory cannot be taken below the low watermark, before the
	 * system starts swapping.
	 */
	available = i.freeram - wmark_low;

	/*
	 * Not all the page cache can be freed, otherwise the system will
	 * start swapping. Assume at least half of the page cache, or the
	 * low watermark worth of cache, needs to stay.
	 */
	pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
	pagecache -= min(pagecache / 2, wmark_low);
	available += pagecache;

	/*
	 * Part of the reclaimable swap consists of items that are in use,
	 * and cannot be freed. Cap this 
### 内存监控与优化 当 Linux 系统的可用内存低于 1GB 时,系统性能可能会受到显著影响。为了确保系统稳定运行,需要采取适当的监控和优化策略。 #### 内存监控工具 Linux 提供了多种工具来监控内存使用情况。例如,`free` 命令可以快速查看系统的总内存、已用内存和空闲内存。`/proc/meminfo` 文件提供了更详细的内存使用信息,包括高端内存和低端内存的分配情况。`top` 命令则可以实时显示各个进程的内存使用情况,帮助识别占用内存较多的进程 [^4]。 此外,`vmstat` 命令不仅可以监控内存,还可以观察系统的交换活动,这对于判断内存不足时是否频繁使用交换分区非常有用 [^5]。`glances` 和 `atop` 等高级工具提供了更加直观的界面,能够同时监控 CPU、内存、磁盘等多个系统资源 [^4]。 #### 内存优化策略 对于可用内存低于 1GB 的系统,优化内存使用是提高性能的关键。首先,可以通过调整内存分配策略来减少内存浪费。例如,在 32 位系统上,由于高端内存的存在,内核需要将高端内存映射到低端内存才能访问。这种映射会增加额外的开销,因此在设计应用程序时应尽量避免频繁的内存分配和释放操作 [^3]。 其次,优化内核的内存使用情况。Linux 内核会维护一些缓存和缓冲区来提高文件系统的性能,但在内存紧张的情况下,这些缓存可以适当减少以释放更多内存给应用程序使用 [^3]。 另外,可以通过调整 `swappiness` 参数来控制内核使用交换分区的倾向。默认情况下,`swappiness` 的值为 60,表示内核会在内存不足时适度使用交换分区。如果希望减少对交换分区的依赖,可以将该值调低,甚至设为 0,这样内核只有在内存极度不足时才会使用交换分区 [^2]。 #### 内存不足时的应急措施 当系统内存接近耗尽时,可以采取一些应急措施来缓解内存压力。例如,手动终止一些不必要的进程,尤其是那些占用大量内存但对系统运行不是至关重要的进程。此外,可以考虑增加物理内存,或者扩展交换空间,以提供更多的虚拟内存 [^2]。 通过这些监控和优化手段,可以有效提升 Linux 系统在内存紧张情况下的性能表现,确保系统的稳定性和响应速度。 ```bash # 查看当前内存使用情况 free -h # 查看详细的内存信息 cat /proc/meminfo # 实时监控内存使用情况 top # 监控内存和交换活动 vmstat -s # 查看当前的 swappiness 设置 cat /proc/sys/vm/swappiness # 临时修改 swappiness 值(例如设置为 10) sudo sysctl vm.swappiness=10 ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值