Linux内存占用过高?非也

前言

今天在我的RPi2上测试GPIO程序,忽然发现机器超卡,重启之后依然如此。于是我top了一下发现了一个问题就是内存爆满!!可我还啥都没干呢这是咋了?于是我呵呵地开始查资料,终于找到了问题所在。


正文

先来在阿里的ECS上top一下感受内存爆满的感觉

# top

top结果

结合操作系统,计组等课程,以及多年以来windows培养给我的直觉,认为0.96G(1016272K)的总内存,使用了0.84G(880960K)的内存,使用率高达88%。然而我还啥都没干,怎么会这样呢?

仔细查看还会发现后面有一个buffers,Swap后面还有一个Cached Mem。


现在我们用free来观察下

#free -m

free结果

虽然Mem显示了0.9G左右的used,但是-/+
buffers/cache(减去buffers和cache的结果)可以看到,当前进程实际占用内存是0.24G(256348K),而可用空闲(free)内存为0.72G(759924K)。

可以这么理解:在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

如上面的例子:共1G的内存,0.9G被占用,但是buffer和cached
mem部分作为缓存,可以使用命中率的方式提高使用效率,而且这部分缓存是根据指令随时可以释放的,我们可以认为这部分内存没有实际被使用,也可以认为它是空闲的。

因此查看目前进程正在实际被使用的内存,是used-(buffers+cache),也可以认为如果swap没有大量使用,mem还是够用的,只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的。



再举个栗子: 这个是我在RPi一群看到的一个群友发的探针监测截图

探针监测

观察内存使用状况一栏,发现物理内存功925.89M,已用911.74M,Cache化的内存是676.46M,Buffers为61.3M,现在用上述公式:

真实的内存使用=used-(buffers+cache)
带入:
    真实使用内存 = 911.74-676.46-61.3 = 173.98
    与第三行的灰条的173.98相符

总结

很高兴对于linux的内存分配有了新的认识 多谢一群的 粵-打雜小白-503 Service Unavailable 的技术支持
多谢Licess’s Blog的精彩分析

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux内存占用过高可能是因为程序运行时占用内存过多,或者是由于系统资源的不足。建议使用linux命令top或者free查看系统内存的使用情况,找出占用内存最多的程序,并采取相应的措施优化。 对于Linux内存占用过高的问题,建议采取以下步骤进行排查和优化: 1.使用命令top或者free查看系统内存的使用情况。在终端中输入"top"或者"free -m"命令,可以查看当前系统中各个进程占用内存的情况,以及系统总内存、已用内存和可用内存等信息。 2.找出占用内存最多的进程。在top命令中,按下shift+m可以将进程按照内存占用量从高到低排序。在free命令中,可以查看各个内存区域的使用情况,找出占用内存最多的区域。 3.分析进程或者内存区域的使用情况。根据进程或者内存区域的使用情况,分析其是否存在内存泄漏或者占用过多内存的情况。如果存在问题,需要对相应的程序进行优化。 4.释放不必要的内存。如果存在不必要的内存占用,可以通过释放内存来缓解内存占用过高的问题。在终端中输入"sudo sync && sudo echo 3 > /proc/sys/vm/drop_caches"命令,可以释放系统中的缓存。 5.调整系统内存管理策略。在一些情况下,可能需要调整系统内存管理策略来优化内存的使用效率。例如,可以修改内核参数vm.swappiness的值,来控制系统使用交换分区的频率。 总之,针对Linux内存占用过高的问题,需要通过分析进程或者内存区域的使用情况,以及调整系统内存管理策略等措施,来优化内存的使用效率。 Linux内存占用过高的原因可能有很多,例如程序的内存泄漏、网络应用的频繁使用、多个应用程序同时运行等。最好的办法是检查系统进程并终止不必要的进程,以减少内存占用Linux内存使用率过高可能是因为以下原因: 1. 运行的程序占用了大量内存。可以使用 top 或 htop 等工具查看进程占用内存情况,并尝试关闭不必要的程序或调整它们的配置,以降低它们的内存占用。 2. 内存泄漏。如果程序存在内存泄漏,它们会持续占用系统内存,直到内存耗尽。可以使用 valgrind 等工具来检查程序是否存在内存泄漏,并及时修复。 3. 缓存和缓冲区。Linux 会将一部分内存用于文件缓存和网络缓冲区,以提高系统性能。这些缓存并不会直接占用系统内存,但会在需要时释放。如果系统内存不足,Linux 会自动清理这些缓存,释放内存空间。 4. 内存碎片。当大量进程频繁申请和释放内存时,会产生内存碎片,导致系统无法分配大块的连续内存空间。可以使用内存碎片整理工具(如 malloc_trim)来解决这个问题。 5. 系统参数设置不当。如果系统参数设置不当,可能会导致内存过度使用。可以使用 sysctl 等工具来检查和调整系统参数。 ### 回答2: Linux内存占用过高的原因可能很多,以下是一些常见的原因和解决方法。 1. 内存泄露:程序中存在内存泄露,导致内存占用不断增加。可以使用工具如Valgrind等来检测和调试程序。 2. 进程爆炸:如果系统中有大量的进程存在,每个进程都占用一些内存,就会导致整体内存占用很高。可以使用命令如ps、top等来查看进程情况,并对不必要的进程进行杀掉或优化。 3. 缓存和缓冲区:Linux系统会通过缓存和缓冲区等机制来提升系统的性能,但这些机制也会占用一部分内存。可以通过一些命令如free、vmstat等来查看缓存和缓冲区的情况,并通过调整内核参数来优化。 4. 虚拟内存:如果物理内存不够用,系统会使用虚拟内存进行内存管理,但虚拟内存的实现会带来一定的性能损失。可以通过增加物理内存或调整虚拟内存的相关参数来优化。 5. 软件/服务:很多软件或服务本身就是内存占用较高的,如数据库、Web服务器等。可以通过调整软件或服务的配置来优化内存占用,例如调节缓存大小、减少并发连接数等。 总之,针对Linux内存占用过高的问题,需要综合考虑各种因素,找到合适的解决方法来优化。常用的工具如top、ps、free、vmstat、sar等都可以帮助我们了解系统的内存使用情况。同时,也需要关注系统的物理内存、交换分区、进程数、缓存和虚拟内存等参数,并加以调整和优化。 ### 回答3: Linux内存占用过高可能有多种原因,以下是一些可能的解决方案: 1. 确认是否为缓存导致的内存占用过高。在Linux中,USED的内存不一定是真正占用内存,而有可能是被分配给缓存。可以使用命令“free -m”查看内存占用情况,并注意查看buffers/cache的占用情况。如果buffers/cache的占用比例较高,可以尝试使用“sync && echo 3 > /proc/sys/vm/drop_caches”释放缓存。 2. 关闭不必要的服务。可以使用命令“systemctl list-unit-files”查看所有已安装的服务,并关闭不必要的服务来释放内存。 3. 开启内存垃圾回收机制。如果内存占用过高,可以尝试开启内存垃圾回收机制,将不常用的内存删除以释放内存。 4. 限制进程内存使用。可以使用“ulimit -v”命令限制进程使用的内存大小,避免单个进程占用过多内存。 5. 调整Swap空间。Swap空间可以作为虚拟内存使用,在内存不足时可以将部分数据写入Swap空间。可以调整Swap空间的大小来优化内存使用。 总结:如果Linux内存占用过高,首先需要确认是真正的内存占用还是缓存占用。如果是缓存占用,可以释放缓存;如果是真正的内存占用,可以调整服务、开启内存垃圾回收机制、限制进程内存使用等方式来优化内存使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值