PowerEdge: Reduced Storage Performance on Linux When Using PERC or HBA Controllers with SSD or NVMe Drives
Summary: Linux host reports reduced storage performance when using PERC or HBA controllers with attached SSD or NVMe devices.
Symptoms
Systems running Linux exhibit lower-than-expected performance on SSD or NVMe drives connected through PERC or HBA controllers. Symptoms include:
- Reduced IOPS
- Elevated latency
- Suboptimal throughput relative to expected device or platform capabilities
Cause
Modern PERC RAID and HBA controllers present attached storage devices to the operating system through a SCSI device model, even when the underlying media is NVMe. Because these devices appear as SCSI SAS targets, most Linux distributions automatically apply legacy block I/O scheduling policies optimized for rotational hard drives. When SSD or NVMe devices are forced through these HDD-oriented schedulers, the result is reduced throughput and higher latency compared to their native performance.
Relevant Controller Models
| Controller Type | Models |
|---|---|
| PERC | H345, H350, H355, H365, H740P, H745, H750, H755, H840, H965, H975 |
| HBA | HBA345, HBA355, HBA465 |
Resolution
For SSD and NVMe drives attached through PERC or HBA controllers, changing the Linux block I/O scheduler to none may improve performance. Linux typically sets the scheduler to none for native NVMe configurations, but devices behind PERC and HBA controllers appear as SCSI targets and receive a different default scheduler.
OS Disk Scheduler Documentation
Refer to your operating system documentation for full details on disk scheduler configuration:
- Red Hat Enterprise Linux 8: Setting the disk scheduler
- Red Hat Enterprise Linux 9: Setting the disk scheduler
- SUSE Linux Enterprise Server 15 SP6: Tuning I/O performance
Check the Current Scheduler
As superuser, run the following command, where {SD} is the device block entry under /dev (for example, sda):
cat /sys/block/{SD}/queue/scheduler
Screenshot showing the scheduler set to mq-deadline in Red Hat Enterprise Linux 9 for sda:

Set the Scheduler to None
As superuser, run the following command, where {SD} is the device block entry under /dev (for example, sda):
echo "none" > /sys/block/{SD}/queue/scheduler
Screenshot showing the scheduler updated to none for sda:

/dev block device name changes. A udev rule can be added for the device WWID to persistently set the scheduler to none. Refer to your OS documentation for instructions on creating udev rules or similar mechanisms for setting block device parameters.
Additional Optimization
Additional OS tuning and BIOS power profile changes may be required to achieve maximum controller and drive performance. Refer to your OS performance tuning documentation and BIOS power profile settings for further guidance.