我试图理解为什么我的 Fedora 38(Wayland 上的 KDE)在根磁盘(SanDisk SSD PLUS 240GB (UF5000RL))上有高 IO 时变得无响应几秒钟。
根分区是 LUKS 上的 Btrfs(详细信息在问题末尾提供)。
在这些情况下,即使分配给设备的 IO 调度程序是 BFQ(Fedora 中 SATA SSD 的默认调度程序),在这些情况下,似乎长时间都不会处理进一步的 IO 活动。有些应用程序(例如 Firefox)如果尝试 IO 甚至会崩溃(如果某些子进程没有响应,它可能有一个看门狗)。
当我启动电脑后,当我登录桌面并且开始加载内容(如面板、小部件和一些系统托盘应用程序)时,可能会出现此问题。
最糟糕的情况尤其是当 Steam 尝试更新《暗黑破坏神 4》等大型游戏(就存储而言)时。实际上,Steam 似乎只下载更改的增量,并将新文件组合到“下载”目录中。
现在,它通常在与游戏相同的磁盘中执行此操作,但在我的情况下,该磁盘没有足够的空间(它需要另外约 60 GB),因此 Steam 决定将这些新文件写入我的根磁盘。
iostat 1
显示写入突发从 35 MB/s 到 130 MB/s...
在网上进行了一些研究后,我发现了这个blktrace
工具,因此当另一个《暗黑破坏神 4》补丁到达 Steam 时,我设法跟踪了几秒钟的 IO 活动。这是解析的跟踪blkparse
(它不应包含任何个人数据):https://gist.github.com/tesfabpel/eb7d0f0f6cf64aa666e3e387bb771a21
我已经btt
成功收集了必要的数据来创建 3 个图,分别matplotlib
代表 Queue2Device、Device2Completion 和 Queue2Completion(下图和摘要)。
我想了解问题是否出在我的 SSD 上(是否可能出现故障?我注意到 D2C 时间最高,但这可能是正常的...我进行了扩展 SMART 自检,但没有发现有什么问题)或者 LUKS / btrfs 中的一些配置错误...
我需要从blktrace
痕迹中提取更多数据吗?
这个问题让我抓狂,我想更多地了解 Linux 的 IO 子系统(希望它对其他人也有用)。
谢谢。
这些是 LUKS 的设置:
LUKS header information
Version: 2
Epoch: 6
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
Label: (no label)
Subsystem: (no subsystem)
Flags: allow-discards same-cpu-crypt submit-from-crypt-cpus no-read-workqueue no-write-workqueue
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2id
Time cost: 4
Memory: 1048576
Threads: 4
AF stripes: 4000
AF hash: sha256
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 170223
正如您所看到的,我使用了一些标志 ( allow-discards same-cpu-crypt submit-from-crypt-cpus no-read-workqueue no-write-workqueue
) 来尝试加速 {en,de}加密,但它没有解决问题。
这是以下结果cryptsetup benchmark
:
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 1826787 iterations per second for 256-bit key
PBKDF2-sha256 3477864 iterations per second for 256-bit key
PBKDF2-sha512 1576806 iterations per second for 256-bit key
PBKDF2-ripemd160 805357 iterations per second for 256-bit key
PBKDF2-whirlpool 661145 iterations per second for 256-bit key
argon2i 9 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id 9 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 1104.9 MiB/s 2227.6 MiB/s
serpent-cbc 128b 106.7 MiB/s 650.2 MiB/s
twofish-cbc 128b 213.5 MiB/s 377.8 MiB/s
aes-cbc 256b 860.5 MiB/s 2125.8 MiB/s
serpent-cbc 256b 112.1 MiB/s 645.8 MiB/s
twofish-cbc 256b 217.6 MiB/s 376.3 MiB/s
aes-xts 256b 2040.3 MiB/s 2059.2 MiB/s
serpent-xts 256b 564.5 MiB/s 559.3 MiB/s
twofish-xts 256b 345.9 MiB/s 349.2 MiB/s
aes-xts 512b 1962.4 MiB/s 1958.9 MiB/s
serpent-xts 512b 578.6 MiB/s 567.6 MiB/s
twofish-xts 512b 354.4 MiB/s 353.9 MiB/s
btt
结果:
==================== All Devices ====================
ALL MIN AVG MAX N
--------------- ------------- ------------- ------------- -----------
Q2Q 0.000016862 0.174177680 9.661069906 220
Q2G 0.000002024 0.019928804 0.807080182 165
G2I 0.000001052 0.001048819 0.003998630 165
Q2M 0.000000370 0.000001245 0.000002966 42
I2D 0.000004078 0.006283935 0.168370736 109
M2D 0.001225914 0.008880338 0.074362742 28
D2C 0.000251386 1.055605439 7.040268517 135
Q2C 0.000268619 0.905934448 7.126410344 207