Atuin ZFS下卡頓問題解決

最近一段時間在使用 fish + atuin 組合時,發現偶爾會出現卡頓,不是必現。表象就是當你輸 ip ahtop 等低消耗命令時,系統感覺卡了幾秒,這明顯有問題。

作爲一個 N 年的 Linux 用戶,從來沒有在終端裏面被這麼卡過,是可忍孰不可忍。一開始我以爲是什麼審計模塊的鍋,仔細查看進程,並沒有發現異常。

電腦環境也沒有做什麼特別變化操作,幾乎所有東西都是自己定製的,也不可能有問題,馬上意識到可能是新使用 atuin 的問題,畢竟 fish 都出來好多年了,不至於卡成這個鬼樣。

在 google 裏面搜索 atuin lag,第一條記錄即命中要害:https://github.com/atuinsh/atuin/issues/952

粗略讀了一遍上面的 issues,問題出現在 atuin 離線模式使用 SQLite 存儲 history 記錄,SQLite 在 ZFS 中就存在這種問題。

踩雷的用戶不多,首先你要用 ZFS,再次要用 atuin + SQLite

issues 裏面的解決方式有幾種,要麼修改 atuin 的源碼,要麼等 ZFS 或者 SQLite 修復。

上述方式都不是很輕鬆,個人覺得點贊最多的這個解決方式最輕鬆(略有修改)。

1sudo zfs create -V 500MB rpool/atuin
2sudo zfs list -o name,encryption | grep atuin # ensure encryption for the zvol
3sudo mkfs.ext4 /dev/zvol/rpool/atuin
4mv ~/.local/share/atuin ~/.local/share/atuin-backup
5mkdir ~/.local/share/atuin
6sudo mount /dev/zvol/rpool/atuin ~/.local/share/atuin
7sudo chown -R ${USER}: ~/.local/share/atuin
8cp -rv ~/.local/share/atuin-backup/* ~/.local/share/atuin

唯一不好的地方這裏的 mount 是臨時的,重啓後就丟失了,得把他寫入/etc/fstab 開機自動加載。

操作過程解釋記錄如下:

1. 創建 Zvolumes datasets 等

1➜  ~ sudo zfs create -V 500MB rpool/atuin
2[sudo] password for mephisto:
3cannot create 'rpool/atuin': dataset already exists

因爲我已經創建過了,所以會提示已存在,正常首次創建不會有問題的。

爲了照顧不熟悉 ZFS 的讀者必須上一張圖

zfs overview

重點關注 zpool 這一層,ZFS 相比傳統的文件系統,多了一層抽象,在軟件行業,一般多一層抽象的,都感覺很厲害的樣子,遇事不決加一層 😅

zpools 裏面包含 各種類型的 dataset,Zvolumes datasets 便是其中的一種,它可以被格式化成 ext4,能分區,能掛載,就好像一個塊設備一樣,真的厲害。

格式化

1sudo mkfs.ext4 /dev/zvol/rpool/atuin

查看結果

 1➜  ~ ls -al /dev/zvol/rpool/atuin
 2lrwxrwxrwx 1 root root 9 Feb 26 18:42 /dev/zvol/rpool/atuin -> ../../zd0
 3➜  ~ sudo fdisk -l
 4[sudo] password for mephisto:
 5Disk /dev/sda: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
 6Disk model: SanDisk SD8SN8U-
 7Units: sectors of 1 * 512 = 512 bytes
 8Sector size (logical/physical): 512 bytes / 4096 bytes
 9I/O size (minimum/optimal): 4096 bytes / 4096 bytes
10Disklabel type: gpt
11Disk identifier: 05A996E7-F044-4E59-9DED-F0C891E163CE
12
13Device       Start        End   Sectors   Size Type
14/dev/sda1     2048    1050623   1048576   512M EFI System
15/dev/sda2  1050624    5244927   4194304     2G Linux swap
16/dev/sda3  5244928    9439231   4194304     2G Solaris boot
17/dev/sda4  9439232 1000215182 990775951 472.4G Solaris root
18
19
20Disk /dev/zd0: 500 MiB, 524288000 bytes, 1024000 sectors
21Units: sectors of 1 * 512 = 512 bytes
22Sector size (logical/physical): 512 bytes / 16384 bytes
23I/O size (minimum/optimal): 16384 bytes / 16384 bytes

後續的步驟都很簡單,不再一一演示。

 1➜  ~ mount -v |grep atuin
 2/dev/zd0 on /home/mephisto/.local/share/atuin type ext4 (rw,relatime,stripe=4)
 3➜  ~ df -h ~/.local/share/atuin
 4Filesystem      Size  Used Avail Use% Mounted on
 5/dev/zd0        452M  5.8M  412M   2% /home/mephisto/.local/share/atuin
 6➜  ~ ls -al ~/.local/share/atuin
 7total 5865
 8drwxr-xr-x  4 mephisto mephisto    4096 Feb 27 15:42 ./
 9drwx------ 83 mephisto mephisto      93 Feb 27 16:53 ../
10drwxrwxr-x  2 mephisto mephisto    4096 Feb 26 16:43 atuin/
11-rw-r--r--  1 mephisto mephisto 4550656 Feb 27 17:12 history.db
12-rw-r--r--  1 mephisto mephisto   32768 Feb 27 17:12 history.db-shm
13-rw-r--r--  1 mephisto mephisto 1384352 Feb 27 17:12 history.db-wal
14-rw-rw-r--  1 mephisto mephisto      48 Feb 26 16:43 key
15drwx------  2 mephisto mephisto   16384 Feb 26 16:41 lost+found/

換成 ext4 後,真的很絲滑,再也沒卡過。

2. 開機自動掛載

查詢 uuid

1➜  ~ sudo blkid /dev/zd0
2/dev/zd0: UUID="6a16a600-bd7c-4b6f-b371-d0fb2306263a" BLOCK_SIZE="4096" TYPE="ext4"

備份/etc/fstab,不備份萬一搞壞了,文件系統都加載不了,處理起來有點麻煩的。

1sudo cp /etc/fstab /etc/fstab_bak

最後一行是添加的的,其它地方不要動,除非你知道它們是幹什麼用的,每個人的系統環境不一樣。uuid 填上面查詢的,tab 分隔。

1➜  ~ cat /etc/fstab | egrep -v '^#'
2UUID=742C-0CA0  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1
3/boot/efi/grub  /boot/grub      none    defaults,bind   0       0
4UUID=fd8b7e16-9901-48c0-b8dc-ab7da1459126       none    swap    sw      0       0
5UUID=6a16a600-bd7c-4b6f-b371-d0fb2306263a       /home/mephisto/.local/share/atuin       ext4    defaults        0       0

這樣開機啓動就設置好了,重啓後自動掛載正常。

想進一步瞭解 ZFS 文件系統的可查看 Gentoo 的 zfs 文檔

或者查看幫助文檔

1man zfs
2man zpool

最後友情提示,zfs 操作的是 datasets,zpool 操作的 zpolls(ZFS storage pools),不要搞混了敲錯命令。

最後修改於: Tuesday, February 27, 2024

相關文章:

翻譯: