Skip to content

Commit 62a90d0

Browse files
authored
Merge pull request ceph#62937 from gbregman/main
mgr/cephadm/nvmeof: Allow setting NVMEoF gateway huge pages count in the spec file
2 parents 18b9d7f + bf1df04 commit 62a90d0

File tree

5 files changed

+58
-5
lines changed

5 files changed

+58
-5
lines changed

src/cephadm/cephadmlib/daemons/nvmeof.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,30 @@ def configfs_mount_umount(data_dir, mount=True):
211211
return cmd.split()
212212

213213
def get_sysctl_settings(self) -> List[str]:
214-
if 'spdk_mem_size' not in self.files:
215-
return [
216-
'vm.nr_hugepages = 4096',
217-
]
218-
else:
214+
if 'spdk_mem_size' in self.files:
219215
return []
220216

217+
if 'spdk_huge_pages' in self.files:
218+
try:
219+
val = self.files['spdk_huge_pages']
220+
huge_pages_value = int(val)
221+
logger.debug(
222+
f'Found SPDK huge pages value {huge_pages_value}'
223+
)
224+
return [
225+
f'vm.nr_hugepages = {huge_pages_value}',
226+
]
227+
except KeyError:
228+
logger.exception('Failure getting SPDK huge pages value')
229+
except ValueError:
230+
logger.error(
231+
f'Invalid SPDK huge pages value {self.files[val]}'
232+
)
233+
234+
return [
235+
'vm.nr_hugepages = 4096',
236+
]
237+
221238
def container(self, ctx: CephadmContext) -> CephContainer:
222239
ctr = daemon_to_container(ctx, self)
223240
return to_deployment_container(ctx, ctr)
@@ -239,3 +256,11 @@ def customize_container_args(
239256
args.extend(['--cap-add=CAP_SYS_NICE'])
240257
if 'spdk_mem_size' not in self.files:
241258
args.extend(['--cap-add=SYS_ADMIN'])
259+
if 'spdk_huge_pages' in self.files:
260+
try:
261+
huge_pages_value = int(self.files['spdk_huge_pages'])
262+
args.extend(['-e', f'HUGEPAGES={huge_pages_value}'])
263+
except KeyError:
264+
pass
265+
except ValueError:
266+
pass

src/cephadm/cephadmlib/sysctl.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ def _write(conf: Path, lines: List[str]) -> None:
3939
daemon_type = daemon.identity.daemon_type
4040
conf = Path(ctx.sysctl_dir).joinpath(f'90-ceph-{fsid}-{daemon_type}.conf')
4141

42+
for conf_file in Path(ctx.sysctl_dir).glob('90-ceph-*.conf'):
43+
if conf_file.name == f'90-ceph-{fsid}-{daemon_type}.conf':
44+
continue
45+
logger.warning(
46+
f'Found a sysctl config file for a cluster with a different FSID '
47+
f'({str(conf_file)}).\nThis might obstruct the setting of new values. '
48+
f'Consider deleting the file.'
49+
)
50+
4251
lines = daemon.get_sysctl_settings()
4352
lines = filter_sysctl_settings(ctx, lines)
4453

src/pybind/mgr/cephadm/services/nvmeof.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonD
8686
# Indicate to the daemon whether to utilize huge pages
8787
if spec.spdk_mem_size:
8888
daemon_spec.extra_files['spdk_mem_size'] = str(spec.spdk_mem_size)
89+
elif spec.spdk_huge_pages:
90+
try:
91+
huge_pages_value = int(spec.spdk_huge_pages)
92+
daemon_spec.extra_files['spdk_huge_pages'] = str(huge_pages_value)
93+
except ValueError:
94+
logger.error(f"Invalid value for SPDK huge pages: {spec.spdk_huge_pages}")
8995

9096
if spec.enable_auth:
9197
if (

src/pybind/mgr/cephadm/templates/services/nvmeof/ceph-nvmeof.conf.j2

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ log_file_dir = {{ spec.spdk_log_file_dir }}
9595
conn_retries = {{ spec.conn_retries }}
9696
{% if spec.spdk_mem_size %}
9797
mem_size = {{ spec.spdk_mem_size }}
98+
{% else %}
99+
{% if spec.spdk_huge_pages %}
100+
spdk_huge_pages = {{ spec.spdk_huge_pages }}
101+
{% endif %}
98102
{% endif %}
99103
transports = {{ spec.transports }}
100104
{% if transport_tcp_options %}

src/python-common/ceph/deployment/service_spec.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,6 +1417,7 @@ def __init__(self,
14171417
# unused and duplicate of tgt_path below, consider removing
14181418
spdk_path: Optional[str] = None,
14191419
spdk_mem_size: Optional[int] = None,
1420+
spdk_huge_pages: Optional[int] = None,
14201421
tgt_path: Optional[str] = None,
14211422
spdk_timeout: Optional[float] = 60.0,
14221423
spdk_log_level: Optional[str] = '',
@@ -1568,6 +1569,8 @@ def __init__(self,
15681569
self.spdk_path = spdk_path or '/usr/local/bin/nvmf_tgt'
15691570
#: ``spdk_mem_size`` memory size in MB for DPDK
15701571
self.spdk_mem_size = spdk_mem_size
1572+
#: ``spdk_huge_pages`` huge pages count to be be used by SPDK
1573+
self.spdk_huge_pages = spdk_huge_pages
15711574
#: ``tgt_path`` nvmeof target path
15721575
self.tgt_path = tgt_path or '/usr/local/bin/nvmf_tgt'
15731576
#: ``spdk_timeout`` SPDK connectivity timeout
@@ -1744,6 +1747,12 @@ def validate(self) -> None:
17441747
verify_boolean(self.log_files_rotation_enabled, "Log files rotation enabled")
17451748
verify_boolean(self.verbose_log_messages, "Verbose log messages")
17461749
verify_boolean(self.enable_monitor_client, "Enable monitor client")
1750+
verify_positive_int(self.spdk_mem_size, "SPDK memory size")
1751+
verify_positive_int(self.spdk_huge_pages, "SPDK huge pages count")
1752+
if self.spdk_mem_size and self.spdk_huge_pages:
1753+
raise SpecValidationError(
1754+
'"spdk_mem_size" and "spdk_huge_pages" are mutually exclusive'
1755+
)
17471756

17481757

17491758
yaml.add_representer(NvmeofServiceSpec, ServiceSpec.yaml_representer)

0 commit comments

Comments
 (0)