-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnstat-c.py
80 lines (73 loc) · 2.81 KB
/
nstat-c.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import argparse
import json
import logging
import time
import gpustat
import psutil
import requests
import yaml
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('config')
args = parser.parse_args()
with open(args.config) as f:
CFG = yaml.load(f, yaml.SafeLoader)
while True:
body = {
'name': CFG['CLIENT']['NAME'],
'users': [{
'index': i,
'name': user.name,
} for i, user in enumerate(psutil.users())],
'cpu': {
'ncore': psutil.cpu_count(logical=False),
'percent': psutil.cpu_percent(),
},
'memory': {
'used': psutil.virtual_memory().used,
'total': psutil.virtual_memory().total,
'percent': psutil.virtual_memory().percent,
},
'gpus': [{
'index': gpu['index'],
'name': gpu['name'],
'temperature': gpu['temperature.gpu'],
'fan': gpu['fan.speed'],
'utilization': gpu['utilization.gpu'],
'power': gpu['power.draw'],
'memory': {
'used': gpu['memory.used'],
'total': gpu['memory.total'],
},
'processes': [{
'username': process['username'],
'command': ' '.join(process['full_command']),
'usage': process['gpu_memory_usage'],
'pid': process['pid'],
} for process in filter(
lambda process: process['gpu_memory_usage'] is not None and process['gpu_memory_usage'] > gpu['memory.total'] * CFG['CLIENT']['PROCESS_GPU_MEMORY_USAGE_THRESHOLD'],
gpu['processes'])],
} for gpu in gpustat.GPUStatCollection.new_query().gpus],
'disks': [{
'name': disk.device,
'filesystem': disk.fstype,
'used': psutil.disk_usage(disk.mountpoint).used,
'total': psutil.disk_usage(disk.mountpoint).total,
'percent': psutil.disk_usage(disk.mountpoint).percent,
} for disk in psutil.disk_partitions()],
}
content = json.dumps(body, sort_keys=True, indent=2)
print(content)
data = content.encode('utf-8')
try:
r = requests.request(
method='POST',
url='http://%s:%d' % (CFG['SERVER']['ADDRESS'], CFG['SERVER']['PORT']),
data=data,
headers={
'Content-Type': 'application/json',
})
logging.info(r.status_code)
except requests.RequestException as e:
logging.error(e)
time.sleep(CFG['CLIENT']['INTERVAL'])