воскресенье, 24 августа 2025 г.

Система тормозит на SSD

Какое-то время назад заметил что домашний ноутбук тормозит когда ставятся обновления системы и при этом постоянно горит индикатор активности диска (индикатор продолжает непрырывно светиться даже в меню Grub).

В выводе iostat видна максимальная утилизация диска при небольшом количестве операций ввода-вывода

$ iostat -x sda
Linux 6.1.0-38-amd64 (dragoncore)       22/08/25        _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0,50    0,25   40,85   38,35    0,00   20,05

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
sda              1,00      0,50     0,00   0,00  251,00     0,50   40,00    459,00    20,00  33,33  146,22    11,47    0,00      0,00     0,00   0,00    0,00     0,00    7,00  133,29    7,03 105,20

В ноутбуке установлен SSD накопитель LITEON CV3-8D256-11 SATA 256GB формата M.2.

Посмотрел в атрибуты S.M.A.R.T.

$ sudo smartctl -A /dev/sda
smartctl 7.3 2022-02-28 r5338 [x86_64-linux-6.1.0-38-amd64] (local build)
Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0003   100   100   000    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0002   100   100   000    Old_age   Always       -       5763
 12 Power_Cycle_Count       0x0003   100   100   000    Pre-fail  Always       -       3819
175 Program_Fail_Count_Chip 0x0003   100   100   000    Pre-fail  Always       -       0
176 Erase_Fail_Count_Chip   0x0003   100   100   000    Pre-fail  Always       -       0
177 Wear_Leveling_Count     0x0003   100   100   000    Pre-fail  Always       -       768
178 Used_Rsvd_Blk_Cnt_Chip  0x0003   100   100   000    Pre-fail  Always       -       0
179 Used_Rsvd_Blk_Cnt_Tot   0x0003   100   100   000    Pre-fail  Always       -       0
180 Unused_Rsvd_Blk_Cnt_Tot 0x0033   100   100   005    Pre-fail  Always       -       1248
181 Program_Fail_Cnt_Total  0x0003   100   100   000    Pre-fail  Always       -       0
182 Erase_Fail_Count_Total  0x0003   100   100   000    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0003   100   100   000    Pre-fail  Always       -       0
194 Temperature_Celsius     0x0003   100   100   000    Pre-fail  Always       -       79
195 Hardware_ECC_Recovered  0x0003   100   100   000    Pre-fail  Always       -       0
199 UDMA_CRC_Error_Count    0x0003   100   100   000    Pre-fail  Always       -       1
238 Unknown_Attribute       0x0003   061   100   000    Pre-fail  Always       -       39
241 Total_LBAs_Written      0x0003   100   100   000    Pre-fail  Always       -       30759792686
242 Total_LBAs_Read         0x0003   100   100   000    Pre-fail  Always       -       48997828952

Видна высокая температура накопителя (79 градусов), но остальные параметры похоже в норме.

Прогнал этот отчёт S.M.A.R.T. через нейронку

  1. Состояние памяти NAND:

    • Нет ошибок программирования/стирания (атрибуты 175, 176, 181, 182): Значения равны 0.
    • Низкий уровень износа ячеек NAND (атрибут 177 — 768).
  2. Ошибки/сбои хранения данных:

    • Нет ни одной пересекторизации (атрибут 5 — 0).
    • Количество ошибок чтения/передачи данных (199) минимально, возможно, случайное.
  3. Температурный режим:

    • Температура (79°C) выше оптимального диапазона. Здесь есть риск ускоренного износа NAND и контроллера. Необходимо обеспечить лучшее охлаждение накопителя, особенно если он используется в условиях высокой загрузки (например, в ноутбуке/сервере).

При этом кулер в ноутбуке не работает. Попробовал его принудительно включить через i8kctl из i8kutils, но не сработало. В базе знаний Arch нашёл что нужно выключить контроль оборотов вентилятора в BIOS через dell-bios-fan-control

$ git clone https://github.com/TomFreudenberg/dell-bios-fan-control.git
$ cd dell-bios-fan-control/
$ make
$ sudo install -o root -m 755 dell-bios-fan-control /usr/local/sbin/
$ sudo dell-bios-fan-control 0
$ sudo i8kctl fan - 2

Теперь вентилятор работает на максимальных оборотах, но температура SSD не уменьшается.

Поскольку проблема проявляется во время активной записи на диск, то появилась теория что SSD не успевает писать данные из-за заполненности диска. На этом ноутбуке используется файловая система EXT4 поверх LVM2 поверх LUKS и команда "fstrim -v /" закончилась ошибкой.

$ sudo fstrim -v /
fstrim: /: the discard operation is not supported

Добавил "discard" в /etc/cryptsetup, обновил initramfs и перезагрузил систему.

$ sudo sed -i 's/luks/luks,discard/' /etc/crypttab

$ sudo update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-6.1.0-38-amd64
update-initramfs: Generating /boot/initrd.img-6.1.0-37-amd64

$ sudo reboot

После этого "fstrim -v /" отработала без ошибок.

$ sudo fstrim -v /
/: 27,8 MiB (29147136 bytes) trimmed

Через какое-то время погас индикатор активности диска и SSD остыл до 40 градусов. Чтобы fstrim выполнялся автоматически включил fstrim.timer

$ sudo systemctl enable --now fstrim.timer
Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /lib/systemd/system/fstrim.timer.

$ sudo systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
     Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; preset: enabled)
     Active: active (waiting) since Sat 2025-08-23 20:15:33 +03; 17h ago
    Trigger: Mon 2025-08-25 00:36:58 +03; 11h left
   Triggers: ● fstrim.service
       Docs: man:fstrim

Aug 23 20:15:33 dragoncore systemd[1]: Started fstrim.timer - Discard unused blocks once a week.

После всех манипуляций запустил установку обновлений в виртуальных машинах, но медленной работы системы не наблюдалось.

1 комментарий: