Skip to content

Commit 0e5ea61

Browse files
committed
Soakclient: track user&sys CPU and max memory usage
1 parent 548eb0c commit 0e5ea61

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

tests/soak/soakclient.py

+41
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import logging
3838
import sys
3939
import traceback
40+
import resource
4041
import datadog
4142

4243

@@ -355,6 +356,9 @@ def __init__(self, topic, rate, conf):
355356
self.stats_cnt = {'producer': 0, 'consumer': 0}
356357
self.start_time = time.time()
357358

359+
self.last_rusage = None
360+
self.last_rusage_time = None
361+
358362
self.logger = logging.getLogger('soakclient')
359363
self.logger.setLevel(logging.DEBUG)
360364
handler = logging.StreamHandler()
@@ -430,6 +434,9 @@ def terminate(self):
430434
self.producer_thread.join()
431435
self.consumer_thread.join()
432436

437+
# Final resource usage
438+
soak.get_rusage()
439+
433440
def init_datadog(self, options):
434441
""" Initialize datadog agent """
435442
datadog.initialize(**options)
@@ -445,6 +452,36 @@ def dd_gauge(self, metric_name, val):
445452
""" Set datadog metric gauge to val """
446453
self.dd.gauge(self.DD_PFX + metric_name, val, host=self.hostname)
447454

455+
def calc_rusage_deltas(self, curr, prev, elapsed):
456+
""" Calculate deltas between previous and current resource usage """
457+
458+
# User CPU %
459+
user_cpu = ((curr.ru_utime - prev.ru_utime) / elapsed) * 100.0
460+
self.dd_gauge("cpu.user", user_cpu)
461+
462+
# System CPU %
463+
sys_cpu = ((curr.ru_stime - prev.ru_stime) / elapsed) * 100.0
464+
self.dd_gauge("cpu.system", sys_cpu)
465+
466+
# Max RSS memory (monotonic)
467+
max_rss = curr.ru_maxrss / 1024.0
468+
self.dd_gauge("memory.rss.max", max_rss)
469+
470+
self.logger.info("User CPU: {:.1f}%, System CPU: {:.1f}%, MaxRSS {:.3f}MiB".format(
471+
user_cpu, sys_cpu, max_rss))
472+
473+
def get_rusage(self):
474+
""" Get resource usage and calculate CPU load, etc """
475+
ru = resource.getrusage(resource.RUSAGE_SELF)
476+
now = time.time()
477+
478+
if self.last_rusage is not None:
479+
self.calc_rusage_deltas(ru, self.last_rusage,
480+
now - self.last_rusage_time)
481+
482+
self.last_rusage = ru
483+
self.last_rusage_time = now
484+
448485

449486
if __name__ == '__main__':
450487

@@ -486,10 +523,14 @@ def dd_gauge(self, metric_name, val):
486523
# Create SoakClient
487524
soak = SoakClient(args.topic, args.rate, conf)
488525

526+
# Get initial resource usage
527+
soak.get_rusage()
528+
489529
# Run until interrupted
490530
try:
491531
while soak.run:
492532
time.sleep(10)
533+
soak.get_rusage()
493534

494535
soak.logger.info("Soak client aborted")
495536

0 commit comments

Comments
 (0)