diff --git a/docs/params/osd.yml b/docs/params/osd.yml index a7180071..60a9c5bc 100644 --- a/docs/params/osd.yml +++ b/docs/params/osd.yml @@ -329,3 +329,13 @@ info_ru: | Минимальная применимая к ограничиваемым операциям задержка. Обычно не требует изменений. +- name: osd_memlock + type: bool + default: false + info: > + Lock all OSD memory to prevent it from being unloaded into swap with + mlockall(). Requires sufficient ulimit -l (max locked memory). + info_ru: > + Блокировать всю память OSD с помощью mlockall, чтобы запретить её выгрузку + в пространство подкачки. Требует достаточного значения ulimit -l (лимита + заблокированной памяти). diff --git a/mon/mon.js b/mon/mon.js index 5d674d68..3407d25e 100644 --- a/mon/mon.js +++ b/mon/mon.js @@ -104,6 +104,7 @@ const etcd_tree = { no_rebalance: false, print_stats_interval: 3, slow_log_interval: 10, + osd_memlock: false, // blockstore - fixed in superblock block_size, disk_alignment, diff --git a/src/osd.cpp b/src/osd.cpp index 3a5c3beb..c5b51965 100644 --- a/src/osd.cpp +++ b/src/osd.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -53,6 +54,16 @@ osd_t::osd_t(const json11::Json & config, ring_loop_t *ringloop) autosync_writes = max_autosync; } + if (this->config["osd_memlock"] == "true" || this->config["osd_memlock"] == "1" || this->config["osd_memlock"] == "yes") + { + // Lock all OSD memory if requested + if (mlockall(MCL_CURRENT|MCL_FUTURE|MCL_ONFAULT) != 0) + { + fprintf(stderr, "osd_memlock is set to true, but mlockall() failed: %s\n", strerror(errno)); + exit(-1); + } + } + this->tfd->set_timer(print_stats_interval*1000, true, [this](int timer_id) { print_stats();