Skip to content

Commit 440f727

Browse files
committed
Add core isolation and change cores distribution
1 parent 622719c commit 440f727

File tree

9 files changed

+329
-76
lines changed

9 files changed

+329
-76
lines changed

env_var

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
SIMPLY_BLOCK_COMMAND_NAME=sbcli-isolate
2+
SIMPLY_BLOCK_VERSION=1.0.6
3+
4+
SIMPLY_BLOCK_DOCKER_IMAGE=simplyblock/simplyblock:isolate
5+
DOCKER_USER=hamdysimplyblock

simplyblock_cli/cli.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ def __init__(self):
3131
# Add storage node
3232
sub_command = self.add_sub_command(subparser, "deploy", 'Deploy local services for remote ops (local run)')
3333
sub_command.add_argument("--ifname", help='Management interface name, default: eth0')
34+
sub_command.add_argument("--cpu-mask", help='SPDK app CPU mask, default is all cores found',
35+
dest='spdk_cpu_mask')
3436

3537
self.add_sub_command(subparser, "deploy-cleaner", 'clean local deploy (local run)')
3638

@@ -847,7 +849,13 @@ def run(self):
847849
sub_command = args_dict['storage-node']
848850

849851
if sub_command == "deploy":
850-
ret = storage_ops.deploy(args.ifname)
852+
spdk_cpu_mask = None
853+
if args.spdk_cpu_mask:
854+
if self.validate_cpu_mask(args.spdk_cpu_mask):
855+
spdk_cpu_mask = args.spdk_cpu_mask
856+
else:
857+
return f"Invalid cpu mask value: {args.spdk_cpu_mask}"
858+
ret = storage_ops.deploy(args.ifname, spdk_cpu_mask)
851859

852860
elif sub_command == "deploy-cleaner":
853861
ret = storage_ops.deploy_cleaner()

simplyblock_core/constants.py

+5
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ def get_from_env_var_file(name, default=None):
7272
SIMPLY_BLOCK_CLI_NAME = get_from_env_var_file(
7373
"SIMPLY_BLOCK_COMMAND_NAME", "sbcli")
7474
TASK_EXEC_INTERVAL_SEC = 10
75+
7576
TASK_EXEC_RETRY_COUNT = 8
7677
SIMPLY_BLOCK_SPDK_CORE_IMAGE = "simplyblock/spdk-core:v24.05-tag-latest"
7778

@@ -128,3 +129,7 @@ def get_from_env_var_file(name, default=None):
128129

129130
NVMF_MAX_SUBSYSTEMS=50000
130131
HA_JM_COUNT=3
132+
133+
JSON_CORES_FILE="/etc/simplyblock/cores_distribution.ini"
134+
TEMP_CORES_FILE = "/etc/simplyblock/tmp_cores_config"
135+

simplyblock_core/scripts/install_deps.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env bash
22

3-
sudo yum install -y yum-utils xorg-x11-xauth nvme-cli fio
3+
sudo yum install -y https://repo.almalinux.org/almalinux/9/devel/aarch64/os/Packages/tuned-profiles-realtime-2.24.0-1.el9.noarch.rpm
4+
sudo yum install -y yum-utils xorg-x11-xauth nvme-cli fio tuned
45
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
56
sudo yum install hostname pkg-config git wget python3-pip yum-utils docker-ce docker-ce-cli \
67
containerd.io docker-buildx-plugin docker-compose-plugin iptables -y

simplyblock_core/storage_node_ops.py

+25-31
Original file line numberDiff line numberDiff line change
@@ -992,43 +992,31 @@ def add_node(cluster_id, node_ip, iface_name, data_nics_list,
992992
pollers_mask = ""
993993
app_thread_mask = ""
994994
jm_cpu_mask = ""
995-
alceml_cpu_cores = []
996-
distrib_cpu_cores = []
997-
alceml_worker_cpu_cores = []
998-
999995
alceml_cpu_index = 0
1000996
alceml_worker_cpu_index = 0
1001997
distrib_cpu_index = 0
1002998
jc_singleton_mask = ""
1003999

1000+
cores_config= node_info["cores_config"]
1001+
spdk_cpu_mask = cores_config["cpu_mask"]
1002+
app_thread_core = cores_config["cores_distribution"]["app_thread_core"]
1003+
jm_cpu_core = cores_config["cores_distribution"]["jm_cpu_core"]
1004+
poller_cpu_cores = cores_config["cores_distribution"]["poller_cpu_cores"]
1005+
alceml_cpu_cores = cores_config["cores_distribution"]["alceml_cpu_cores"]
1006+
alceml_worker_cpu_cores = cores_config["cores_distribution"]["alceml_worker_cpu_cores"]
1007+
distrib_cpu_cores = cores_config["cores_distribution"]["distrib_cpu_cores"]
1008+
jc_singleton_core = cores_config["cores_distribution"]["jc_singleton_core"]
1009+
if is_secondary_node:
1010+
distrib_cpu_cores = distrib_cpu_cores + alceml_cpu_cores
10041011

1005-
poller_cpu_cores = []
1006-
1007-
if not spdk_cpu_mask:
1008-
spdk_cpu_mask = hex(int(math.pow(2, cpu_count))-2)
1009-
1010-
spdk_cores = utils.hexa_to_cpu_list(spdk_cpu_mask)
1011-
if cpu_count < spdk_cores[-1]:
1012-
print(f"ERROR: The cpu mask {spdk_cpu_mask} is greater than the total cpus on the system {cpu_count}")
1013-
return False
1014-
if spdk_cores[-1] >= 64:
1015-
print(f"ERROR: The provided cpu mask {spdk_cpu_mask} has values greater than 63, which is not allowed")
1016-
return False
1017-
if len(spdk_cores) >= 4:
1018-
app_thread_core, jm_cpu_core, poller_cpu_cores, alceml_cpu_cores, alceml_worker_cpu_cores, distrib_cpu_cores, jc_singleton_core = utils.calculate_core_allocation(
1019-
spdk_cores)
1020-
1021-
if is_secondary_node:
1022-
distrib_cpu_cores = distrib_cpu_cores+alceml_cpu_cores
1023-
1024-
pollers_mask = utils.generate_mask(poller_cpu_cores)
1012+
if jc_singleton_core:
1013+
jc_singleton_mask = utils.decimal_to_hex_power_of_2(jc_singleton_core[0])
1014+
if app_thread_core:
10251015
app_thread_mask = utils.generate_mask(app_thread_core)
1026-
if jc_singleton_core:
1027-
jc_singleton_mask = utils.decimal_to_hex_power_of_2(jc_singleton_core[0])
1028-
#spdk_cpu_mask = utils.generate_mask(spdk_cores)
1016+
if jm_cpu_core:
10291017
jm_cpu_mask = utils.generate_mask(jm_cpu_core)
1030-
#distrib_cpu_mask = utils.generate_mask(distrib_cpu_cores)
1031-
1018+
if poller_cpu_cores:
1019+
pollers_mask = utils.generate_mask(poller_cpu_cores)
10321020
# Calculate pool count
10331021
if cloud_instance['type']:
10341022
ins_type = cloud_instance['type']
@@ -2558,10 +2546,12 @@ def get_node_port_iostats(port_id, history=None, records_count=20):
25582546
return utils.print_table(out)
25592547

25602548

2561-
def deploy(ifname):
2549+
def deploy(ifname, spdk_cpu_mask):
25622550
if not ifname:
25632551
ifname = "eth0"
2564-
2552+
cpu_count = os.cpu_count()
2553+
if not spdk_cpu_mask:
2554+
spdk_cpu_mask = hex(int(math.pow(2, cpu_count))-2)
25652555
dev_ip = utils.get_iface_ip(ifname)
25662556
if not dev_ip:
25672557
logger.error(f"Error getting interface ip: {ifname}")
@@ -2579,6 +2569,10 @@ def deploy(ifname):
25792569
ret = scripts.configure_docker(dev_ip)
25802570

25812571
start_storage_node_api_container(dev_ip)
2572+
isolated_full = utils.prepare_cores(spdk_cpu_mask)
2573+
if isolated_full:
2574+
utils.generate_realtime_variables_file(isolated_full)
2575+
utils.run_tuned()
25822576
return f"{dev_ip}:5000"
25832577

25842578
def start_storage_node_api_container(node_ip):

0 commit comments

Comments
 (0)