swirl
Home Software Blog Wallpapers Webtools
Collect CPU and memory statistics for multiple process easily
Sunday 07, July 2024   |   Post link

Overview

This blog post discusses collecting process level CPU and memory statistics. This one is going to be quick - here is a tiny Python script which collects process level CPU and memory stats and outputs it on console or to a specified file.

Using the script

Pre-requisites

  1. Python3
  2. Tested on both Windows and Linux
  3. Install psutil Python library

Install psutil

pip3 install psutil

Using the script

Syntax:
To view detailed help:
	python3 collect --help
To collect process metrics:
	python3 <list of process-names> <collection-interval-sec> <output-filepath>

Suppose I want to monitor the CPU and memory consumption of the firefox.exe process every 5 seconds at the console, I can invoke the script as:

python3 collect firefox,edge 5

I can also provide a file where the same information will be written:

python3 collect firefox,edge 5 metrics.log
You could of course redirect the console output to a file instead of specifiying a file as a parameter.

The code

# Author        : Siddharth Barman
# Date          : 2-JULY-2024
# Description   : Program to collect process statistics into a file or console. 

import psutil as ps
import sys, time

ARG_PROCESS_LIST = 1
ARG_INTERVAL_SEC = 2
ARG_OUTPUT_FILE  = 3

def default():
	print("Collect process metrics.")
	print("Syntax:")
	print("To view detailed help: run python3 collect --help")

def help():
	print("Collect process metrics.")
	print("Syntax:")
	print("To view detailed help:")
	print("  python3 collect --help")
	print("To collect process metrics: ")
	print("  python3 <list of process-names> <collection-interval-sec> <output-filepath>")
	print("  python3 collect firefox,edge 5 ./logs/metrics.log")

def print_or_write(file_handle, string):
	if file_handle == None:
		print(string)
	else:
		file_handle.write(string)
		file_handle.write("\n")

def is_process_in_list(process_name, process_name_list):
	process_name = process_name.lower()
	for pname in process_name_list:
		proc_name = pname.lower()        
		if process_name == proc_name:
			return True
	return False

def collect(process_names, interval_seconds, output_filepath):    
	if output_filepath != None:
		f = open(output_filepath, 'w')
	else:
		f = None

	try:
		process_info = {}
		while True:
			for pid in ps.pids():
				try:
					p = ps.Process(pid)
					if is_process_in_list(p.name(), process_names):                        
						line = "pid={0}, name={1}, CPU={2}, Mem={3}, args={4}".format(pid, p.name(), p.cpu_percent(interval=1) / ps.cpu_count(), 
																						p.memory_full_info().uss,  p.cmdline()[0])
						print_or_write(f, line)
				except:                
					pass            
			time.sleep(interval_seconds)            
	except KeyboardInterrupt as k:
		if output_filepath != None:
			f.close()
	except:        
		if output_filepath != None:
			f.close()
		raise

def main():
	if len(sys.argv) == 1:
		default()
		exit()

	if (sys.argv[1] == "--help"):
		help()
		exit()

	process_names = sys.argv[ARG_PROCESS_LIST].split(",")
	interval_seconds = int(sys.argv[ARG_INTERVAL_SEC])    
	output_filepath = None
	if len(sys.argv) > 3:
		output_filepath = sys.argv[ARG_OUTPUT_FILE]
	
	collect(process_names, interval_seconds, output_filepath)

main()

There are a number of additional features I think this script could have like - monitoring a set of PIDs instead of having to provide a process name. If you have other ideas, I would be interested to know about them. That's all for now, have a great day!



Categories: Python (1) Testing (1)

Comments

Posts By Year

2024 (4)
2023 (5)
2022 (10)
2021 (5)
2020 (12)
2019 (6)
2018 (8)
2017 (11)
2016 (6)
2015 (17)
2014 (2)
2013 (4)
2012 (2)

Posts By Category

