目录
使用 systemd-swap 动态创建和删除swap files
概述
.
Swap 用于扩展内存(RAM)容量
- 如果不使用交换空间,当内存耗尽时,应用程序将被终止,乃至使得整个系统崩溃
- 使用交换空间后,Kernel可以从不太活跃的应用程序或服务中获取访问频率较低的memory pages,并将它们写入磁盘,从而使的RAM有更多的空间用于较活跃的应用程序
可以通过三种方式管理swap:
- A swap partition
- A swap file
- zswap
何时需要用到Swap?
即使有足够的可以内存,有些情况也需要使用Swap,比如有些应用程序要求开启Swap,或为了对内存管理提供安全保障(为了防止特点情况下内存溢出),下表列举了一些需要使用Swap的场景:
- 如果要使用到主机的休眠(hibernation)模式,则需要开启Swap
- 如果某些后台Services不是总处于活跃状态(意味着大多数时间是休眠状态),当这种Services较多时,需要开启Swap将它们交换出去
- 如果有一个应用程序,将虚拟内存作为临时存放空间,而不是直接存入RAM,则需要用到Swap(或者说虚拟内存与Swap几乎是强绑定的)
- 如果某个应用程序有内存泄漏,需要用到Swap,当然这个只是作为一个保障,即使使用Swap,内存泄漏也不会被解决,只是让问题延期的时间变长使得管理员有反应时间来处理罢了
- 如果你有足够大小的RAM Space,比如1TB,亦或者没有为程序分配虚拟内存,或者代码没有内存泄漏的情况,则不需要使用Swap
需要使用多大空间作为Swap?
具体使用多大的交换空间,需要根据你的应用程序的工作负载来定,并且工作负载通常变化量还比较大,所以需要持续的监控内存的使用情况再做决定。但根据RAM的大小,也有一些特定公式如下:
- 对于小于4GB的物理内存(RAM),强烈建议使用等同于RAM大小的交换空间(如4GB RAM – 4GB Swap),也可以调整为RAM的两倍大小,但最大不应该超过两倍(由于收益递减效应)
- 对于大于4GB的RAM,交换空间的范围为:SQRT(RAM)后四舍五入 < Swap Space < 2*RAM,比如8GB的RAM,Swap sapce 的访问是3GB-16GB
什么是“收益递减”?
“收益递减”意味着如果你用到比 RAM 大小大两倍或更多的交换空间,那么最好去扩容RAM而不是继续使用Swap,因为机械硬盘 (HDD) 访问比 RAM 访问慢大约 10³,因此在RAM上需要 1 秒的操作 ,在HDD上需要15分钟以上。而在固态硬盘 (SSD) 上,在 RAM 中花费 1 秒的相同操作在该 SSD 上仍需要大约 1 分钟!
实例
以下是一个表格,描述了不同大小的RAM 对 Swap space大小的参考,no hibernation代表未开启休眠模式
RAM No hibernation With Hibernation Maximum 1GB 1GB 2GB 2GB 2GB 2GB 3GB 4GB 3GB 3GB 5GB 6GB 4GB 4GB 6GB 8GB 5GB 2GB 7GB 10GB 6GB 2GB 8GB 12GB 8GB 3GB 11GB 16GB 12GB 3GB 15GB 24GB 16GB 4GB 20GB 32GB 24GB 5GB 29GB 48GB 32GB 6GB 38GB 64GB 64GB 8GB 72GB 128GB 128GB 11GB 139GB 256GB 256GB 16GB 272GB 512GB 512GB 23GB 535GB 1TB 1TB 32GB 1056GB 2TB 2TB 46GB 2094GB 4TB 4TB 64GB 4160GB 8TB 8TB 91GB 8283GB 16TB
使用 交换分区(Swap Partition)
交换分区是管理Swap的一种传统方式。 在这种情况下,会创建一个或多个专用分区(如磁盘分区)来存放Swap space。
创建和启用Swap Partition
要创建交换分区,你需要有足够大小的未分配磁盘空间,将磁盘空间一整个分配出来,或者将一部分分配出来作为Swap space的空间。 Swap Partition可以使用磁盘管理/分区管理工具创建,注意类型应该设置成 linuxswap。
当你有了一块Swap Partition后(可以使用命令fdisk),你需要将其初始化,使用命令mkswap
. 举例来说, 如果你的 swap partition是 /dev/sda3
, 则执行:
sudo mkswap /dev/sda3
接下来我们需要使用 swapon 命令启用交换分区。 按照我们上面的例子,这可以通过以下方式完成:
sudo swapon /dev/sda3
为了确保在开机时启用Swap,我们可以向 /etc/fstab 添加一个条目。 为此,最好使用 UUID 而不是设备名称,你可以手动或使用以下命令将行添加到 fstab:
sudo bash -c “echo UUID=$(lsblk -no UUID /dev/sda3) none swap defaults 0 0 >> /etc/fstab”
使用Swapfiles
使用交换分区有一个主要缺点:更改交换大小或添加交换需要重新分区磁盘。 在当前的 Linux 内核中,可以使用Swapfile取代Swap Partition,并且从内核 2.6 开始,两者之间不再存在性能差异。
创建和启用一个静态的 Swapfiles
下面创建一个4GB的Swapfile,使用dd命令
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
对这个file进行权限设置,如只对root可写可读
sudo chmod 600 /swapfile
接来是格式化并启用swapfile
下面是格式化并启用swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
为了确保开机后应用swapfile,应该将配置写进 /etc/fstab
. 可以使用下列命令
sudo bash -c “echo /swapfile none swap defaults 0 0 >> /etc/fstab”
在BTRFS中应用Swapfiles
从linux kernel 5.0 及更高版本开始,btfrs 开始swap。 除了上述步骤之外,它们还需要一些特殊处理,在运行上面的 dd 步骤之前,你应该运行以下命令:
sudo truncate -s 0 /swapfile sudo chattr +C /swapfile sudo btrfs property set /swapfile compression none
这些命令创建一个空的swapfile,为该文件禁用 COW 并确保禁用压缩。
在ZFS上使用Swapfiles
zfs 不支持交换文件,但是你可以使用 zvol 作为交换卷来获得一样的效果
有关如何完成此操作的详细说明,请参阅 ZoL 操作文档(列在参考文档下)
使用 systemd-swap 动态创建和删除swap files
可以使用 systemd-swap 自动管理swapfile的大小。 它可以根据内存需求动态创建swap files
安装并配置 systemd-swap
首先安装并启用systemd-swap
: pamac是Manjaro系统的安装命令(其他系统请使用其他安装方式)
pamac install systemd-swap
sudo systemctl enable systemd-swap.service
接下来通过在 /etc/systemd/swap.conf.d/myswap.conf 文件中包含以下参数来启用动态交换管理:
zswap_enabled=0
zram_enabled=0
swapfc_enabled=1
如果使用命令的话
sudo bash -c ‘echo -e “zswap_enabled=0\nzram_enabled=0\nswapfc_enabled=1” > /etc/systemd/swap.conf.d/myswap.conf’
移除其他Swap
为了使 systemd-swap 生效,你需要删除系统上其他的swapfile和swapPartition。
要显示您当前的交换设备,你可以使用命令 swapon:
swapon NAME TYPE SIZE USED PRIO /swapfile file 4G 0B -2 /dev/sda3 partition 8.4G 0B -3
关闭这两个文件使用swapoff命令
sudo swapoff /swapfile
sudo swapoff /dev/sda3
关闭后再删除他们
sudo rm /swapfile
注意要清除/etc/fstab中的配置项,否则会有很严重的问题!
然后重启,重启后,可以看到systemd-swap为我们自动创建swapfile,它会根据你的内存使用情况添加和删除交换文件。
NAME TYPE SIZE USED PRIO /var/lib/systemd-swap/swapfc/1 file 512M 0B -2
Swap性能调优
尽管 swap 看起来是扩展内存的好方法,但如前所述,过度使用 swap 会导致严重的性能下降。
有几个参数可用于调整交换利用率, swappiness 和 vfs_cache_pressure。 要查看这些的当前设置,你可以使用以下命令:
cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure
swappiness 控制memory pages 何时将被转移, 该值表示当前空闲内存的百分比(如当空闲内存达到10%开启swap),值越低,物理内存中保留的内存页越多,其中:
- 0 禁用交换
- 60 默认值,适合内存不足且运行大量服务的服务器
- 100 最激进的值
对于大多数台式计算机,建议值为 10:理论上,这意味着仅当 RAM 使用率达到 90% 左右时才开始交换。
vfs_cache_pressure 是一个百分比值,用于控制内核回收内存的趋势, Kernels < v5.4 上默认值为 100。 在 Kernels >= v5.4 可以增加到 100 以上。增加这个值将提高这些对象在 RAM 缓存中被删除的速率,减少它将允许这些对象在内存中缓存更长时间。根据你的工作负载情况,为避免过多地增加或减少此值会对系统性能产生重大的负面影响,需要通过实验来找到合适的平衡点,默认值是合理的。
要设置这些值,您可以使用命令 sysctl。 例如,要将 swappiness 值设置为 10,您可以使用:
sudo sysctl vm.swappiness=10
参考文档:
Windows快速启动背后的功臣:休眠hibernation
HOWTO use a zvol as a swap device · zfsonlinux/pkg-zfs Wiki · GitHub
GitHub – Nefelim4ag/systemd-swap: Script for creating hybrid swap space from zram swaps, swap files and swap partitions.
Swap – Manjaro
Swap Management
Swap – ArchWiki
An introduction to swap space on Linux systems | Opensource.com
今天的文章
linux的swap建议多大_docker mount与volume的区别分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81118.html