什么是swap?
linux系统安装过程往往涉及两个分区,一个是根目录/, 另一个就是swap(内存交换空间)。因此,swap空间比较特殊,它实际上是占用磁盘空间的一个分区,而非RAM内存空间。
虽然它是磁盘上的一个分区,但是它不能像根目录那样存储用户文件。它是预留给系统作为内存交换空间用的。
打个比方,一个linux系统运行内存为2G, 内存空间可能在用户大量请求时吃紧,那可能系统就崩溃了,运行内存可是焊死的(对于物理机而言),该如何应付可能高负载呢?答案是创建交换空间(swap),比如在磁盘上创建2G的交换空间。那么在内存吃紧时,系统会将运行内存中暂时用不到的程序和数据挪到swap空间(也就是磁盘上), 腾出的运行内存空间就可以继续造了。
听着像虚拟内存,的确,但是交换空间毕竟还是磁盘空间,IO速度跟物理内存往往差了几个数量级,而且当物理内存用量减小时,swap中的数据会再次被交换到物理内存中。“交换”这个过程,其实也挺费时的。所以:swap空间并不是设置越大越好。
下面记录下swap创建和设置涉及的命令。
创建swap空间
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 # 创建 2GB 文件
sudo chmod 600 /swapfile # 限制权限
sudo mkswap /swapfile # 格式化为 Swap
sudo swapon /swapfile # 立即启用
使用 swapon --show
查看交换空间:
也可以使用 free -h
查看:
但是上述创建好后如果重启系统,swap不会自动启用,需要再次执行下面命令才能启用swap空间:
swapon /swapfile
如果想一劳永逸,执行下面命令永久生效:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
为什么重启会丢失呢?
这涉及linux启动流程:
内核加载后,会执行
/sbin/init
(或systemd
)。systemd
会读取/etc/fstab
,并挂载所有列出的文件系统和 Swap。如果没有在
/etc/fstab
中定义 Swap,系统 不会自动启用它。
更多相关命令
swapoff /swapfile # 关闭swap
watch -n 1 'free -h; sudo vmstat 1' # 实时查看swap
swap设置多大合适?
Redhat官方的文档中关于swap分区大小设置的建议
因此,一般来说可以按照如下规则设置swap大小:
4G以内的物理内存,SWAP 设置为内存的2倍,不超过4G。
4-8G的物理内存,SWAP 等于内存大小。
8-64G 的物理内存,SWAP 设置为8G。
64-256G物理内存,SWAP 设置为16G。