.NET (4)
.NET Core (2)
ASP.NET MVC (4)
AWS (5)
AWS API Gateway (1)
Android (1)
Apache Camel (1)
Architecture (1)
Audio (1)
Azure (2)
Book review (3)
Business (1)
C# (3)
C++ (2)
CloudHSM (1)
Containers (4)
Corporate culture (1)
Database (3)
Database migration (1)
Desktop (1)
Docker (1)
DotNet (3)
DotNet Core (2)
ElasticSearch (1)
Entity Framework (3)
Git (3)
IIS (1)
JDBC (1)
Java (10)
Kibana (1)
Kubernetes (1)
Lambda (1)
Learning (1)
Life (7)
Linux (2)
Lucene (1)
Multi-threading (1)
Music (1)
OData (1)
Office (1)
PHP (1)
Photography (1)
PowerShell (2)
Programming (28)
Python (1)
Rants (5)
SQL (2)
SQL Server (1)
Security (3)
Software (1)
Software Engineering (1)
Software development (2)
Solr (1)
Sql Server (2)
Storage (1)
T-SQL (1)
TDD (1)
TSQL (5)
Tablet (1)
Technology (1)
Test Driven (1)
Testing (1)
Tomcat (1)
Unit Testing (1)
Unit Tests (1)
Utilities (3)
VC++ (1)
VMWare (1)
VSCode (1)
Visual Studio (2)
Wallpapers (1)
Web API (2)
Win32 (1)
Windows (9)
XML (2)

Posts By Tags

.NET(6) API Gateway(1) ASP.NET(4) AWS(3) Adults(1) Advertising(1) Android(1) Anti-forgery(1) Asynch(1) Authentication(2) Azure(2) Backup(1) Beliefs(1) BlockingQueue(1) Book review(2) Books(1) Busy(1) C#(4) C++(3) CLR(1) CORS(1) CSRF(1) CTE(1) Callbacks(1) Camel(1) Certificates(1) Checkbox(1) Client authentication(1) CloudHSM(1) Cmdlet(1) Company culture(1) Complexity(1) Consumer(1) Consumerism(1) Containers(3) Core(2) Custom(2) DPI(1) Data-time(1) Database(4) Debugging(1) Delegates(1) Developer(2) Dockers(2) DotNetCore(3) EF 1.0(1) Earphones(1) Elastic Search(2) ElasticSearch(1) Encrypted(1) Entity framework(1) Events(1) File copy(1) File history(1) Font(1) Git(2) HierarchyID(1) Hyper-V(1) IIS(1) Installing(1) Intelli J(1) JDBC(1) JSON(1) JUnit(1) JWT(1) Java(3) JavaScript(1) Kubernetes(1) Life(1) LinkedIn(1) Linux(2) Localization(1) Log4J(1) Log4J2(1) Logging(1) Lucene(1) MVC(4) Management(2) Migration history(1) Mirror(1) Mobile Apps(1) Modern Life(1) Money(1) Music(1) NGINX(1) NTFS(1) NUnit(2) OData(1) OPENXML(1) Objects(1) Office(1) OpenCover(1) Organization(1) PHP(1) Paths(1) PowerShell(2) Processes(1) Producer(1) Programming(2) Python(2) QAAC(1) Quality(1) REDIS(2) REST(1) Runtimes(1) S3-Select(1) SD card(1) SLF4J(1) SQL(2) SQL Code-first Migration(1) SSH(2) SSL(1) Sattelite assemblies(1) School(1) Secrets Manager(1) Self reliance(1) Service(1) Shell(1) Solr(1) Sony VAIO(1) Spirituality(1) Spring(1) Sql Express(1) System Image(1) TDD(1) TSQL(3) Table variables(1) Tables(1) Tablet(1) Ubuntu(1) Url rewrite(1) VMWare(1) VSCode(1) Validation(2) VeraCode(1) Wallpaper(1) Wallpapers(1) Web Development(4) Windows(2) Windows 10(2) Windows 2016(2) Windows 8.1(1) Work culture(1) XML(1) Yii(1) iTunes(1) open file handles(1) renew(1) security(1) static ip address(1) ulimit(1)