一、swap
用过linux的,想必都听说过swap这个东西,在安装系统时,安装程序一般默认就会创建2G作为交换分区,如果你不创建,他还会给你一个小小的警告。
那swap到底是个啥?要不要创建?如果创建的话,多大是合适的?
用过windows的,相必都听说过虚拟内存这个概念,其实linux的swap也是类似的方案,都是在硬盘上创建一个内存分页文件,然后把内存里的东西放到硬盘的这个文件/分区里。
swap主要有两个作用,一是可以在系统的物理内存不够时,直接把硬盘当内存用,这样当内存爆满时,系统不至于死机,虽然会很卡,但是起码还能响应。再者就是瞬时占用会超过物理内存大小,但是日常又没那么高的内存需要,那通过swap交换,可以避免程序崩溃,或者直接跑不起来。二是方便机器休眠,在休眠时,内存里的东西会被保存到swap里,当机器再被唤醒时,系统就可以直接从文件里读取当时的状态,从而无缝衔接。
所以,要不要创建,最后还是要回到自己的需求上来。
对于现代的机器,起步就是16G的物理内存,除非是java这类内存大户,绝大多数情况下,我觉得你应该也都用不到交换分区。
像我这种情况,内存只占用了4G不到,正常的编译也不过8G,物理内存足够,就没有必要去启用速度更慢的swap,虽然系统有调节机制,在物理内存足够的情况下,一般也会优先使用物理内存,但是你的这个分区会一直存在,用不到也是一种浪费。
毕竟真的有人干出过32G的物理内存,然后设置64G的swap......
二、ZRAM
相较于swap直接把硬盘当内存这样简单粗暴的做法,zram就比较优雅一些,既然物理内存是固定的,那我把数据压缩小一些,再放进去,这样不就相当于变相增加空间了吗?
zRAM 机制建立在 swap 机制之上,swap 机制是将进程不常用的内存交换到磁盘中,而 zRAM 机制是将进程不常用的内存压缩存储在内存某个区域。所以 zRAM 机制并不会发生 I/O 操作,从而避免因 I/O 操作导致的性能下降。
通过zram,搭配zstd压缩算法,你可以获得接近物理内存性能的速度,并且也不会影响硬盘的性能和寿命。
在ubuntu和debian上开启也很简单,你只需要在终端执行这个命令:
sudo apt install zram-tools
echo -e "ALGO=zstd\nPERCENT=60" | sudo tee -a /etc/default/zramswap
sudo service zramswap reload
在执行之前,请先关闭你的swap(如果有的话)
其中ALGO=zstd
表示使用的压缩算法,PERCENT=60
是指物理内存的百分比,比如这里就是物理内存的60%,虽然推荐是设置物理内存的一半,但是你也可以根据自己的需要向上扩展,我最高设置过360%,确实也能过。
这个方案对于未设置swap分区的Debian和ubuntu22.04是有效的,ubuntu 20.04默认似乎有个2G的swap文件,会导致这个配置无法生效,如果你感兴趣的话,可以去研究下。