//这属于填坑系列文章,步骤仅凭记忆,仅为个人流水账不具有一般性,仅供参考

前(fei)言(hua)

在经历几次标签页开着开着系统动弹不得之后,终于受不了如此8GB内存限制,决定着手去解决这个问题。虽然内存条价格现在是低,但由于某种原因我只得另找法子来解决,在Linux里,有一个化硬盘空间为内存空间的方法,便是使用Swap文件或是Swap分区。(当然还有像Zram这样的办法,这里不做详细阐述

其实我之前初次装系统时就有分好Swap分区,还是整整8GB,但却是分在了机械硬盘里(后来发现这才是系统异常卡顿的真正元凶,天杀的某CSDN教程,Boot分区也不够了,清理之前的内核是一方面,但也需要扩容,建议根据实际或者不分区(9102年了还分区?(分区还是有用的,至少Boot分一下,救过此系统一命(槽 点 过 多

这次正好根目录也不够用了,就直接把机械硬盘里的Swap分区给合并了。

分区

分区工具的介绍这里就带过吧,网上一大把,我在这只想说点别的有用的东西。

记得分区类型是linux-swap就行了。

我是双系统,所以可以切换到Windows上用DiskGenius,但我没这么做,还是用U盘里Ubuntu Live的GParted在SSD上划走了属于Windows一块地,C盘也更紧张了。。

为什么不用分区文件?因为我想到了一个问题,我的C盘文件系统是NTFS,而Ubuntu读写NTFS都是靠着ntfs-3g那一套中间层,性能损失总有吧?但之后记不清在国外哪个帖子上看到的与文件系统无关,是直接操作的,那都是后话了,如果可以的话你可以去试试,内存文件更自由,Windows自己也是这么做的。

启用Swap分区

假定已经在SSD上分好了Swap分区

查找交换分区

在终端用sudo fdisk -l查找类型名为Linux swap的分区名,比如这里是/dev/sda7

设备            起点      末尾      扇区  大小 类型
/dev/sda1       2048    206847    204800  100M EFI 系统
/dev/sda2     206848    239615     32768   16M Microsoft 保留
/dev/sda3     239616 208754687 208515072 99.4G Microsoft 基本数据
/dev/sda4  225531904 226580479   1048576  512M Windows 恢复环境
/dev/sda5  226580480 247971839  21391360 10.2G Windows 恢复环境
/dev/sda6  247971840 250068991   2097152    1G Windows 恢复环境
/dev/sda7  208754688 225531903  16777216    8G Linux swap

分区格式化

sudo mkswap /dev/sda7

成功的话会返回分区的UUID,或者也可通过blkid /dev/sda7查看,记住,有用

临时挂载

sudo swapon /dev/sda7

通过free -m查看,若有swap则算成功了

永久挂载

/etc/fstab里追加一行

UUID=<刚刚获取的UUID,没有尖括号> none swap sw 0 0

启用ZSWAP

虽然这次将Swap分区迁移到SSD上面,但在发生Swap时,卡总是无法避免的,万恶之源都在于IO的瓶颈。如果减少IO交换的次数,那么情况会不会又有些好转呢?答案是肯定的。

从Linux 3.11内核开始,引入了ZSWAP,可以将需要换出(swap out)的页压缩存放在内存的压缩池里,这样在压缩池没有满的时候,根本不会有额外的IO;直到压缩池满了,则把最老的压缩页解压后写入swap设备。这样既减少了交换次数又在某种程度上扩大了Swap空间,一举两得。

接下来就来开启ZSWAP

  1. 通过运行以下命令来检查你的系统内核是否已经附带ZSWAP,如果返回CONFIG_ZSWAP=y,那么便可继续啦
    cat /boot/config-uname -r | grep -i zswap
  2. root权限编辑grub
    sudo gedit /etc/default/grub
  3. 更改GRUB_CMDLINE_LINUX_DEFAULT="quiet splash这一行为
    GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash zswap.enabled=1 zswap.compressor=lz4”
  4. 保存,并更新Grub
    sudo update-grub
  5. 开启lz4压缩算法(相比原来的LZO算法虽然压缩比低些但有卓越的解压缩速率)

    sudo su
    echo lz4 >> /etc/initramfs-tools/modules
    echo lz4_compress >> /etc/initramfs-tools/modules
    update-initramfs -u
  6. 重启电脑
  7. 检查ZSWAP是否开启
    cat /sys/module/zswap/parameters/enabled
    如果返回Y则说明启动成功!
  8. 检查LZ4压缩启动
    dmesg | grep -i zswap
    最后一行若是
    [ 0.715381] zswap: loaded using pool lz4/zbud之类的则成功启动

至此,ZSWAP成功启动!继续愉快地玩耍吧!(还是一样卡(还是有些改善的,除非启动一堆内存大胃王,其他时候还是能感觉到卡顿是平滑的,swap在渐渐地增大

启用休眠

休眠(hibernate(suspend to disk))对于笔记本来说还是很必要的,将内存转存在硬盘上的交换分区便可完全断电后重启仍可以恢复工作。

休眠就一句命令,可以先在终端先测试一下

sudo systemctl hibernate

如果重启一遍不能恢复之前状态就考虑以下步骤(在这卡了一会儿,有必要提一下

  1. 还是需要上次找到的swap分区对应的UUID
  2. 用vim或你喜欢的其他编辑器编辑grub
    sudo gedit /etc/default/grub
  3. 添上一行
    GRUB_CMDLINE_LINUX="resume=UUID=<替换为swapUUID>"
  4. 更新grub
    sudo update-grub
  5. sudo systemctl hibernate再试一遍,现在应该能很好工作了

另外可以在电源菜单上添加休眠按钮,自己可以再折腾下

http://ubuntuhandbook.org/index.php/2018/05/add-hibernate-option-ubuntu-18-04/

后(tu)记(cao)

终于到我最喜欢的环节了,写水文多半就是为了吐槽

折腾后正常的开发总算不会卡到窒息了,顺便也获得了休眠(Hibernate)的能力,也近似有了win10快速启动的能力(虽然还是不同(珍爱SSD,远离SWAP

折腾过后我一直都有个疑问,为什么隔壁Windows就是那么流畅?就算Windows是躺在SSD里的。。

后来才发现答案就在任务管理器里,页面文件,压缩算法什么的巨硬早就给你安排上了,C盘下还有8GB的pagefile.sys呢。。手动关闭后,win10也立马傻眼了,chrome运行到一半各种插件标签页崩溃,程序无法启动...

啊,内存条,快来吧。。。

扩展阅读/Reference/See also

  1. swap-control-gui
    国人写的一款GUI界面的swap管理器?但没真正入手过。
  2. Enable ZSwap to increase performance
  3. zram vs zswap vs zcache终极指南:何时使用哪一个
  4. Zswap-ArchWiki
  5. 启用ZSWAP前后的性能比较