Linux swap 配置与虚拟内存
- 1. 源由
- 2. 检查
- 2.1 查看当前 `swap` 的使用情况
- 2.2 查看总的 `swap` 空间和使用情况
- 2.3. 检查 `swap` 分区或文件的配置
- 2.4 检查 `swap` 的优先级
- 2.5 查看 `swappiness` 配置
- 3. 配置
- 3.1 创建新的 `swap` 文件
- 步骤一:确定所需的 `swap` 大小
- 步骤二:创建 `swap` 文件
- 步骤三:设置文件权限
- 步骤四:将文件设置为 `swap`
- 步骤五:启用 `swap`
- 步骤六:验证是否启用成功
- 3.2 增加现有分区的 `swap` 空间
- 步骤一:创建分区
- 步骤二:创建文件系统
- 步骤三: 启用分区
- 4. 永久生效
- 步骤一:编辑 `/etc/fstab`
- 步骤二:添加以下内容
- 步骤三:调整 `swappiness`
- 步骤四:命令验证配置情况
- 5. 总结
1. 源由
现在的系统,内存越来越大,从我接触的时候16MB/32MB/64MB的时代,已经来到了动不动就是4GB/8GB/16GB的时代。
最大的差异,就是当时MB的时代是台式计算机上的内存,而现在GB是嵌入式系统上的内存。
当然,这里有一点夸张的说法,因为GB嵌入式系统通常是那种使用AI算法,视频处理的边缘端嵌入式系统。而常规意义上的嵌入式系统还是在MB的系统。
这么大的系统内存,通常来说我们不太关注内存使用量,因为绰绰有余。但是当实际产品优化以及一些极限情况下,这个确实不容忽视的细节。
接下来,我们就看下Linux系统上如何配置swap来解决虚拟内存的问题。
2. 检查
要查看 Linux 系统中 swap
的配置,可以使用以下命令:
2.1 查看当前 swap
的使用情况
swapon --show
该命令会显示所有活动的 swap
分区或文件的信息,包括名称、大小、已用空间和优先级。
示例输出:
NAME TYPE SIZE USED PRIO
/swapfile file 2G 512M -2
如果没有任何输出,说明当前系统没有启用 swap
。
2.2 查看总的 swap
空间和使用情况
free -h
示例输出:
total used free shared buff/cache available
Mem: 8.0G 3.2G 2.5G 512M 2.3G 4.1G
Swap: 2.0G 512M 1.5G
这里可以看到 swap
的总大小和已用空间。
2.3. 检查 swap
分区或文件的配置
-
查看系统分区配置:
cat /etc/fstab
查找类似于以下内容的行:
/swapfile none swap sw 0 0
这表示系统使用的是
swapfile
。 -
如果是
swap
分区,可能会看到:/dev/sda2 none swap sw 0 0
2.4 检查 swap
的优先级
cat /proc/swaps
此命令会显示与 swapon --show
类似的信息,但包含更底层的细节。
2.5 查看 swappiness
配置
swappiness
决定了系统使用 swap
的频率,范围为 0 到 100。
-
查看当前
swappiness
:cat /proc/sys/vm/swappiness
默认值通常是
60
。 -
如果需要修改,可以通过以下命令临时调整(比如设置为
10
):sudo sysctl vm.swappiness=10
-
如果需要永久修改,编辑
/etc/sysctl.conf
文件,添加或修改以下内容:vm.swappiness=10
保存后运行
sudo sysctl -p
生效。
3. 配置
增加 swap
空间的方法有两种:创建一个新的 swap
文件或添加一个新的 swap
分区。以下是使用 swap
文件增加空间的具体步骤,因为这种方式更加灵活且简单。
3.1 创建新的 swap
文件
步骤一:确定所需的 swap
大小
决定需要增加的大小,例如 4GB。
步骤二:创建 swap
文件
使用 dd
命令创建一个空文件:
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
of=/swapfile
:指定文件路径(这里是根目录下的swapfile
)。bs=1M count=4096
:每次写入 1MB 的块,总共写入 4096 个块,即 4GB。
步骤三:设置文件权限
确保只有 root 用户可以访问该文件:
sudo chmod 600 /swapfile
步骤四:将文件设置为 swap
sudo mkswap /swapfile
步骤五:启用 swap
sudo swapon /swapfile
步骤六:验证是否启用成功
swapon --show
3.2 增加现有分区的 swap
空间
如果你使用分区来管理 swap
,可以通过增加分区或调整分区大小来扩展 swap
空间:
步骤一:创建分区
略,使用分区工具(如 fdisk
或 gparted
)创建一个新的分区并设置其类型为 swap
。
步骤二:创建文件系统
sudo mkswap /dev/sdX
(将 /dev/sdX
替换为新创建分区的设备名称。)
步骤三: 启用分区
sudo swapon /dev/sdX
4. 永久生效
无论是增加 swap
文件还是分区,都需要在 /etc/fstab
中添加相应的配置,确保系统重启后 swap
能自动启用。
注:如果是临时,那就不需要进行永久生效的fstab
配置。
步骤一:编辑 /etc/fstab
sudo nano /etc/fstab
步骤二:添加以下内容
- 如果是
swap
文件:/swapfile none swap sw 0 0
- 如果是
swap
分区:/dev/sdX none swap sw 0 0
保存并退出。
步骤三:调整 swappiness
在增加 swap
空间后,可以根据需求调整 swappiness
参数,控制系统使用 swap
的频率:
sudo sysctl vm.swappiness=10
如需永久修改,在 /etc/sysctl.conf
文件中添加:
vm.swappiness=10
步骤四:命令验证配置情况
free -h
swapon --show
5. 总结
使用 swap
空间有一定的优缺点,下面是它们的对比列表:
注:其他暂时没有想到的,就没有写,如果大家有想到的,请评论指点,谢谢!
优点 (Advantages)
优点 | 说明 |
---|---|
避免内存溢出 | 当物理内存不足时,swap 可以提供额外的虚拟内存,防止程序崩溃或系统崩溃。 |
提升稳定性 | 通过将不活跃的页面移到 swap 空间,可以释放物理内存,避免系统因内存不足而挂起。 |
缓存未用页面 | 将不常用的数据移到 swap ,使系统能够将更多内存分配给活跃的应用程序。 |
节省物理资源 | 允许更多的程序同时运行,即使物理内存已经接近满负荷。 |
适用低内存设备 | 在低内存或嵌入式设备上,swap 提供了补充的内存来源,能让系统在负载较重时正常运行。 |
可扩展性 | 可以根据需求调整 swap 文件或分区的大小,相对灵活。 |
缺点 (Disadvantages)
缺点 | 说明 |
---|---|
性能下降 | swap 空间通常位于磁盘或 SSD 上,访问速度比物理内存慢得多。因此,频繁使用 swap 会显著降低系统性能,尤其是在使用传统机械硬盘时。 |
磁盘磨损(对 SSD 的影响) | 对于使用 SSD 的系统,频繁的写入操作可能会加速 SSD 的磨损。虽然现代 SSD 的耐久性已大幅提高,但仍需注意。 |
增加 I/O 负载 | 当系统开始使用 swap ,磁盘 I/O 活动会显著增加,可能影响其他 I/O 密集型任务的性能。 |
过度依赖 swap 会导致卡顿 | 如果系统长时间依赖 swap ,尤其是在内存不足的情况下,可能会导致系统变得非常缓慢或卡顿,影响用户体验。 |
难以预测的延迟 | 访问 swap 的延迟是不可预测的,尤其在繁忙的系统中,可能导致时延波动。 |
系统重启后可能无法恢复 | 当系统重新启动时,swap 中的数据会丢失。如果应用程序或服务依赖于 swap 中的数据(例如某些缓存或缓存管理),重启后可能会出现问题。 |
- 适用场景:
swap
适用于内存有限、负载较高、需要避免系统崩溃的场景(例如服务器、虚拟机、低配置设备等)。但如果系统经常依赖swap
,可能会导致性能瓶颈,尤其在需要高性能计算时。 - 不适用场景:如果系统的内存充足且性能要求较高(例如游戏、图形渲染、大型数据库等),应该避免过度使用
swap
,以确保性能。
产品角度,应该合理场景化分析,经过压力和模拟测试,提供最有配置解决方案,同时保留冗余情况下,增加告警以及日志记录功能,确保能在极其苛刻的情况下记录现场环境。