Atuin ZFS における遅延問題の解決

最近、fishとatuinの組み合わせを使用している際に、時折遅延が発生するようになりました。ただし、必ずしも再現するとは限りません。症状は、ip ahtopといった低消費電力コマンドを入力すると、システムが数秒間フリーズするように見えることです。これは明らかに問題です。

長年Linuxを使用していますが、ターミナルでこのような遅延を経験したことはなく、許容できません。最初は監査モジュールの問題だと思いましたが、プロセスを注意深く確認したところ、異常は見つかりませんでした。

コンピュータ環境に大きな変更は加えていません。ほぼすべてがカスタム設計なので、問題はないはずです。すぐに、新しいatuinの問題かもしれないと気づきました。そもそもfishは何年も前から存在しているのですから、これほど遅延するはずがありません。

Googleで「atuin lag」を検索すると、問題を正確に示す最初の結果が表示されます。https://github.com/atuinsh/atuin/issues/952

問題をざっと読んだところ、問題はatuinのオフラインモードでSQLiteを使用して履歴レコードを保存していることにあります。SQLiteはZFSでもこの問題を抱えています。

この問題に遭遇したユーザーは多くありません。まず、ZFSを使用する必要があります。次に、atuin + SQLiteを使用する必要があります。

この問題には複数の解決策があります。atuinのソースコードを修正するか、ZFSまたはSQLiteの修正を待つかです。

これらの方法はどれも特に簡単ではありません。個人的には、最も多くの賛成票を集めた解決策(若干の修正が必要)が最も簡単だと思います。

 1
 2sudo zfs create -V 500MB rpool/atuin
 3
 4sudo zfs list -o name,encryption | grep atuin # zvol の暗号化を有効にする
 5
 6sudo mkfs.ext4 /dev/zvol/rpool/atuin
 7
 8mv ~/.local/share/atuin ~/.local/share/atuin-backup
 9
10mkdir ~/.local/share/atuin
11
12sudo mount /dev/zvol/rpool/atuin ~/.local/share/atuin
13
14sudo chown -R ${USER}: ~/.local/share/atuin
15
16cp -rv ~/.local/share/atuin-backup/* ~/.local/share/atuin

唯一の欠点は、このマウントは一時的なものであり、再起動すると失われることです。起動時に自動的にロードするには、/etc/fstab に追加する必要があります。

操作手順は以下のように説明され、記録されています。

1. Zボリュームデータセットなどの作成

1
2➜ ~ sudo zfs create -V 500MB rpool/atuin
3
4[sudo] mephisto のパスワード:
5
6'rpool/atuin' を作成できません: データセットが既に存在します

既に作成済みであるため、既に存在するというメッセージが表示されます。通常、最初の作成では問題は発生しないはずです。

ZFS に馴染みのない読者のために、図解が必要です。

zfs の概要

zpool 層に注目してください。従来のファイルシステムと比較して、ZFS には抽象化層が追加されています。ソフトウェア業界では、抽象化層が追加されることは、通常、印象に残るものです。迷ったらレイヤーを追加しましょう😅

zpoolsには様々なタイプのデータセットが含まれており、「Zvolumesデータセット」もその一つです。ブロックデバイスのように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] mephisto のパスワード:
 5ディスク /dev/sda: 476.94 GiB、512110190592 バイト、1000215216 セクタ
 6ディスクモデル: SanDisk SD8SN8U-
 7単位: セクタ数 (1 * 512 = 512 バイト)
 8セクタサイズ (論理/物理): 512 バイト / 4096バイト
 9I/Oサイズ(最小/最適): 4096バイト/4096バイト
10ディスクラベルタイプ: gpt
11ディスク識別子: 05A996E7-F044-4E59-9DED-F0C891E163CE
12
13デバイス 開始 終了 セクター サイズ タイプ
14/dev/sda1 2048 1050623 1048576 512M EFI システム
15/dev/sda2 1050624 5244927 4194304 2G Linux スワップ
16/dev/sda3 5244928 9439231 4194304 2G Solaris ブート
17/dev/sda4 9439232 1000215182 990775951 472.4G Solarisルート
18
19ディスク /dev/zd0: 500 MiB、524288000 バイト、1024000 セクタ
20単位: 1 セクタ × 512 = 512 バイト
21セクタサイズ (論理/物理): 512 バイト / 16384 バイト
22I/O サイズ (最小/最適): 16384 バイト / 16384 バイト

以降の手順は非常に簡単なので、個別に説明はしません。

 1➜ ~ mount -v |grep atuin
 2/dev/zd0 マウント先:/home/mephisto/.local/share/atuin タイプ:ext4 (rw,relatime,stripe=4)
 3➜ ~ df -h ~/.local/share/atuin
 4ファイルシステム サイズ 使用容量 空き容量 使用率 マウント先:
 5/dev/zd0 452MB 5.8MB 412MB 2% /home/mephisto/.local/share/atuin
 6➜ ~ ls -al ~/.local/share/atuin
 7合計 5865
 8drwxr-xr-x 4 mephisto mephisto 4096 2月27日 15:42 ./
 9drwx------ 83 mephisto mephisto 93 2月27日 16:53 ../
10drwxrwxr-x 2 mephisto mephisto 4096 2月26日 16:43 atuin/
11-rw-r--r-- 1 mephisto mephisto 4550656 2月27日 17:12 history.db
12-rw-r--r-- 1 mephisto mephisto 32768 2月27日 17:12 history.db-shm
13-rw-r--r-- 1 mephisto mephisto 1384352 2月27日 17:12 history.db-wal
14-rw-rw-r-- 1 mephisto mephisto 48 2月26日 16:43 key
15drwx------ 2 mephisto mephisto 16384 2月26日 16:41 lost+found/

ext4 に切り替えてからは、驚くほどスムーズに動作し、遅延は一度も感じていません。

2. 起動時の自動マウント

UUID の照会

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

/etc/fstab をバックアップしてください。バックアップせずに破損すると、ファイルシステムがロードできなくなり、非常に面倒なことになります。

1sudo cp /etc/fstab /etc/fstab_bak

最後の行が追加されます。目的がわからない限り、他の行には触れないでください。システム環境は人それぞれ異なります。上記で照会したUUIDをタブ区切りで入力してください。

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

これで起動が正しく設定され、再起動後に自動マウントが正常に機能します。

最終更新日: Friday, October 31, 2025

このシリーズの投稿:

翻訳: