物理内存 swap 页面调度

1:实际内存
实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用纠错机制(ECC)。
2:交换空间swap
交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用,通常推荐交换空间的大小应该是物理内存的二到四倍。
3:页面调度
页面调度是指从磁盘向内存传输数据,以及相反的过程,这个过程之所以被称为页面调度,是因为Unix内存被平均划分成大小相等的页面;通常页面大小为4KB和8KB(在Solaris中可以用pagesize命令查看)。当可执行程序开始运行时,它的映象会一页一页地从磁盘中换入,与此类似,当某些内存在一段时间内空闲,就可以把它们换出到交换空间中,这样就可以把空闲的RAM交给其他需要它的程序使用。
4:交换
页面调度通常容易和交换的概念混淆,页面调度是指把一个进程所占内存的空闲部分传输到磁盘上,而交换是指当系统中实际的内存已不够满足新的分配需求时,把整个进程传输到磁盘上,交换活动通常意味着内存不足。

UNIX内存管理:UNIX系统通过2种方法进行内存管理,“调页算法”,“交换技术”。
调页算法是将内存中最近不常使用的页面换到磁盘上,把常使用的页面(活动页面)保留在内存中供进程使用。
交换技术是系统将整个进程,而不是部分页面,全部换到磁盘上。正常情况下,系统会发生一些交换过程。

当内存严重不足时,系统会频繁使用调页和交换,这增加了磁盘I/O的负载。进一步降低了系统对作业的执行速度,即系统I/O资源问题又会影响到内存资源的分配。

### 关于 Swap 和 不活跃内存的优化 Linux 系统中的 swap 功能主要用于扩展物理内存容量,通过将部分数据存储磁盘上来释放 RAM 资源。然而,在实际应用中,某些场景可能会涉及不活跃内存页面的管理以及如何优化其使用效率。 #### 1. **Swap 的基本原理** SwapLinux 内核用来处理内存不足的一种机制。当可用内存减少时,内核会尝试将一些不常使用的页面移动到交换空间(swap space)。这些页面通常包括匿名页面(如进程堆栈)和文件缓存的一部分[^1]。这种行为可以通过 `vmstat` 或者 `free` 命令观察到,尽管系统可能显示很少的“空闲”内存,但实际上大部分未分配的内存都被用于缓存或缓冲区。 #### 2. **不活跃内存的作用** 在 Linux 中,“不活跃内存”是指那些最近较少访问的数据页面。操作系统会定期扫描内存页面并将其分类为活动(active)或不活跃(inactive),以便更高效地利用有限资源。如果某个页面长时间处于不活跃状态,则有可能被置换到 swap 分区或者直接丢弃(如果是可重新加载的内容,比如文件缓存)[^3]。 #### 3. **案例分析:高 CPU 占用与 kswapd0** 在一个特定实验环境中,一个程序申请了超过系统总内存大小的一倍以上的虚拟地址空间 (1GB),并通过 fork 创建多个子进程共享这段区域的同时不断对其进行读写操作。由于硬件限制(仅有约 900MB 实际 RAM 可供使用),加上启用了 zRAM 技术作为压缩型交换设备,最终导致核心调度器频繁触发后台回收流程——表现为 kswapd0 进程占据较高比例计算周期[^2]。 此现象表明当前配置下存在严重的争抢状况;一方面应用程序试图维持尽可能多的工作集驻留在真实 DRAM 上面,另一方面又不得不依赖较慢速度的辅助储存媒介来弥补差距。因此调整相关参数成为必要之举: - 修改 `/proc/sys/vm/swappiness` 文件值可以改变倾向程度,默认情况下设定了相对较高的权重鼓励尽早启用交换策略; - 对于 SSD 用户而言适当提高该系数或许有益无害因为现代固态硬盘具备更快随机 IO 性能相比传统 HDD 方案; - 如果确认业务负载确实需要更多连续高速访问能力则考虑增加实体安装规格或是关闭不必要的服务组件从而腾挪额外余量给更重要的任务执行环境。 ```bash echo 10 > /proc/sys/vm/swappiness ``` 上述命令降低 swappiness 参数至较低水平意味着除非绝对必需否则尽量避免动用 disk-based swapping 方法论。 #### 4. **Slab Allocator 细节探讨** 除了常规意义上的 page cache 外还有一种叫做 object caching 的技术实现形式即所谓的 slab allocator 。它专门针对固定尺寸的小对象池化需求设计而成旨在减少动态分配带来的碎片风险同时也加快获取/销毁过程的速度表现。从调试输出 slabs.txt 来看能够获得如下几个方面的洞察力: | 地址 | 类型 | 名字 | Node指针 | Total Objects | |------------|---------|--------------|---------------|----------------| | ffff88... | slab | kmalloc-512 | ffffaaa... | 1234 | 这里每一行代表了一个独立的对象类别定义详情其中包括但不限于它们的名字、所属节点信息还有总量统计等等字段描述。值得注意的是只有开启相应选项编译内核之后才会暴露完整的计数支持否则默认返回 NA 表示不可知的状态。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值