系统内存还有很多的情况下为何swap使用很高了

本文详细介绍了Linux系统中的Swap机制,解释了什么是Swap以及它是如何工作的。此外,还探讨了内存回收机制,包括何时以及如何回收内存,并讨论了Swap的积极程度如何通过swapiness参数进行调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Swap是什么

  • Swap就是把一块磁盘空间或者一个本地文件,当成内存来使用。
  • 换出,就是把进程暂时不用的内存数据存储到磁盘中
  • 换入,就是在进程再次访问这些内存的时候,从磁盘中读取到内存
  • Swap其实是把系统的可用内存变大了,这样即使服务器的内存不足,也可以腾出空间来运行大内存的应用程序。
  • 既然Swap是为了回收内存,那么Linux会在什么时候需要回收内存呢?它又是怎么来衡量内存是不是紧张或者压力大呢?

内存回收是什么?

  • 内存回收是子系统释放掉可以回收的内存
  • 缓存和缓冲区,他们在内存管理中,叫做文件页
  • 大部分文件页可以直接回收,有需要的时候再从磁盘读取
  • 至于脏页,就得先写入磁盘,然后才能进行内存释放
  • 脏页的回收,可以在应用程序中,通过系统调用fsync,或者有系统内核现成pdflush负责刷新到磁盘
  • Swap,应用程序动态分配的堆内存,他们在内存管理中叫做匿名页

如何衡量内存是不是紧张了呢?
在这里插入图片描述

  • 定期回收内存的内核线程kwapd0,定义了三个内存阀值,然后根据内存剩余值的范围来进程对应内存操作
  • 页最小阀值,内存压力很大,无法进行正常分配
  • 页低阀值,内存有一定的压力,但是可以进行正常分配
  • 页高阀值,内存无压力
  • 如果剩余内存小于页低阀值,就会出发内存回收了
  • 页低阀值可以查看 /proc/sys/vm/min_free_kbytes
  • min_free_kbytes设置了页最小阀值,根据这个阀值可以计算另外两个数值
  • pages_low = pages_min*5/4
  • pages_high = pages_min*3/2

查看系统页低最小阀值
内存阀值参数

  • pages中的min、low、high,就是三个内存阀值
  • free就是剩余内存页数,它跟后面的nr_free_pages相同
  • nr_active_anon和nr_inactive_anon,分别是活跃和非活跃的匿名页数
  • nr_active_file和nr_inactive_file,分别是活跃和非活跃的文件页数
  • 那内存参数里面的Node0和Node1又是什么呢?

查看内存相关的信息
NUMA架构

  • 处理器的NUMA架构,在这种架构下,多个处理器被划分到不同的Node上,同时每个Node都拥有自己的本地内存空间
  • 当某个Node内存不足时,系统可以从本地内存中回收内存,也可以从其他Node寻找空闲内存。具体什么模式,可以通过zone_reclaim_mode参数来调整
  • 默认0,既可以本地回收内存,也可以从其他Node寻找空闲内存
  • 1、2、4都表示只回收本地内存,2表示可以回写脏数据回收内存,4表示可以用Swap方式回收内存

在这里插入图片描述

在这里插入图片描述

内存回收机制

  • 到这里,我们就可以理解内存回收机制了。这些回收的内存既包括了文件页,又包括了匿名页
  • 对文件页的回收,就是直接回收缓存,或者把脏页写回磁盘后再回收
  • 对匿名页的回收,其实就是通过Swap机制,把它们写入磁盘后再释放内存
  • 这两种不同的内存回收机制,在实际的内存回收过程中,到底应该先回收哪一种呢

swapiness

  • Linux提供了一个swapiness选项,用来调整使用swap的积极程度
  • 范围是0-100,数值越大,表示越积极使用Swap,也就是更倾向于回收匿名页数
  • 数值越小,越消极使用Swap,也就是更倾向于回收文件页
  • 默认的60是一个比较中和的值,系统会根据实际运行情况,选择合适的内存回收类型,比如回收不活跃的匿名页,或者不活跃的文件页

查看系统的swapiness
Swap被哪些应用占用

  • 可以使用以下命令来查看系统的Swap被哪些应用所占用

在这里插入图片描述

关掉Swap会发生什么

  • 当内存足够的时候,关掉Swap,Swap占用的空间大小会保存在内存当中去
  • 当内存不够的时候,没法强行关掉Swap

内存足够时关闭Swap
内存不够时关闭Swap

