Atuin ZFS下卡頓問題解決
最近一段時間在使用 fish + atuin 組合時,發現偶爾會出現卡頓,不是必現。表象就是當你輸 ip a
、htop
等低消耗命令時,系統感覺卡了幾秒,這明顯有問題。
作爲一個 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 的讀者必須上一張圖
重點關注 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),不要搞混了敲錯命令。
版權申明:
- 未標註來源的內容皆為原創,未經授權請勿轉載(因轉載後排版往往錯亂、內容不可控、無法持續更新等);
- 非營利為目的,演繹本博客任何內容,請以'原文出處'或者'參考鏈接'等方式給出本站相關網頁地址(方便讀者)。
相關文章:
- Ubuntu安裝chrome的方法總結
- Ubuntu開機啓動加速
- Ubuntu手動升級Libreoffice
- Ubuntu 22.10連接藍牙耳機報錯br-connection-profile-unavailable解決方法
- Ubuntu連接AirPods耳機
- Ubuntu連接AirPods耳機
- Ubuntu notify-send 定時通知
- Fish 和 Atuin使用記
- Wine安裝64位微信
- 如何修復Waybar微信圖標錯誤