Rippled thread cpu usage
The cpu usage of xrp.ninja validator spikes every 2 hours. I always wonder what it is doing during the spikes. So I wrote a script to report the thead cpu usage to a statsd server.
I started statsd/graphite/grafana using https://github.com/ripple/rippledmon
Then I wrote this script:
#!/usr/bin/python3 import collections import itertools import os import re import statsd import subprocess import time HEADER = b'%CPU COMMAND' STATSD = 'XXX' PORT = 'YYY' PREFIX = 'rippled.threads' TOP = 'env HOME={0} top -b -n 1 -p $(pgrep rippled) -H'.format(os.getcwd()) def report(c, jobs): p = subprocess.run(TOP, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if p.returncode != 0: print(p.stderr) return m = collections.defaultdict(float) for line in itertools.dropwhile(lambda x: x != HEADER, p.stdout.splitlines()): if line == HEADER: continue usage, comm = line.decode().strip().split(' ', 1) if usage == '0.0': break comm = re.sub(r'(:|\s|#|\.)+', '_', comm) m[comm] += float(usage) if comm not in jobs: jobs.add(comm) m['sum'] = sum(m.values()) with c.pipeline() as pipe: for comm in jobs: if comm in m: pipe.gauge(comm, int(m[comm] + 0.5)) else: pipe.gauge(comm, 0) def main(): c = statsd.StatsClient(STATSD, PORT, prefix=PREFIX) jobs = {'sum'} while True: report(c, jobs) time.sleep(1) if __name__ == '__main__': main()
This script uses top command to report thread cpu usage. I created a toprc which only shows cpu usage and command name (thread name if -H is used) and put the toprc in a different directory than $HOME and run the script in that directory.
The result shows SHAMapStore is the culprit.
Comments