Arch Linux 杂七杂八的优化

发现无聊时刷 Arch Wiki 也挺有趣的, 记录一下自己干了啥吧. 毕竟有些配置没法放到 dotfiles 里. 记录一下以后翻起来也方便.

内核

nopti

参考: Performance degradation after Meltdown mitigation?

打开 /etc/default/grub, 给 GRUB_CMDLINE_LINUX_DEFAULT添加nopti参数, 禁用上次 intel Meltdown 漏洞的补丁.

这个补丁实测严重影响系统调用性能, 大约下降 70%. 虽然实际上应该没啥程序会疯狂 syscall ....但我还是要关掉它!

硬盘

SSD

参考: Solid state drive

TRIM

通过 hdparm -I /dev/sda | grep TRIM 检验是否支持, 挂载参数添加 discard 以启用.

调度器

可以通过 cat /sys/block/sda/queue/scheduler查看当前调度器和可用调度器, 默认应该是 bfq.

据 wiki 所说, SSD 性能强劲, 因此简单的调度算法反而适合 SSD, 如 noop, deadline

/etc/udev/rules.d/60-ioschedulers.rules 里写入如下规则, 为 SSD 启用 mq-deadline 调度器

1
ACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*|nvme[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"

Ext4 性能优化

参考: Ext4#Improving_performance

禁止更新访问时间戳

想了想我似乎没有需要知道某个文件上次被访问是啥时候的需求, 于是 fstab 添加noatime 参数禁用之.

如果有这个需求的话, 也可以用 relatime/strictatime搭配lazytime来减小写入硬盘的次数. 虽然系统崩溃时可能导致访问时间未更新, 不过这显然不是什么大事......

关闭屏障

虽然没懂到底是什么鬼(保证写入的正确性?), 不过wiki上说有备用电源就可以安全关闭.

笔记本, 不怕断电, 果断添加参数barrier=0禁用.

禁用日志

首先卸载磁盘, 然后 tune2fs -O "^has_journal" /dev/sdXN

以前关掉过, 后来想了想还是打开了...为了我能够安心地强制关机......

加速日志

根据这篇文章, 最棒的方法应该是单独使用一个分区作为日志分区然后启用 journal_async_commit:ext4: using external journal to optimise performance. 速度最多能提升到原来的三倍, 妙啊妙啊!

Mark 一下, 暂时不打算弄.

fstab

参考: fstab

使用 LABEL

fstab 默认使用的是内核名称描述符(eg. /dev/sda1)来指示挂载设备. 这通常问题不大.

然而当你加了一块硬盘(包括移动硬盘), 就可能会导致描述符的改变, 从而出现无法启动的状况. 到群里问了大佬们, 大佬们有推荐用 UUID, 有推荐用 LABEL 的. 个人感觉 LABEL 比较好懂 (

创建 LABEL 的方法见: Persistent_block_device_naming#by-label

以 ext4 为例, 使用 e2label /dev/XXX <label>创建 LABEL, 然后就可以在 fstab 里使用 LABEL=xxx 的方式来指示挂载设备了, 不用担心因为插拔硬盘导致奇怪的问题.

自动挂载移动硬盘

每次手动挂载很麻烦, 直接添加到 fstab 的话没插移动硬盘就会 error, 这时就要使用 nofail 参数, 像这样

1
LABEL=backup    /mnt/backup     ext4    defaults,noatime,nofail         0 2

第一次用貌似会遇到无法写入的问题, 使用 sudo chown -R $USER:$USER /mnt/backup 更改一次所有权就行了

自动挂载大分区

因为一直以来都以 Linux 作为主力系统. 然后觉得 ntfs-3g 实在不可靠......于是把原来 NTFS 的资料盘转成 ext4 了.

不过资料盘用得比较少, 可以用 noauto,x-systemd.automount 参数使得在访问时才挂载

1
LABEL=storage   /mnt/storage    ext4    defaults,noatime,noauto,x-systemd.automount             0 2

(第一次用还是需要 chown 好像....)

pacman

参考: pacman

pacman.conf

# Misc options开启 ColorVerbosePkgLists

1
2
3
4
5
6
# Misc options
#UseSyslog
Color
#TotalDownload
CheckSpace
VerbosePkgLists

作用: pacman 彩色输出 && 升级时使用三栏显示

自动清理软件包缓存

创建 /usr/share/libalpm/hooks/clean-cache.hook, 内容如下

1
2
3
4
5
6
7
8
9
10
11
[Trigger]
Operation = Remove
Operation = Install
Operation = Upgrade
Type = Package
Target = *

[Action]
Description = Cleaning up old packages...
When = PostTransaction
Exec = /usr/bin/paccache -rvk3

作用: 每次升级软件包后清理最近三次以前的软件包

makepkg

参考: makepkg

.makepkg.conf

新建 ~/.makepkg.conf, 写入如下内容pacman

1
2
3
4
5
6
7
8
9
CFLAGS="-march=native -O2 -pipe -fno-plt"
CXXFLAGS="-march=native -O2 -pipe -fno-plt"

MAKEFLAGS="-j$(nproc)"

BUILDENV=(!distcc color ccache !check !sign)
BUILDDIR=/tmp/makepkg

COMPRESSXZ=(xz -c -z - --threads=0)

作用: 优化生成的二进制文件 && 加快编译速度 && 加快软件包生成速度