diff --git a/site/profiles/manifests/ceph/osd.pp b/site/profiles/manifests/ceph/osd.pp index d56ff1d..c1e093c 100644 --- a/site/profiles/manifests/ceph/osd.pp +++ b/site/profiles/manifests/ceph/osd.pp @@ -2,6 +2,9 @@ class profiles::ceph::osd ( Boolean $ensure_running = true, ) { + # tune the I/O scheduler on the disks backing ceph OSDs + include profiles::ceph::osd_scheduler + if $ensure_running and $facts['is_ceph_osd'] { $facts['ceph_services']['osd'].each |String $svc| { service { $svc: diff --git a/site/profiles/manifests/ceph/osd_scheduler.pp b/site/profiles/manifests/ceph/osd_scheduler.pp new file mode 100644 index 0000000..5d19622 --- /dev/null +++ b/site/profiles/manifests/ceph/osd_scheduler.pp @@ -0,0 +1,32 @@ +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, + } + } +} diff --git a/site/profiles/templates/ceph/osd-scheduler.rules.erb b/site/profiles/templates/ceph/osd-scheduler.rules.erb new file mode 100644 index 0000000..28f87fb --- /dev/null +++ b/site/profiles/templates/ceph/osd-scheduler.rules.erb @@ -0,0 +1,5 @@ +# Managed by puppet (profiles::ceph::osd_scheduler). +# Set the I/O scheduler to <%= @scheduler %> on ceph OSD block devices. +<% @kernel_names.sort.each do |dev| -%> +ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="<%= dev %>", ATTR{queue/scheduler}="<%= @scheduler %>" +<% end -%>