解答十个问题

  • 为什么系统在可用内存还有很多的情况下,会用到swap? 答案:这个受numa架构参数值,swapiness参数值以及文件页和匿名页不同内存对象的影响。
  • swap到磁盘中的匿名页,当再次被换入到内存中,那磁盘中的匿名页会被释放掉吗? 答案:会的。
  • 如果swap到磁盘中的匿名页一直没被使用,磁盘中如何进行释放? 答案:会根据进程生命周期来进行释放。
  • 如果系统不开启Swap,那匿名页还怎么回收? 答案:会一直保存在内存中。
  • 如果大量匿名页把Swap都写满了,这个时候怎么选择从swap里清理哪些匿名页? 答案:大量匿名页把Swap都写满了,说明内存不够了,可能会出现OOM了。
  • 内核中swapness使用的默认值是60,如果配置为0还会使用swap吗? 答案:会的。这个值只是一个倾向值,即使为0,在内存紧张的情况下,还是有可能会用到。
  • 当Swap升高时,系统性能会受到影响吗? 答案:会的,Swap升高,说明系统中本来和内存打交道的一些操作会涉及到和磁盘打交道,IO性能会受到影响。
  • 如果没有swap,系统内存不够了怎么办? 答案:OOM。
  • cache、buffer和swap回收的内存对象有什么不同? 答案:cache和buffer回收的是文件页,Swap回收的是匿名页。
  • 哪些应用或者服务应该关闭swap? 答案:对IO有很高要求的应用或者服务都应该关闭Swap,比如DB等。
<think>嗯,用户想解决Linux系统swap分区使用率过的问题。根据提供的引用内容,我需要综合这些信息来给出解决方案。首先,我得回忆一下swap的作用,它是在物理内存不足时,将部分内存数据转移到磁盘上,但swap使用会影响性能,因为磁盘速度比内存慢很多。 引用[1]提到一个k8s节点的swap使用,但内存利用率却很低,这可能和内存回收策略有关。通常swap是因为内存不够,但这里内存剩余很多,所以可能系统配置有问题,比如swappiness参数设置过,导致系统过早使用swap。 引用[2]指出调整vm.swappiness和zone_reclaim_mode参数。swappiness控制内核倾向于使用swap的程度,设为0的话,可能只有在内存不足时才会使用swap。而zone_reclaim_mode设为0可能让系统更倾向于从其他节点分配内存,而不是频繁回收。 引用[4]提到MongoDB的案例,因为cacheSizeGB设置过低,导致数据积压,占用物理内存,进而触发swap使用。解决方法包括调整应用的内存配置和关闭swap。这说明应用的内存管理也很重要,需要确保应用有足够的内存,避免被挤到swap。 引用[5]提到了swap文件的权限问题,建议设置0600权限。这可能和创建swap文件时的配置有关,虽然这可能不会直接影响使用率,但正确配置swap空间是必要的。 综合这些信息,解决方案应该分步骤:首先检查当前内存swap使用情况,然后调整内核参数如swappiness,关闭不必要的swap,优化应用内存配置,最后考虑增加物理内存或调整swap空间。 需要验证是否有应用内存泄漏,或者是否某些进程占用了大量内存但未被释放。同时,检查系统日志和监控工具,看看是否有异常情况。此外,如果应用如MongoDB需要更多内存,调整其缓存设置可以缓解问题。 可能还需要考虑是否真的需要swap,在某些内存的服务器环境中,关闭swap可能更合适,但需谨慎,因为某些情况下系统可能需要swap来防止OOM killer终止进程。所以,关闭swap可能是一个可选步骤,但需要根据具体情况评估。 总之,解决方案应该包括检查内存使用、调整内核参数、优化应用配置、监控和维护,以及必要时硬件升级。</think>### 如何降低Linux Swap分区使用率过的解决方案 #### 1. **检查当前内存Swap使用情况** - 使用命令查看内存Swap使用率: ```bash free -h top ``` - 确认物理内存是否充足。若内存空闲率Swap使用(如引用[1]所述),可能与内存回收策略有关[^1]。 #### 2. **调整内核参数优化内存回收策略** - **降低`vm.swappiness`值**:控制内核使用Swap的倾向。值越低,内核越倾向于保留物理内存。 ```bash echo 0 > /proc/sys/vm/swappiness # 永久生效需在/etc/sysctl.conf中添加: echo "vm.swappiness=0" >> /etc/sysctl.conf sysctl -p ``` - **关闭NUMA内存回收模式**(如引用[2]): ```bash echo 0 > /proc/sys/vm/zone_reclaim_mode echo "vm.zone_reclaim_mode=0" >> /etc/sysctl.conf sysctl -p ``` #### 3. **释放已占用的Swap空间** - 临时释放Swap(需确保物理内存足够): ```bash swapoff -a && swapon -a ``` #### 4. **优化应用程序内存配置** - **调整应用内存限制**:如MongoDB的`cacheSizeGB`(引用[4]),确保应用程序能充分利用物理内存,避免数据积压到Swap[^4]。 - **排查内存泄漏**:使用`ps`、`vmstat`等工具分析进程内存占用情况。 #### 5. **减少或禁用Swap(谨慎操作)** - **临时禁用Swap**: ```bash swapoff -a ``` - **永久禁用Swap**:注释掉`/etc/fstab`中Swap分区的挂载项,重启生效。 - **删除Swap文件**(如引用[5]): ```bash swapoff /path/to/swapfile rm -f /path/to/swapfile ``` #### 6. **监控与维护** - **定期检查Swap使用**:通过`cron`任务或监控工具(如Prometheus)设置警报。 - **升级物理内存**:若频繁出现Swap使用,建议扩展物理内存。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值