Skip to content

Commit 3663e64

Browse files
committed
Soakclient: track user&sys CPU and max memory usage
1 parent 5c7936f commit 3663e64

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

tests/soak/soakclient.py

Lines changed: 41 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy