When fs.aio-max-nr does not have enough size, try to adjust
max_networking_aio_io_control_blocks size to fit fs.aio-max-nr.
See scylladb/scylla#9096
Signed-off-by: Takuya ASADA <
sy...@scylladb.com>
---
include/seastar/core/smp.hh | 1 +
src/core/reactor.cc | 27 ++++++++++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/include/seastar/core/smp.hh b/include/seastar/core/smp.hh
index 74898627..1f58a08d 100644
--- a/include/seastar/core/smp.hh
+++ b/include/seastar/core/smp.hh
@@ -445,6 +445,7 @@ class smp : public std::enable_shared_from_this<smp> {
void pin(unsigned cpu_id);
void allocate_reactor(unsigned id, reactor_backend_selector rbs, reactor_config cfg);
void create_thread(std::function<void ()> thread_loop);
+ unsigned adjust_max_networking_aio_io_control_blocks(unsigned network_iocbs);
public:
static unsigned count;
};
diff --git a/src/core/reactor.cc b/src/core/reactor.cc
index 2b6bd206..382733ae 100644
--- a/src/core/reactor.cc
+++ b/src/core/reactor.cc
@@ -54,6 +54,7 @@
#include <seastar/core/internal/buffer_allocator.hh>
#include <seastar/core/scheduling_specific.hh>
#include <seastar/util/log.hh>
+#include <seastar/util/read_first_line.hh>
#include "core/file-impl.hh"
#include "core/reactor_backend.hh"
#include "core/syscall_result.hh"
@@ -3713,6 +3714,30 @@ void smp::register_network_stacks() {
register_native_stack();
}
+unsigned smp::adjust_max_networking_aio_io_control_blocks(unsigned network_iocbs)
+{
+ static unsigned constexpr storage_iocbs = reactor::max_aio;
+ static unsigned constexpr preempt_iocbs = 2;
+
+ auto aio_max_nr = read_first_line_as<unsigned>("/proc/sys/fs/aio-max-nr");
+ auto aio_nr = read_first_line_as<unsigned>("/proc/sys/fs/aio-nr");
+ auto available_aio = aio_max_nr - aio_nr;
+ auto requested_aio_network = network_iocbs * smp::count;
+ auto requested_aio_other = (storage_iocbs + preempt_iocbs) * smp::count;
+ auto requested_aio = requested_aio_network + requested_aio_other;
+
+ if (available_aio < requested_aio) {
+ if (available_aio >= requested_aio_other + smp::count) { // at least one queue for each shard
+ network_iocbs = (available_aio - requested_aio_other) / smp::count;
+ seastar_logger.warn("max-networking-io-control-blocks adjusted to {} since requested size is too large. Please increase request capacity in /proc/sys/fs/aio-max-nr", network_iocbs);
+ } else {
+ seastar_logger.error("Failed to adjust max-networking-io-control-blocks, request capacity in /proc/sys/fs/aio-max-nr too small");
+ }
+ }
+
+ return network_iocbs;
+}
+
void smp::configure(boost::program_options::variables_map configuration, reactor_config reactor_cfg)
{
#ifndef SEASTAR_NO_EXCEPTION_HACK
@@ -3885,7 +3910,7 @@ void smp::configure(boost::program_options::variables_map configuration, reactor
memory::set_dump_memory_diagnostics_on_alloc_failure_kind(configuration["dump-memory-diagnostics-on-alloc-failure-kind"].as<std::string>());
}
- reactor_cfg.max_networking_aio_io_control_blocks = configuration["max-networking-io-control-blocks"].as<unsigned>();
+ reactor_cfg.max_networking_aio_io_control_blocks = adjust_max_networking_aio_io_control_blocks(configuration["max-networking-io-control-blocks"].as<unsigned>());
bool heapprof_enabled = configuration.count("heapprof");
if (heapprof_enabled) {
--
2.31.1