Storage System Optimization: Difference between revisions
m Right-justify screenshots per the documentation conventions (thumb|right|800px) - a centred 800px block pushes the prose down and reads worse than a right-floated thumbnail |
m Move the tunables reference to the new qs_systemtunables.conf page and link to it; content moved, not removed (QSTOR-12429) |
||
| (9 intermediate revisions by the same user not shown) | |||
| Line 3: | Line 3: | ||
The '''Storage System Optimization''' dialog allows one to adjust system tunings (tunables) that control cache behavior and Storage Pool I/O, so performance can be more closely matched to a specific hardware configuration and workload. | The '''Storage System Optimization''' dialog allows one to adjust system tunings (tunables) that control cache behavior and Storage Pool I/O, so performance can be more closely matched to a specific hardware configuration and workload. | ||
{{Navigation|Storage Management → Storage Systems → ''right-click a Storage System'' → Storage System Optimization...}} | |||
Note this dialog is reached from the '''right-click''' context menu on a Storage System, not from the toolbar. Note also that most of the tuning settings (all those based on zfs params) only effect Scale-up (ZFS-based) pools and not Scale-out (Ceph-based) pools. | Note this dialog is reached from the '''right-click''' context menu on a Storage System, not from the toolbar. Note also that most of the tuning settings (all those based on zfs params) only effect Scale-up (ZFS-based) pools and not Scale-out (Ceph-based) pools. | ||
Every setting is applied live to the running system and most settings do not require a reboot (driver changes to the SPL excepted). All changes are persisted so they survive reboots and upgrades. Values are per Storage System, so in a grid each system is tuned independently. The '''Storage System''' selector at the top of the dialog switches which system you are editing. To apply a common configuration to each system save your custom configuration as a Optimization Profile first, then apply it to other systems. | Every setting is applied live to the running system and most settings do not require a reboot (driver changes to the SPL excepted). All changes are persisted so they survive reboots and upgrades. Values are per Storage System, so in a grid each system is tuned independently. The '''Storage System''' selector at the top of the dialog switches which system you are editing. To apply a common configuration to each system save your custom configuration as a Optimization Profile first, then apply it to other systems. | ||
The six tabs group the tunables by what they affect: | |||
* [[qs_systemtunables.conf#General Settings|General Settings]] -- resilver, replication prefetch, cleanup, metaslabs, read-ahead (11 settings) | |||
* [[qs_systemtunables.conf#Cache Settings|Cache Settings]] -- ARC size, write throttle and flush behaviour, compression, prefetch (7) | |||
* [[qs_systemtunables.conf#Pool Settings|Pool Settings]] -- per-device queue depths, I/O aggregation, scrub queue (9) | |||
* [[qs_systemtunables.conf#Network Settings|Network Settings]] -- TX/RX queue length and device backlog (2) | |||
* [[qs_systemtunables.conf#Volume Settings|Volume Settings]] -- Storage Volume sync I/O mode (1) | |||
* [[qs_systemtunables.conf#Driver Settings|Driver Settings]] -- SPL kernel memory cache (3) | |||
See also [[#Optimization Profiles|Optimization Profiles]] and | |||
[[#Extending and customizing the configuration files|Extending the configuration files]]. | |||
== Before you change anything == | == Before you change anything == | ||
| Line 38: | Line 50: | ||
* '''Seagate Exos Protect Optimized''' -- tuning for large scale-up deployments layered over Seagate ADAPT hardware RAID. | * '''Seagate Exos Protect Optimized''' -- tuning for large scale-up deployments layered over Seagate ADAPT hardware RAID. | ||
Profiles can also be managed from the CLI: | Profiles can also be managed from the CLI -- see the [[QuantaStor CLI Command Reference]] for each command's full argument list: | ||
<pre> | <pre style="font-size: smaller"> | ||
qs tunable-profile-list | qs tunable-profile-list | ||
qs tunable-profile-get --tunable-profile=<name> | qs tunable-profile-get --tunable-profile=<name> | ||
| Line 49: | Line 61: | ||
</pre> | </pre> | ||
Individual tunables can be read and set directly: | Individual tunables can be read and set directly. Note {{Code|1=tunable-set}} | ||
takes the value as part of {{Code|1=--tunable}} in {{Code|1=key:value}} form | |||
-- there is no separate {{Code|1=--value}} argument -- and accepts a comma | |||
separated list to set several at once: | |||
<pre> | <pre style="font-size: smaller"> | ||
qs tunable-list | qs tunable-list | ||
qs tunable-get --tunable=<sst_name> | qs tunable-get --tunable=<sst_name> | ||
qs tunable-set --tunable=<sst_name> | qs tunable-set --tunable=<sst_name>:<value> | ||
qs tunable-set --tunable=sst_cache_size:80,sst_write_flush_rate_sec:5 | |||
</pre> | </pre> | ||
{{Code|1=tunable-set}} also takes {{Code|1=--tunable-option=reset}} to | |||
return tunables to their defaults, and {{Code|1=--storage-system}} to target a | |||
system other than the local one. | |||
== Settings Reference == | == Settings Reference == | ||
[[File:ssopt_general.png|thumb|right|650px|Storage System Optimization, General Settings tab.]] | |||
Every setting the dialog offers is documented on '''[[qs_systemtunables.conf]]''', the configuration file the tunable set is loaded from: one table per tab, giving each setting's identifier, its accepted range, its shipped default, its help text, and the kernel parameter it writes. That page also covers the file's format, the two retired tunables, and the override path that keeps a local change to the tunable set across an upgrade. | |||
[[ | |||
== Extending and customizing the configuration files == | == Extending and customizing the configuration files == | ||
| Line 253: | Line 89: | ||
Both files live in: | Both files live in: | ||
<pre> | <pre style="font-size: smaller"> | ||
/opt/osnexus/quantastor/conf/ | /opt/osnexus/quantastor/conf/ | ||
</pre> | </pre> | ||
'''These files are replaced on upgrade.''' Keep a copy of any local additions outside that directory and re-apply them after upgrading, or the changes will be lost. In both files a line is treated as a comment only when | '''These files are replaced on upgrade.''' Keep a copy of any local additions outside that directory and re-apply them after upgrading, or the changes will be lost. In both files a line is treated as a comment only when {{Code|1=#}} is the '''first character''' of the line -- an indented {{Code|1=#}} is not a comment. | ||
Changes take effect when the QuantaStor service restarts: | Changes take effect when the QuantaStor service restarts: | ||
<pre> | <pre style="font-size: smaller"> | ||
systemctl restart quantastor | systemctl restart quantastor | ||
</pre> | </pre> | ||
| Line 267: | Line 103: | ||
=== qs_systemtunables.conf -- defining what appears in the dialog === | === qs_systemtunables.conf -- defining what appears in the dialog === | ||
Adding a tunable, retiring one, or changing a range is done in {{Code|1=qs_systemtunables.conf}}. See '''[[qs_systemtunables.conf]]''' for its keys, its validation rules, and the override location that survives an upgrade. A tunable added there automatically becomes part of the built-in '''Default''' profile, because that profile is regenerated from every tunable's {{Code|1=default}} value on each service start. | |||
| | |||
=== qs_systemprofiles.conf -- defining profiles === | === qs_systemprofiles.conf -- defining profiles === | ||
| Line 309: | Line 109: | ||
Each profile is one section, with a display name, a description, and a list of tunable values: | Each profile is one section, with a display name, a description, and a list of tunable values: | ||
<pre> | <pre style="font-size: smaller"> | ||
[my_site_nfs_tuning] | [my_site_nfs_tuning] | ||
name=Site NFS Tuning | name=Site NFS Tuning | ||
| Line 316: | Line 116: | ||
</pre> | </pre> | ||
The | The {{Code|1=tunables}} value is a comma separated list of {{Code|1=key:value}} pairs. Four key forms are accepted: | ||
* the tunable's | * the tunable's {{Code|1=sst_}} section name, for example {{Code|1=sst_cache_size}} | ||
* a bare ZFS parameter name -- anything beginning | * a bare ZFS parameter name -- anything beginning {{Code|1=zfs_}}, {{Code|1=zfetch_}}, {{Code|1=metaslab_}}, {{Code|1=zio_}} or {{Code|1=vdev_}} -- resolved under {{Code|1=/sys/module/zfs/parameters/}} | ||
* a bare SPL parameter name beginning | * a bare SPL parameter name beginning {{Code|1=spl_}}, resolved under {{Code|1=/sys/module/spl/parameters/}} | ||
* a full parameter path beginning | * a full parameter path beginning {{Code|1=/}} | ||
A value carrying a | A value carrying a {{Code|1=B}} suffix is treated as a byte count and converted into the tunable's display units, which is why the shipped Seagate profile can write {{Code|1=zfs_vdev_aggregation_limit:33554432B}} for a setting the dialog presents in KB. | ||
'''A value outside the tunable's min/max is skipped, not clamped.''' The profile still applies, but that one setting is silently left alone apart from a warning in the service log: | '''A value outside the tunable's min/max is skipped, not clamped.''' The profile still applies, but that one setting is silently left alone apart from a warning in the service log: | ||
<pre> | <pre style="font-size: smaller"> | ||
Skipping tunable '<name>' for profile '<profile>', value '<n>' is outside of range (<min> : <max>) | Skipping tunable '<name>' for profile '<profile>', value '<n>' is outside of range (<min> : <max>) | ||
</pre> | </pre> | ||
If a profile does not appear to take full effect, check | If a profile does not appear to take full effect, check {{Code|1=/var/log/qs/qs_service.log}} for that message before assuming the tunable itself is broken. | ||
Two further rules are worth knowing: | Two further rules are worth knowing: | ||
* '''Do not add a | * '''Do not add a {{Code|1=tunables}} line to a profile marked {{Code|1=populate_defaults=true}}.''' That flag marks the built-in '''Default''' profile, whose tunable set is generated automatically from every tunable's {{Code|1=default}} value on each service start. | ||
* '''A profile you have modified is not overwritten by the file.''' If a profile of the same name already exists and has been edited, the definition in the configuration file is not re-applied over it. The '''Default''' profile is the exception and is always refreshed. | * '''A profile you have modified is not overwritten by the file.''' If a profile of the same name already exists and has been edited, the definition in the configuration file is not re-applied over it. The '''Default''' profile is the exception and is always refreshed. | ||
The easiest way to author a custom profile is to set the values you want in the dialog, press '''Save Profile...''', and then read the result back with | The easiest way to author a custom profile is to set the values you want in the dialog, press '''Save Profile...''', and then read the result back with {{Code|1=[[QuantaStor CLI Command Reference#tunable-profile-get|qs tunable-profile-get]]}}. That gives you a known-good set of values to copy into the configuration file for deployment across a fleet. | ||
== Related pages == | == Related pages == | ||
| Line 344: | Line 144: | ||
* [[Storage System]] -- the Storage System Modify dialog and the rest of the system-level configuration | * [[Storage System]] -- the Storage System Modify dialog and the rest of the system-level configuration | ||
* [[Storage Pools]] -- pool-level tuning, which is separate from these system-wide tunables | * [[Storage Pools]] -- pool-level tuning, which is separate from these system-wide tunables | ||
---- | |||
<small>''Verified against QuantaStor 6.9.0.''</small> | |||
Latest revision as of 07:21, 3 September 2026
The Storage System Optimization dialog allows one to adjust system tunings (tunables) that control cache behavior and Storage Pool I/O, so performance can be more closely matched to a specific hardware configuration and workload.
Note this dialog is reached from the right-click context menu on a Storage System, not from the toolbar. Note also that most of the tuning settings (all those based on zfs params) only effect Scale-up (ZFS-based) pools and not Scale-out (Ceph-based) pools.
Every setting is applied live to the running system and most settings do not require a reboot (driver changes to the SPL excepted). All changes are persisted so they survive reboots and upgrades. Values are per Storage System, so in a grid each system is tuned independently. The Storage System selector at the top of the dialog switches which system you are editing. To apply a common configuration to each system save your custom configuration as a Optimization Profile first, then apply it to other systems.
The six tabs group the tunables by what they affect:
- General Settings -- resilver, replication prefetch, cleanup, metaslabs, read-ahead (11 settings)
- Cache Settings -- ARC size, write throttle and flush behaviour, compression, prefetch (7)
- Pool Settings -- per-device queue depths, I/O aggregation, scrub queue (9)
- Network Settings -- TX/RX queue length and device backlog (2)
- Volume Settings -- Storage Volume sync I/O mode (1)
- Driver Settings -- SPL kernel memory cache (3)
See also Optimization Profiles and Extending the configuration files.
Before you change anything
The shipped defaults are appropriate for the large majority of deployments. The tunables here are the ones that matter for specific, identifiable problems (resilver taking too long, write latency spikes under load, a replication window overrunning). Changing them speculatively is more likely to reduce performance and create problems rather than help so we recommend any changes here be done with the assistance of the support team.
Recommended approach:
- Establish a baseline first. Use the Performance and Cache Stats (ARC) views on the Storage System dashboard to see what the system is actually doing before you change anything.
- Change one group of related settings at a time, then measure again under a representative workload.
- Save a named profile before you start experimenting, so you can get back to a known state -- see Optimization Profiles.
- Revert All returns the dialog to the values currently stored in the database, which is the quickest way out of a half-finished experiment. Note it reverts the workspace -- you still need OK or Apply to make that stick.
If you are unsure whether a setting applies to your situation, contact OSNEXUS support rather than guessing; several of these interact.
Optimization Profiles
A profile is a named collection of tunable values that can be applied to a Storage System in one step. Profiles make it practical to keep a tuning recipe consistent across a fleet, and to get back to a known configuration.
The Optimization Profiles controls at the top of the dialog are:
- Apply Profile -- copies the selected profile's values into the dialog. Nothing is committed until you press OK or Apply, so you can review what a profile will change before accepting it.
- Save Profile... -- saves the values currently in the dialog as a new named profile.
- Delete Profile -- deletes the selected profile. This only removes the profile; it does not change the settings of any system that had it applied.
- Revert All -- resets the dialog back to the values stored in the database for this system.
Two profiles ship with QuantaStor:
- Default -- every tunable at its shipped default. Applying it resets the whole system optimization configuration. This profile is regenerated from the current defaults each time the QuantaStor service starts, so it always reflects the running release, including tunables added in a newer version.
- Seagate Exos Protect Optimized -- tuning for large scale-up deployments layered over Seagate ADAPT hardware RAID.
Profiles can also be managed from the CLI -- see the QuantaStor CLI Command Reference for each command's full argument list:
qs tunable-profile-list qs tunable-profile-get --tunable-profile=<name> qs tunable-profile-create --name=<name> ... qs tunable-profile-modify --tunable-profile=<name> ... qs tunable-profile-apply --tunable-profile=<name> --storage-system=<system> qs tunable-profile-delete --tunable-profile=<name>
Individual tunables can be read and set directly. Note tunable-set
takes the value as part of --tunable in key:value form
-- there is no separate --value argument -- and accepts a comma
separated list to set several at once:
qs tunable-list qs tunable-get --tunable=<sst_name> qs tunable-set --tunable=<sst_name>:<value> qs tunable-set --tunable=sst_cache_size:80,sst_write_flush_rate_sec:5
tunable-set also takes --tunable-option=reset to
return tunables to their defaults, and --storage-system to target a
system other than the local one.
Settings Reference

Every setting the dialog offers is documented on qs_systemtunables.conf, the configuration file the tunable set is loaded from: one table per tab, giving each setting's identifier, its accepted range, its shipped default, its help text, and the kernel parameter it writes. That page also covers the file's format, the two retired tunables, and the override path that keeps a local change to the tunable set across an upgrade.
Extending and customizing the configuration files
The tunable set and the shipped profiles are both driven by plain text configuration files on each Storage System, so a site can add tunables that QuantaStor does not expose out of the box and define its own profiles.
Both files live in:
/opt/osnexus/quantastor/conf/
These files are replaced on upgrade. Keep a copy of any local additions outside that directory and re-apply them after upgrading, or the changes will be lost. In both files a line is treated as a comment only when # is the first character of the line -- an indented # is not a comment.
Changes take effect when the QuantaStor service restarts:
systemctl restart quantastor
qs_systemtunables.conf -- defining what appears in the dialog
Adding a tunable, retiring one, or changing a range is done in qs_systemtunables.conf. See qs_systemtunables.conf for its keys, its validation rules, and the override location that survives an upgrade. A tunable added there automatically becomes part of the built-in Default profile, because that profile is regenerated from every tunable's default value on each service start.
qs_systemprofiles.conf -- defining profiles
Each profile is one section, with a display name, a description, and a list of tunable values:
[my_site_nfs_tuning] name=Site NFS Tuning description=Tuning for NFS-heavy workloads on our 60-bay shelves. tunables="zfs_arc_max:80,zfs_txg_timeout:5,spl_kmem_cache_kmem_threads:8"
The tunables value is a comma separated list of key:value pairs. Four key forms are accepted:
- the tunable's
sst_section name, for examplesst_cache_size - a bare ZFS parameter name -- anything beginning
zfs_,zfetch_,metaslab_,zio_orvdev_-- resolved under/sys/module/zfs/parameters/ - a bare SPL parameter name beginning
spl_, resolved under/sys/module/spl/parameters/ - a full parameter path beginning
/
A value carrying a B suffix is treated as a byte count and converted into the tunable's display units, which is why the shipped Seagate profile can write zfs_vdev_aggregation_limit:33554432B for a setting the dialog presents in KB.
A value outside the tunable's min/max is skipped, not clamped. The profile still applies, but that one setting is silently left alone apart from a warning in the service log:
Skipping tunable '<name>' for profile '<profile>', value '<n>' is outside of range (<min> : <max>)
If a profile does not appear to take full effect, check /var/log/qs/qs_service.log for that message before assuming the tunable itself is broken.
Two further rules are worth knowing:
- Do not add a
tunablesline to a profile markedpopulate_defaults=true. That flag marks the built-in Default profile, whose tunable set is generated automatically from every tunable'sdefaultvalue on each service start. - A profile you have modified is not overwritten by the file. If a profile of the same name already exists and has been edited, the definition in the configuration file is not re-applied over it. The Default profile is the exception and is always refreshed.
The easiest way to author a custom profile is to set the values you want in the dialog, press Save Profile..., and then read the result back with qs tunable-profile-get. That gives you a known-good set of values to copy into the configuration file for deployment across a fleet.
Related pages
- Storage System -- the Storage System Modify dialog and the rest of the system-level configuration
- Storage Pools -- pool-level tuning, which is separate from these system-wide tunables
Verified against QuantaStor 6.9.0.