When dealing with SSD optimization in complex storage configurations, the TRIM command propagation becomes particularly challenging. Here's what we know about each layer's TRIM support:
# Current storage stack visualization
SSD physical devices
↓
mdadm software RAID (RAID 10 in this case)
↓
LVM volume group/logical volume
↓
ext4 filesystem
↓
Application layer
For full TRIM support across all layers, you'll need:
- Kernel 3.1+ for mdadm TRIM support (commit 5e8e7cc in mainline)
- Kernel 3.7+ for reliable LVM thin provisioning TRIM
- Filesystem with discard option (ext4 since 2.6.33)
Here's how to enable TRIM throughout the entire stack:
# 1. Enable discard in mdadm (RAID layer)
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[a-d] \
--chunk=128 --assume-clean --bitmap=internal \
--write-mostly --write-behind=1024 \
--data-offset=16384 # Important for SSD alignment
# 2. Configure LVM to pass through TRIM commands
pvcreate /dev/md0
vgcreate --physicalextentsize 1m vg_ssd /dev/md0
lvcreate -l 100%FREE -n lv_data vg_ssd
# Enable issue_discards in lvm.conf
echo "issue_discards = 1" >> /etc/lvm/lvm.conf
Creating the ext4 filesystem with proper TRIM support:
# Format with discard option
mkfs.ext4 -E stripe-width=32,lazy_itable_init=0,lazy_journal_init=0 \
-m 0 -O ^has_journal /dev/vg_ssd/lv_data
# Mount options for fstab
/dev/vg_ssd/lv_data /ssd_data ext4 defaults,discard,noatime,nodiratime,data=writeback 0 2
To confirm TRIM is working through all layers:
# Check TRIM support at each level
hdparm -I /dev/sda | grep TRIM # Physical device
cat /sys/block/md0/md/array_state # RAID level
dmsetup table vg_ssd-lv_data # LVM mapping
tune2fs -l /dev/vg_ssd/lv_data | grep discard # Filesystem
When using TRIM in stacked configurations:
- Expect reduced TRIM efficiency (about 70-80% of bare device performance)
- Periodic
fstrim
may be better than continuous discard for heavy workloads - Monitor
/sys/block/md0/md/sync_speed
during TRIM operations
For systems that can't meet kernel requirements, consider:
# Manual TRIM script for LVM+mdadm
#!/bin/bash
for LV in $(lvs --noheadings -o lv_path); do
fstrim -v $(lvs --noheadings -o lv_dm_path $LV)
done
Schedule this via cron for weekly execution if continuous discard causes performance issues.
When working with SSDs in complex storage configurations, proper TRIM command propagation becomes critical for maintaining performance and longevity. The typical Linux stack with mdadm RAID, LVM, and ext4 adds multiple abstraction layers that can block TRIM operations.
You'll need at least Linux kernel 3.7 or later for reliable TRIM support across all layers. Earlier kernels (like 2.6.37 mentioned) have partial but incomplete implementations:
# Check kernel version
uname -r
For modern kernels (4.19+), here's how to enable full TRIM support:
# 1. Enable MD RAID TRIM support
echo Y > /sys/module/raid0/parameters/devices_handle_discard_safely
# 2. Configure LVM for TRIM passthrough
lvcreate --discards=passdown -L 100G -n ssd_vol vg_ssd
# 3. Mount ext4 with discard option
mount -t ext4 -o discard /dev/mapper/vg_ssd-ssd_vol /mnt/ssd
To confirm TRIM is working through all layers:
# Check discard support in MD RAID
cat /sys/block/md0/queue/discard_granularity
# Verify LVM settings
lvs -o +discards
# Test actual TRIM functionality
fstrim -v /mnt/ssd
If you can't use continuous TRIM, configure weekly fstrim jobs:
# Add to /etc/fstab:
/dev/mapper/vg_ssd-ssd_vol /mnt/ssd ext4 defaults,noatime 0 2
# Create weekly cron job
echo "0 0 * * 0 /sbin/fstrim /mnt/ssd" > /etc/cron.d/trim
Common issues and solutions:
- Kernel logs show "discard_zeroes_data=0" - update your kernel
- TRIM blocked at MD layer - ensure RAID1/10 configuration
- Performance degradation - switch from continuous to periodic TRIM