![系统因磁盘 I/O 而冻结](https://linux22.com/image/1187594/%E7%B3%BB%E7%BB%9F%E5%9B%A0%E7%A3%81%E7%9B%98%20I%2FO%20%E8%80%8C%E5%86%BB%E7%BB%93.png)
我遇到了类似的问题(可能是相同的问题),报告者是系统因磁盘 I/O 而冻结. 该问题在 Fedora 36 首次发布时也出现过。
当我启动一个对磁盘 I/O 要求更高的进程时,所有应用程序都会冻结,磁盘灯会持续亮几秒钟甚至几分钟。简单的任务,如复制 [200 MB 目录] 或解压文件(使用图形界面或终端),就足以触发问题。即使在恢复模式下使用 shell 也会发生这种情况。
我尝试了磁盘 I/O 的两个可用调度选项:mq-deadline(默认)和无。
我的配置:
- Ubuntu 22.04(内核 5.15.0-37-generic)
- i7 9700k
- 16 GB RAM
- RTX 2070
- 固态硬盘金士顿 A400
$ free -h
total used free shared buff/cache available
Mem: 15Gi 1,6Gi 11Gi 88Mi 2,2Gi 13Gi
Swap: 2,0Gi 0B 2,0Gi
# smartctl -a /dev/sda
...
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x0032 100 100 000 Old_age Always - 100
9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 6174
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 1145
148 Unknown_Attribute 0x0000 100 100 000 Old_age Offline - 0
149 Unknown_Attribute 0x0000 100 100 000 Old_age Offline - 0
167 Write_Protect_Mode 0x0000 100 100 000 Old_age Offline - 0
168 SATA_Phy_Error_Count 0x0012 100 100 000 Old_age Always - 3
169 Bad_Block_Rate 0x0000 100 100 000 Old_age Offline - 0
170 Bad_Blk_Ct_Erl/Lat 0x0000 100 100 010 Old_age Offline - 0/0
172 Erase_Fail_Count 0x0032 100 100 000 Old_age Always - 0
173 MaxAvgErase_Ct 0x0000 100 100 000 Old_age Offline - 0
181 Program_Fail_Count 0x0032 100 100 000 Old_age Always - 0
182 Erase_Fail_Count 0x0000 100 100 000 Old_age Offline - 0
187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0
192 Unsafe_Shutdown_Count 0x0012 100 100 000 Old_age Always - 201
194 Temperature_Celsius 0x0022 037 073 000 Old_age Always - 37 (Min/Max 26/73)
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0
199 SATA_CRC_Error_Count 0x0032 100 100 000 Old_age Always - 0
218 CRC_Error_Count 0x0032 100 100 000 Old_age Always - 3
231 SSD_Life_Left 0x0000 095 095 000 Old_age Offline - 95
233 Flash_Writes_GiB 0x0032 100 100 000 Old_age Always - 7968
241 Lifetime_Writes_GiB 0x0032 100 100 000 Old_age Always - 4379
242 Lifetime_Reads_GiB 0x0032 100 100 000 Old_age Always - 2333
244 Average_Erase_Count 0x0000 100 100 000 Old_age Offline - 53
245 Max_Erase_Count 0x0000 100 100 000 Old_age Offline - 153
246 Total_Erase_Count 0x0000 100 100 000 Old_age Offline - 37087
...
# gdisk /dev/sda
...
Model: KINGSTON SA400S3
Sector size (logical/physical): 512/512 bytes
...
Number Start (sector) End (sector) Size Code Name
1 2048 2000895 976.0 MiB EF00
2 2000896 6000639 1.9 GiB 8300
3 6000640 937701375 444.3 GiB 8300
...
编辑:
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1,6G 3,6M 1,6G 1% /run
/dev/mapper/sda3_crypt 437G 297G 118G 72% /
tmpfs 7,8G 127M 7,7G 2% /dev/shm
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
/dev/sda2 1,9G 244M 1,5G 14% /boot
/dev/sda1 975M 33M 942M 4% /boot/efi
tmpfs 1,6G 2,4M 1,6G 1% /run/user/1000
答案1
用 HDD 测试我的设置后,注意到读取速度正常,并考虑到@Esther 对该问题的评论,我终于解决了它。
看起来是 Luks2 加密。它加密了整个磁盘(分区),SSD 无法区分空闲扇区和已用扇区,因此无法使用修剪功能(据我了解)。
在 luks2 上启用 trim分区起了作用:
# cryptsetup --allow-discards --persistent refresh <mapping_of_the_encrypted_drive>
如果你想尝试一下,请记住以下几点安全警告:
警告:此命令可能会对安全造成负面影响,因为它会使文件系统级操作在物理设备上可见。例如,如果稍后可以找到丢弃的块,则可能会从物理设备中提取泄露文件系统类型、已用空间等信息。如果有疑问,请不要使用它。