seastar::smp::count is deduced from the cpuset provided.
from seastar/src/core/reactor:
```
if (smp_opts.smp) {
smp::count = smp_opts.smp.get_value();
} else {
smp::count = cpu_set.size();
}
```
Co-authored-by: Yingxin Cheng <yingxin.cheng@intel.com>
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
mon:
osd pool default crimson: true
osd:
- crimson seastar smp: 3
crimson osd obc lru size: 10
flavor: crimson
workunit:
conf:
osd:
osd shutdown pgref assert: true
+ crimson alien thread cpu cores: 6-7
+ osd.0:
+ crimson seastar cpu cores: 0-2
+ osd.1:
+ crimson seastar cpu cores: 3-5
+ osd.2:
+ crimson seastar cpu cores: 0-2
+ osd.3:
+ crimson seastar cpu cores: 3-5
global:
ms cluster mode: crc
ms service mode: crc
conf:
osd:
osd shutdown pgref assert: true
+ crimson alien thread cpu cores: 6-7
+ osd.0:
+ crimson seastar cpu cores: 0-2
+ osd.1:
+ crimson seastar cpu cores: 3-5
+ osd.2:
+ crimson seastar cpu cores: 0-2
+ osd.3:
+ crimson seastar cpu cores: 3-5
global:
ms cluster mode: crc
ms service mode: crc
conf:
osd:
osd shutdown pgref assert: true
+ crimson alien thread cpu cores: 6-7
+ osd.0:
+ crimson seastar cpu cores: 0-1
+ osd.1:
+ crimson seastar cpu cores: 2-3
+ osd.2:
+ crimson seastar cpu cores: 4-5
global:
ms cluster mode: crc
ms service mode: crc
conf:
osd:
osd min pg log entries: 5
+ crimson alien thread cpu cores: 6-7
+ osd.0:
+ crimson seastar cpu cores: 0-1
+ osd.1:
+ crimson seastar cpu cores: 2-3
+ osd.2:
+ crimson seastar cpu cores: 4-5
+ global:
- osd_backfill:
conf:
osd:
osd shutdown pgref assert: true
+ crimson alien thread cpu cores: 6-7
+ osd.0:
+ crimson seastar cpu cores: 0-2
+ osd.1:
+ crimson seastar cpu cores: 3-5
+ osd.2:
+ crimson seastar cpu cores: 0-2
+ osd.3:
+ crimson seastar cpu cores: 3-5
global:
ms cluster mode: crc
ms service mode: crc
default: 6
flags:
- startup
-- name: crimson_seastar_smp
- type: uint
+- name: crimson_seastar_cpu_cores
+ type: str
level: advanced
- desc: Number of seastar reactor threads to use for the osd
- default: 1
+ desc: CPU cores on which seastar reactor threads will run in cpuset(7) format, smp::count is deduced from this option
flags:
- startup
- name: crimson_alien_thread_cpu_cores
type: str
level: advanced
desc: CPU cores on which alienstore threads will run in cpuset(7) format
+ flags:
+ - startup
- name: seastore_segment_size
type: size
desc: Segment size to use for SegmentManager
get_conf<std::string>("crimson_alien_thread_cpu_cores"));
// crimson_alien_thread_cpu_cores are assigned to alien threads.
if (!cpu_cores.has_value()) {
- // no core isolation by default, cores [0, seastar::smp::count)
- // will be shared between both alien and seastar reactor threads.
- seastar::resource::cpuset cpuset;
- std::copy(boost::counting_iterator<unsigned>(0),
- boost::counting_iterator<unsigned>(seastar::smp::count - 1),
- std::inserter(cpuset, cpuset.end()));
- if (cpuset.empty()) {
- logger().error("{}: unable to get nproc: {}", __func__, errno);
- } else {
- cpu_cores = cpuset;
- }
+ // no core isolation by default, seastar_cpu_cores will be
+ // shared between both alien and seastar reactor threads.
+ cpu_cores = seastar::resource::parse_cpuset(
+ get_conf<std::string>("crimson_seastar_cpu_cores"));
+ ceph_assert(cpu_cores.has_value());
}
const auto num_threads =
get_conf<uint64_t>("crimson_alien_op_num_threads");
if (auto found = std::find_if(
std::begin(early_args),
std::end(early_args),
- [](auto* arg) { return "--smp"sv == arg; });
+ [](auto* arg) { return "--cpuset"sv == arg; });
found == std::end(early_args)) {
-
- // Set --smp based on crimson_seastar_smp config option
- ret.early_args.emplace_back("--smp");
-
- auto smp_config = local_conf().get_val<uint64_t>(
- "crimson_seastar_smp");
-
- ret.early_args.emplace_back(fmt::format("{}", smp_config));
- logger().info("get_early_config: set --smp {}", smp_config);
+ auto smp_config = crimson::common::get_conf<std::string>("crimson_seastar_cpu_cores");
+ if (!smp_config.empty()) {
+ // Set --cpuset based on crimson_seastar_cpu_cores config option
+ // --smp default is one per CPU
+ ret.early_args.emplace_back("--cpuset");
+ ret.early_args.emplace_back(smp_config);
+ logger().info("get_early_config: set --cpuset {}", smp_config);
+ } else {
+ logger().warn("get_early_config: no cpuset specified, falling back"
+ " to seastar's default of: all");
+ }
+ } else {
+ logger().error("get_early_config: --cpuset can be "
+ "set only using crimson_seastar_cpu_cores");
+ ceph_abort();
}
return 0;
});
seastar::future<> OSD::start()
{
LOG_PREFIX(OSD::start);
- INFO();
+ INFO("seastar::smp::count {}", seastar::smp::count);
startup_time = ceph::mono_clock::now();
ceph_assert(seastar::this_shard_id() == PRIMARY_CORE);
local osds_wait
for osd in `seq $start $end`
do
- local extra_seastar_args
if [ "$ceph_osd" == "crimson-osd" ]; then
bottom_cpu=$(( osd * crimson_smp ))
top_cpu=$(( bottom_cpu + crimson_smp - 1 ))
- # set a single CPU nodes for each osd
- extra_seastar_args="--cpuset $bottom_cpu-$top_cpu"
- if [ "$debug" -ne 0 ]; then
- extra_seastar_args+=" --debug"
- fi
- if [ "$trace" -ne 0 ]; then
- extra_seastar_args+=" --trace"
- fi
+ # set exclusive CPU nodes for each osd
+ echo "$CEPH_BIN/ceph -c $conf_fn config set osd.$osd crimson_seastar_cpu_cores $bottom_cpu-$top_cpu"
+ $CEPH_BIN/ceph -c $conf_fn config set "osd.$osd" crimson_seastar_cpu_cores "$bottom_cpu-$top_cpu"
fi
if [ "$new" -eq 1 -o $inc_osd_num -gt 0 ]; then
wconf <<EOF
fi
if [ "$ceph_osd" == "crimson-osd" ]; then
- $CEPH_BIN/ceph -c $conf_fn config set osd crimson_seastar_smp $crimson_smp
+ if [ "$debug" -ne 0 ]; then
+ extra_seastar_args=" --debug"
+ fi
+ if [ "$trace" -ne 0 ]; then
+ extra_seastar_args=" --trace"
+ fi
if [ "$(expr $(nproc) - 1)" -gt "$(($CEPH_NUM_OSD * crimson_smp))" ]; then
echo "crimson_alien_thread_cpu_cores:" $(($CEPH_NUM_OSD * crimson_smp))-"$(expr $(nproc) - 1)"
$CEPH_BIN/ceph -c $conf_fn config set osd crimson_alien_thread_cpu_cores $(($CEPH_NUM_OSD * crimson_smp))-"$(expr $(nproc) - 1)"