上一部分介绍了一个使用Rust编写的终端复用器Zellij,但是使用Cargo编译安装的时候遇到内存不足导致的报错,根本原因是Zellij是一个比较大的Rust项目,我服务器的4G内存不足以支撑编译。
交换空间(Swap Space)是硬盘上的一块区域,系统可以在内存不足时将一部分内存中的数据临时存放在这里。Linux服务器遇到类似的内存不足问题,可以通过添加内存交换空间以扩展内存。
报错内容
使用Cargo安装Zellij报错:
1 | error: could not compile `zellij` (bin "zellij") |
这个报错是因为编译过程被SIGKILL (signal 9)
终止了,这通常表示系统内存不足,导致Linux内核的OOM (Out Of Memory) killer
终止了编译进程。
Zellij是一个比较大的Rust项目,编译时需要大量内存,特别是使用了-C opt-level=3
和LTO优化。
因此需要添加内存交换空间来解决内存不足的问题。
添加交换空间
1. 检查当前交换空间状态
查看当前交换空间使用情况:
1 | free -h |
查看详细的交换信息:
1 | sudo swapon --show |
也可以使用htop
(类似Windows的任务管理器)来查看系统内存与交换空间使用情况。
如果系统中没有预装,可使用
apt
直接安装:
1 sudo apt install htop
2. 创建交换文件
创建一个4GB的交换文件(可根据需要调整大小):
1 | sudo fallocate -l 4G /swapfile |
如果fallocate不可用,可以使用dd命令:
1 | sudo dd if=/dev/zero of=/swapfile bs=1G count=4 |
3. 设置正确的权限
设置只有root可以访问该文件:
1 | sudo chmod 600 /swapfile |
4. 设置为交换区域
格式化为交换区域:
1 | sudo mkswap /swapfile |
5. 启用交换文件
启用交换文件:
1 | sudo swapon /swapfile |
验证交换文件已启用:
1 | sudo swapon --show |
6. 设置开机自动启用
编辑fstab文件(选择熟悉的编辑器):
1 | sudo nvim /etc/fstab |
在文件末尾添加以下内容:
1 | /swapfile swap swap defaults 0 0 |
说明:
/swapfile
- 交换文件的路径swap
- 文件系统类型swap
- 挂载选项defaults
- 使用默认选项0
- dump值(对交换文件无用,保持为0)0
- fsck顺序(对交换文件无用,保持为0)
可以通过以下命令测试fstab配置是否正确:
1 | sudo mount -a |
7. 验证开机自动启用(可选)
重启系统后,运行以下命令验证交换空间是否自动激活:
1 | sudo swapon --show |
应该看到与之前相同的交换空间配置。
增加交换空间的影响
正面影响
- 防止内存不足崩溃:系统内存不足时可以使用交换空间,避免程序因OOM被终止
- 支持大型程序:允许运行需要大量内存的程序,如之前尝试编译的Zellij
- 休眠支持:足够的交换空间是支持系统休眠功能的前提
负面影响
- 性能影响:交换空间使用硬盘,比内存慢几个数量级
- SSD:交换操作会增加SSD写入次数,可能影响SSD寿命
- HDD:交换操作会产生磁盘I/O瓶颈,系统可能明显变慢
- 存储空间占用:交换文件占用硬盘空间
- 过度依赖:过大的交换空间可能导致系统在应该崩溃时保持运行但性能极差
交换空间大小建议
- 系统RAM < 2GB:交换空间 = RAM大小的2倍
- 2GB < RAM < 8GB:交换空间 = RAM大小
- RAM > 8GB:交换空间 = 至少4GB(或根据需要)
- 需要支持休眠:交换空间 ≥ RAM大小
删除交换文件
1. 检查当前交换空间配置
首先,确认系统上的交换空间配置:
查看当前交换空间:
1 | sudo swapon --show |
查看系统内存和交换使用情况:
1 | free -h |
查看交换文件在fstab中的配置:
1 | grep -i swap /etc/fstab |
2. 删除交换文件
确认使用的交换文件名(如/swapfile
):
停用交换文件:
1 | sudo swapoff /swapfile |
确认交换空间已被停用:
1 | free -h |
3. 移除开机自动挂载配置
编辑fstab文件(选择熟悉的编辑器):
1 | sudo nvim /etc/fstab |
找到并删除或注释掉类似下面的行:
1 | /swapfile swap swap defaults 0 0 |
4. 删除交换文件
删除交换文件:
1 | sudo rm /swapfile |
5. 如果是交换分区而非交换文件
如果使用的是交换分区(如/dev/sda2
):
1 | 停用交换分区 |
6. 更新系统配置
1 | 更新 initramfs(某些系统需要) |
本文链接: https://hanqingjiang.com/2025/05/20/20250520_server_memorySwapSpace/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
