- name: crimson_alien_thread_cpu_cores
type: str
level: advanced
- desc: CPU cores on which alienstore threads will run
+ desc: CPU cores on which alienstore threads will run in cpuset(7) format
- name: seastore_segment_size
type: size
desc: Segment size to use for SegmentManager
#include <seastar/core/alien.hh>
#include <seastar/core/future-util.hh>
#include <seastar/core/reactor.hh>
+#include <seastar/core/resource.hh>
#include "common/ceph_context.h"
#include "global/global_context.h"
if (!store) {
ceph_abort_msgf("unsupported objectstore type: %s", type.c_str());
}
- std::vector<uint64_t> cpu_cores = _parse_cpu_cores();
+ auto cpu_cores = seastar::resource::parse_cpuset(
+ get_conf<std::string>("crimson_alien_thread_cpu_cores"));
// cores except the first "N_CORES_FOR_SEASTAR" ones will
// be used for alien threads scheduling:
// [0, N_CORES_FOR_SEASTAR) are reserved for seastar reactors
// [N_CORES_FOR_SEASTAR, ..] are assigned to alien threads.
- if (cpu_cores.empty()) {
+ if (!cpu_cores.has_value()) {
if (long nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);
nr_cpus > N_CORES_FOR_SEASTAR ) {
- for (int i = N_CORES_FOR_SEASTAR; i < nr_cpus; i++) {
- cpu_cores.push_back(i);
+ seastar::resource::cpuset cpuset;
+ for (unsigned i = N_CORES_FOR_SEASTAR; i < nr_cpus; i++) {
+ cpuset.insert(i);
}
+ cpu_cores = cpuset;
} else {
logger().error("{}: unable to get nproc: {}", __func__, errno);
}
});
}
-std::vector<uint64_t> AlienStore::_parse_cpu_cores()
-{
- std::vector<uint64_t> cpu_cores;
- auto cpu_string =
- get_conf<std::string>("crimson_alien_thread_cpu_cores");
-
- std::string token;
- std::istringstream token_stream(cpu_string);
- while (std::getline(token_stream, token, ',')) {
- std::istringstream cpu_stream(token);
- std::string cpu;
- std::getline(cpu_stream, cpu, '-');
- uint64_t start_cpu = std::stoull(cpu);
- std::getline(cpu_stream, cpu, '-');
- uint64_t end_cpu = std::stoull(cpu);
- for (uint64_t i = start_cpu; i < end_cpu; i++) {
- cpu_cores.push_back(i);
- }
- }
- return cpu_cores;
-}
-
}
std::unique_ptr<CephContext> cct;
mutable seastar::gate op_gate;
std::unordered_map<coll_t, CollectionRef> coll_map;
- std::vector<uint64_t> _parse_cpu_cores();
};
}
ThreadPool::ThreadPool(size_t n_threads,
size_t queue_sz,
- std::vector<uint64_t> cpus)
+ const std::optional<seastar::resource::cpuset>& cpus)
: n_threads(n_threads),
queue_size{round_up_to(queue_sz, seastar::smp::count)},
pending_queues(n_threads)
auto queue_max_wait = std::chrono::seconds(local_conf()->threadpool_empty_queue_max_wait);
for (size_t i = 0; i < n_threads; i++) {
threads.emplace_back([this, cpus, queue_max_wait, i] {
- if (!cpus.empty()) {
- pin(cpus);
+ if (cpus.has_value()) {
+ pin(*cpus);
}
block_sighup();
(void) pthread_setname_np(pthread_self(), "alien-store-tp");
}
}
-void ThreadPool::pin(const std::vector<uint64_t>& cpus)
+void ThreadPool::pin(const seastar::resource::cpuset& cpus)
{
cpu_set_t cs;
CPU_ZERO(&cs);
#include <seastar/core/future.hh>
#include <seastar/core/gate.hh>
#include <seastar/core/reactor.hh>
+#include <seastar/core/resource.hh>
#include <seastar/core/semaphore.hh>
#include <seastar/core/sharded.hh>
* @note each @c Task has its own crimson::thread::Condition, which possesses
* an fd, so we should keep the size of queue under a reasonable limit.
*/
- ThreadPool(size_t n_threads, size_t queue_sz, std::vector<uint64_t> cpus);
+ ThreadPool(size_t n_threads, size_t queue_sz, const std::optional<seastar::resource::cpuset>& cpus);
~ThreadPool();
seastar::future<> start();
seastar::future<> stop();
bool is_stopping() const {
return stopping.load(std::memory_order_relaxed);
}
- static void pin(const std::vector<uint64_t>& cpus);
+ static void pin(const seastar::resource::cpuset& cpus);
static void block_sighup();
seastar::semaphore& local_free_slots() {
return submit_queue.local().free_slots;
.then([conf_file_list] {
return local_conf().parse_config_files(conf_file_list);
}).then([] {
- return seastar::do_with(std::make_unique<crimson::os::ThreadPool>(2, 128, (std::vector<uint64_t>){0}),
+ return seastar::do_with(std::make_unique<crimson::os::ThreadPool>(2, 128, seastar::resource::cpuset{0}),
[](auto& tp) {
return tp->start().then([&tp] {
return test_accumulate(*tp);