Summary
On TrueNAS CE 25.10.7, the middleware’s periodic SMART poll runs smartctl -x on every disk. For SATA drives attached through my SAS expander, the SCT log reads included in -x hang whenever the drive is busy. The drive stops answering all commands (including ZFS reads/writes) until the kernel aborts and resets it after 30 s. The poll walks the disks one by one, so the pool stalls for up to ~10 minutes, every 90 minutes and shortly after boot. The same drives on the same HBA and cable work perfectly when connected directly to the HBA, bypassing the expander.
This looks like the same issue as the thread “Drives start timing out every 90 minutes” (March 2026), where the problem followed one particular backplane across several HBAs.
System
- TrueNAS CE 25.10.7 (kernel 6.12.105-production+truenas, smartmontools 7.4)
- HBA: Supermicro-branded LSI SAS3008, IT mode, firmware 16.00.12.00 (also seen on 16.00.01.00)
- Expander: Intel RES3FV288, firmware B057 (latest; SES reports serial “PMCSIERAD”)
- Disks: 12× Seagate Exos X16 16 TB SATA (ST16000NM001G), firmware SN03 (10) and SB40 (2), as 2× 6-wide RAIDZ2
- HDD Standby: Always On, APM: Disabled
Symptoms
- Transfers drop to 0 MB/s;
iostatshows one disk at 100 % util with no I/O. - Kernel log, one disk at a time:
sd 1:0:2:0: attempting task abort!scmd(...), outstanding for 31588 ms & timeout 30000 ms
sd 1:0:2:0: task abort: SUCCESS scmd(...)
sd 1:0:2:0: Power-on or device reset occurred
- Episodes start on a fixed 90-minute clock from boot (8 episodes fit a 5404 s period within ±13 s), plus one ~3 min after boot. That is why boots take 10–15 minutes before shares/iSCSI are usable.
- Episodes only happen when the pool is busy at that moment; idle polls pass silently.
zpool statusstays clean (0/0/0), so no data errors so far.
What triggers it
alert/source/smart.py:SMARTAlertSourceusesIntervalSchedule(timedelta(minutes=90));check_sync()loops over all disks fromdisk.get_disks()and callsdisk.smartctl_info().utils/disks_/disk_class.pyline 320:cmd = ["smartctl", "-x", self.devpath]- There is no per-disk opt-out that I can find (
togglesmartis gone in 25.10).
Live capture during an episode (ps every second). All processes are children of middlewared, in D state at blk_execute_rq:
| Disk | smartctl -x running |
|---|---|
| sdg | < 1 s |
| sdl | 11:42:10–11:43:14 (65 s) |
| sdj | 11:43:15–11:44:20 (66 s) |
| sdk | 11:44:21–11:45:58 (98 s) |
| sdf | 11:45:59–11:47:36 (98 s) |
| sdc | 11:47:37–11:48:41 (65 s) |
| sdn | 11:48:42–11:50:20 (99 s) |
| sdm | 11:50:21–11:51:25 (65 s) |
| sde | < 1 s |
65 s and 98 s equal 2 and 3 abort/reset cycles of ~32 s. The full poll took 9 min 17 s.
Reproduction (will briefly stall the pool)
dd if=/dev/sdX of=/dev/null bs=1M count=6000 iflag=direct status=none &
sleep 3; time smartctl -l scterc /dev/sdX
- Idle disk: 0.06 s.
- Busy disk behind the expander: 30.4 s, “Read SCT Status failed: Input/output error”, then a task abort and device reset.
-l scttemp: 32.8 s, same failure. - With
/sys/block/sdX/device/timeoutraised to 120, smartctl’s own 60 s pass-through timeout expired instead. The drive still never answered. The hung command:
CDB: ATA command pass through(16) 85 08 0e 00 d5 00 01 00 e0 00 4f 00 c2 00 b0 00
That is SMART READ LOG, log E0h (SCT status); the next one was E1h (SCT data).
smartctl -aandsmartctl -Hunder the same load: 0.26 s and 0.11 s, no errors.
Isolating the component
I moved one breakout cable (4 disks) from the expander to the HBA’s second port. Same disks, cable, HBA, firmware and driver; only the expander is removed from the path.
| Path | SCT query under load |
|---|---|
| Direct on HBA (SN03 and SB40 disks) | 17/17 OK, 0–1 s |
| Behind expander | 10/10 failed, ~30 s + reset |
Moving the expander’s power from a powered riser to a motherboard PCIe slot changed nothing.
Ruled out: cables (phy error counters 0 on all disk links; uplink counters only increase with link resets), PSU, HBA firmware, disk firmware revision, HDD standby/APM, smartd (not running), other scheduled tasks (cron, systemd timers, apps).
Requests
- Use
smartctl -ain the periodic poll (safe here under load), or at least drop the SCT queries (-l scttemp,-l scterc) that-xincludes. - Make the poll configurable (interval, off, or per-disk exclusion), or skip disks that have I/O in flight.
Has anyone seen the same with other expanders (LSI/Broadcom backplanes, Adaptec etc.)? The reproduction above takes a minute. Happy to run further tests.