804ea06499
## Why Ceph OSDs manage their own I/O ordering, so the kernel scheduler on the backing disks just adds overhead. The original intent was to set those disks to the `noop` scheduler. The whole OSD fleet (k8s + incus nodes) runs AlmaLinux 9 on blk-mq kernels (5.14), where the equivalent of `noop` is `none`. ## Changes - Add `profiles::ceph::osd_scheduler`, rendering a udev rule from the `ceph_osd_devices` fact (PR #504) that pins `queue/scheduler` to `none` on each OSD disk. - Reload udev and trigger the matched block devices so the setting applies immediately; the udev rule keeps it set across reboots and device re-add. - No-op when the fact is absent/empty, so VMs and non-OSD hosts are untouched. - Include the class from `profiles::ceph::osd` so it lands only on OSD hosts. https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT --------- Co-authored-by: BenVincent <benvin@main.unkin.net> Reviewed-on: #505 Co-authored-by: Ben Vincent <ben@unkin.net> Co-committed-by: Ben Vincent <ben@unkin.net>
33 lines
1.1 KiB
Puppet
33 lines
1.1 KiB
Puppet
class profiles::ceph::osd_scheduler (
|
|
String[1] $scheduler = 'none',
|
|
) {
|
|
|
|
$devices = $facts['ceph_osd_devices']
|
|
|
|
# no-op where the fact is absent/empty (VMs, non-OSD hosts have no ceph PVs)
|
|
if $devices =~ Array[String[1], 1] {
|
|
|
|
# strip /dev/ so the rule matches the udev KERNEL sysname (e.g. sda)
|
|
$kernel_names = $devices.map |$dev| { regsubst($dev, '^.*/', '') }
|
|
$sysname_matches = $kernel_names.map |$name| { "--sysname-match=${name}" }
|
|
|
|
file { '/etc/udev/rules.d/60-ceph-osd-scheduler.rules':
|
|
ensure => file,
|
|
owner => 'root',
|
|
group => 'root',
|
|
mode => '0644',
|
|
content => template('profiles/ceph/osd-scheduler.rules.erb'),
|
|
notify => Exec['ceph-osd-scheduler-reload'],
|
|
}
|
|
|
|
# apply immediately; udev re-applies on reboot and device re-add
|
|
$trigger = "udevadm trigger --subsystem-match=block --action=change ${join($sysname_matches, ' ')}"
|
|
|
|
exec { 'ceph-osd-scheduler-reload':
|
|
command => "udevadm control --reload-rules && ${trigger}",
|
|
path => ['/usr/bin', '/bin', '/usr/sbin', '/sbin'],
|
|
refreshonly => true,
|
|
}
|
|
}
|
|
}
|