百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

你以为的swap是你以为的swap吗?空间充足依然占swap,如何解决?

nanshan 2025-08-06 22:02 6 浏览 0 评论

什么是swap

swap是交换分区。在操作系统中,swap是硬盘上的一部分空间,当系统内存(RAM)不足时,操作系统会将部分内存中的数据移到swap空间,以释放内存供其他程序使用。虽然swap的速度比RAM慢,但它可以防止系统因内存不足而崩溃。

swap分区的使用原理

当物理内存(RAM)不足时,操作系统会将一些暂时不使用的内存页(page)或进程的内存段(segment)移动到swap分区,从而释放物理内存供其他进程使用。这个过程称为换出(swap out)。当这些数据再次被访问时,操作系统会将它们从swap分区重新加载到物理内存中,这个过程称为换入(swap in)

  1. 换出(Swap Out)原理

当系统检测到物理内存不足时,会触发换出操作。以下是换出过程的关键步骤:

(1)选择换出的对象

  • 页面置换算法(Page Replacement Algorithm):操作系统会根据某种算法选择哪些内存页应该被换出。常见的算法包括:
  • 最近最少使用(LRU,Least Recently Used):选择最近最久未被访问的页面换出。
  • 先进先出(FIFO,First-In-First-Out):选择最早进入内存的页面换出。
  • 最佳适应(Optimal):基于未来访问情况选择最优的页面换出(实际中难以实现,主要用于理论分析)。
  • 选择进程的内存段:对于进程的内存段,操作系统会选择那些当前不活跃的进程或进程的非关键部分进行换出。

(2)将数据写入swap分区

  • 操作系统将选定的内存页或内存段从物理内存中读取出来,并将其写入swap分区的指定位置。
  • 每个换出的页面或段都会在swap分区中分配一个空间,并记录其位置信息,以便后续能够快速找到并换入。

(3)更新内存管理数据结构

  • 操作系统会更新内存管理单元(MMU)中的数据结构,如页表(Page Table)或段表(Segment Table),将换出的页面或段标记为“不在内存”状态。
  • 同时,记录这些页面或段在swap分区中的位置,以便后续换入时能够快速定位。

2.换入(Swap In)原理

当进程尝试访问已经被换出到swap分区的数据时,会触发换入操作。以下是换入过程的关键步骤:

(1)触发页面错误(Page Fault)

  • 当进程访问一个不在物理内存中的页面时,会产生一个页面错误(Page Fault)。
  • 操作系统会捕获这个错误,并检查该页面是否在swap分区中。

(2)从swap分区读取数据

  • 如果页面在swap分区中,操作系统会找到该页面在swap分区中的位置,并将其读取到物理内存中。
  • 如果物理内存中没有足够的空间,操作系统可能会再次触发换出操作,以腾出空间。

(3)更新内存管理数据结构

  • 操作系统将换入的页面或段标记为“在内存”状态,并更新页表或段表中的相关信息。
  • 进程恢复执行,继续访问该页面或段。

swap分区的优缺点

优点:

  • 扩展内存容量:通过swap分区,系统可以将硬盘空间作为虚拟内存使用,从而扩展可用内存容量。
  • 避免内存不足导致的崩溃:当物理内存不足时,swap分区可以提供缓冲,避免系统因内存耗尽而崩溃。

缺点:

  • 性能下降:由于硬盘的读写速度远低于物理内存,频繁的swap操作会导致系统性能显著下降,尤其是在高负载情况下。
  • 增加系统复杂性:swap分区的管理需要额外的机制和开销,增加了系统的复杂性。

空间充足依然占用swap现象

由于 swap 存在的缺陷在于性能的降低,故而在大多数的商用系统之中,都会竭力避免使用 swap ,甚至某些极端的举措是直接将 swap 关闭。不过大多数的选择,都是通过系统的配置,来是操作系统尽量不分配swap,优先使用内存。

我们的系统也采取系统配置的方式尽量不分配swap,设置两条配置,如下:

(1) vm.swappiness = 0 //表示最大限度使用物理内存,然后才是 swap空间

(2) memory policy设置默认 // 系统启动过程中,采用interleave策略分配内存,即在所有可满足需求的节点上交叉分配,防止启动时在某个节点上负载过重

以上述配置后,我们预期是物理内存快用完了时,才会占用swap。但从实际效果来看,内存空间很充足(buffer/cache占用很高)时,就开始占用swap。

问题产生原因

1.回收内存流程:

(1)内存可用量小于low水位,kswapd开始介入进行异步内存回收(非阻塞式)

(2)内存可用量小于min水位,进入直接同步内存回收(阻塞式)

(3)内存可用量高于high水位,kswapd不再工作

2.buffer/cache中的缓存文件页对应磁盘,当回收文件页内存时,会将缓存页下刷至磁盘

3.buffer/cache中的缓存匿名页无磁盘可对应,但开启swap后,匿名页对应到swap,

内存空闲多也占用swap原因:

1.每个numa自身有local cpu、local 内存

2.每个numa只看自身local内存是否需要内存回收

3.numa需要内存回收时,若开启swap,则buffer/cache中的文件页和匿名页都可对应到磁盘,所以会优先下刷磁盘以获取更多内存。如果还不足,才会去其他numa查询内存

当回收匿名页内存时,会将匿名页下刷至swap。

解决思路

zram简介:

1.zram是linux的驱动,用于使用内存模拟block设备,通常用来创建内存swap

2.zram是使用了内存压缩技术,所以是一种通过时间换空间的技术,即访问zram时,其可以模拟更大的空间,但会消耗一定的cpu资源

3.假设压缩比2:1,则64G虚拟swap,只需要消耗32G实际内存量


方案

优点

缺点

关闭swap

彻底消除访问swap慢导致的运行效率问题

当物理内存确实因不可控因素被占满,会直接触发系统oom杀进程

ZRAM技术内存模拟swap

1.使用内存模拟swap,可使访问的io速率接近访问内存的速率

内存访问:100ns 1

zram访问:3000ns 30

ssd访问 :50us 500

hdd访问 :1~1000ms 10000

2.机制成熟,在Android上已大量使用

3.不是替代磁盘swap,而是共存,优先使用内存swap,扩充带来性能的提升

1.使用一部分内存做swap,可用内存会随着占用增高而减小

2.访问swap时会额外占用一部分CPU资源,用以压缩和解压

相关推荐

0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

生产环境starrocks 3.1存算一体集群部署

集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

在CentOS上添加swap虚拟内存并设置优先级

现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

国产深度(deepin)操作系统优化指南

1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

postgresql-15.4 多节点主从(读写分离)

1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

Docker 容器 Java 服务内存与 GC 优化实施方案

一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

虚拟内存设置、解决linux内存不够问题

虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

Elasticsearch性能调优(5):服务器配置选择

在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

Es如何落地

一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

针对Linux内存管理知识学习总结

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

MySQL进阶之性能优化

概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

Linux Cgroups(Control Groups)原理

LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

linux 常用性能优化参数及理解

1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

如何在 Linux 中使用 Sysctl 命令?

sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

取消回复欢迎 发表评论: