Skip to content

Commit a52f922

Browse files
committed
enable support to set max memory consumption (closes #32)
1 parent 1d9843a commit a52f922

2 files changed

Lines changed: 18 additions & 7 deletions

File tree

wfcommons/wfbench/bench.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def create_benchmark(self,
8080
cpu_work: Union[int, Dict[str, int]] = None,
8181
gpu_work: Union[int, Dict[str, int]] = None,
8282
data: Optional[Union[int, Dict[str, str]]] = None,
83+
mem: Optional[float] = None,
8384
lock_files_folder: Optional[pathlib.Path] = None,
8485
regenerate: Optional[bool] = True) -> pathlib.Path:
8586
"""Create a workflow benchmark.
@@ -92,6 +93,8 @@ def create_benchmark(self,
9293
:type cpu_work: Union[int, Dict[str, int]]
9394
:param data: Dictionary of input size files per workflow task type or total workflow data footprint (in MB).
9495
:type data: Optional[Union[int, Dict[str, str]]]
96+
:param mem: Maximum amount of memory consumption per task (in MB).
97+
:type mem: Optional[float]
9598
:param lock_files_folder:
9699
:type lock_files_folder: Optional[pathlib.Path]
97100
:param regenerate: Whether to regenerate the workflow tasks
@@ -150,6 +153,9 @@ def create_benchmark(self,
150153

151154
params.extend([f"--gpu-work {_gpu_work}"])
152155

156+
if mem:
157+
params.extend([f"--mem {mem}"])
158+
153159
task.runtime = 0
154160
task.files = []
155161
task.program = "wfbench.py"

wfcommons/wfbench/wfbench.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ def unlock_core(path_locked: pathlib.Path,
8787
def cpu_mem_benchmark(cpu_threads: Optional[int] = 5,
8888
mem_threads: Optional[int] = 5,
8989
cpu_work: Optional[int] = 100,
90-
core: Optional[int] = None) -> List:
90+
core: Optional[int] = None,
91+
total_mem: Optional[float] = None) -> List:
9192
"""
9293
Run cpu and memory benchmark.
9394
@@ -99,28 +100,30 @@ def cpu_mem_benchmark(cpu_threads: Optional[int] = 5,
99100
:type cpu_work: Optional[int]
100101
:param core:
101102
:type core: Optional[int]
103+
:param total_mem:
104+
:type total_mem: Optional[float]
102105
103106
:return:
104107
:rtype: List
105108
"""
106-
total_mem_bytes = 100.0 / os.cpu_count()
109+
total_mem = f"{total_mem}M" if total_mem else f"{100.0 / os.cpu_count()}%"
107110
cpu_work_per_thread = int(cpu_work / cpu_threads)
108111

109112
cpu_procs = []
110113
cpu_prog = [
111114
f"{this_dir.joinpath('cpu-benchmark')}", f"{cpu_work_per_thread}"]
112115
mem_prog = ["stress-ng", "--vm", f"{mem_threads}",
113-
"--vm-bytes", f"{total_mem_bytes}%", "--vm-keep"]
116+
"--vm-bytes", f"{total_mem}", "--vm-keep"]
114117

115118
for i in range(cpu_threads):
116119
cpu_proc = subprocess.Popen(cpu_prog)
117120
if core:
118121
os.sched_setaffinity(cpu_proc.pid, {core})
119122
cpu_procs.append(cpu_proc)
120123

121-
# mem_proc = subprocess.Popen(mem_prog)
122-
# if core:
123-
# os.sched_setaffinity(mem_proc.pid, {core})
124+
mem_proc = subprocess.Popen(mem_prog)
125+
if core:
126+
os.sched_setaffinity(mem_proc.pid, {core})
124127

125128
return cpu_procs
126129

@@ -144,6 +147,7 @@ def get_parser() -> argparse.ArgumentParser:
144147
help="Path to cores file.")
145148
parser.add_argument("--cpu-work", default=None, help="Amount of CPU work.")
146149
parser.add_argument("--gpu-work", default=None, help="Amount of GPU work.")
150+
parser.add_argument("--mem", default=None, help="Max amount (in MB) of memory consumption.")
147151
parser.add_argument("--out", help="output files name.")
148152
return parser
149153

@@ -199,7 +203,8 @@ def main():
199203
cpu_procs = cpu_mem_benchmark(cpu_threads=int(10 * args.percent_cpu),
200204
mem_threads=int(10 - 10 * args.percent_cpu),
201205
cpu_work=int(args.cpu_work),
202-
core=core)
206+
core=core,
207+
total_mem=args.mem)
203208
for proc in cpu_procs:
204209
proc.wait()
205210
mem_kill = subprocess.Popen(["killall", "stress-ng"])

0 commit comments

Comments
 (0)