Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # encoding: utf-8
- """
- Profile system performance
- Created by Niall Kavanagh <ntk@restdevices.com> on 2/5/2015
- """
- from __future__ import print_function
- import argparse
- import time
- import datetime
- import re
- def profile_memory():
- profile = {}
- pattern = re.compile('^(.+):\s*(.+)$')
- with open('/proc/meminfo') as f:
- for line in f:
- match = pattern.match(line)
- if match:
- profile[match.group(1)] = match.group(2)
- return profile
- def profile_load():
- profile = {}
- pattern = re.compile('^(\S+)\s+(\S+)\s+(\S+)\s+')
- with open('/proc/loadavg') as f:
- for line in f:
- match = pattern.match(line)
- if match:
- profile['LoadAvg1'] = match.group(1)
- profile['LoadAvg5'] = match.group(2)
- profile['LoadAvg15'] = match.group(3)
- return profile
- def profile_processes():
- profile = {}
- # this pattern will not match lot of multi-field lines
- pattern = re.compile('^(\S+)\s+(\d+)$')
- with open('/proc/stat') as f:
- for line in f:
- match = pattern.match(line)
- if match:
- profile[match.group(1)] = match.group(2)
- return profile
- def profile_system(metrics):
- memory = profile_memory()
- load = profile_load()
- processes = profile_processes()
- profiles = [memory, load, processes]
- ts = time.time()
- profile = {
- 'Time': datetime.datetime.fromtimestamp(ts)
- .strftime('%Y-%m-%d %H:%M:%S')
- }
- for metric in metrics:
- for p in profiles:
- if metric in p:
- profile[metric] = p[metric]
- return profile
- def main():
- # default profile metrics TODO arg for this
- metrics = [
- 'Time',
- 'MemTotal',
- 'MemFree',
- 'LoadAvg1',
- 'procs_running',
- 'procs_blocked'
- ]
- # command line args
- parser = argparse.ArgumentParser(description='Profiles system performance \
- and outputs CSV.')
- parser.add_argument('--duration', default=60, type=int,
- help='number of seconds to profile for')
- parser.add_argument('--frequency', default=5, type=int,
- help='how often to sample')
- args = parser.parse_args()
- print(','.join(metrics))
- for i in range(0, args.duration/args.frequency):
- profile = profile_system(metrics)
- values = []
- for metric in metrics:
- values.append(profile[metric])
- print(','.join(values))
- time.sleep(args.frequency)
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement