feat(python.d/nvidia_smi): collect power state (#13580)
Ilya Mashchenko committed
Aug 28, 2022 at 00:00 UTC
5e31008d2d87958ee50d114247b80fe2e6f75cfd
1 file changed
+22
-3
collectors/python.d.plugin/nvidia_smi/nvidia_smi.chart.py
+22
-3
@@ -4,11 +4,10 @@
4
# Author: Ilya Mashchenko (ilyam8)
5
# User Memory Stat Author: Guido Scatena (scatenag)
6
7
-import subprocess
8
-import threading
7
import os
8
import pwd
11
-
9
+import subprocess
10
+import threading
11
import xml.etree.ElementTree as et
12
13
from bases.FrameworkServices.SimpleService import SimpleService
@@ -32,6 +31,7 @@ BAR_USAGE = 'bar1_mem_usage'
31
TEMPERATURE = 'temperature'
32
CLOCKS = 'clocks'
33
POWER = 'power'
34
+POWER_STATE = 'power_state'
35
PROCESSES_MEM = 'processes_mem'
36
USER_MEM = 'user_mem'
37
USER_NUM = 'user_num'
@@ -47,11 +47,15 @@ ORDER = [
47
TEMPERATURE,
48
CLOCKS,
49
POWER,
50
+ POWER_STATE,
51
PROCESSES_MEM,
52
USER_MEM,
53
USER_NUM,
54
]
55
56
+# https://docs.nvidia.com/gameworks/content/gameworkslibrary/coresdk/nvapi/group__gpupstate.html
57
+POWER_STATES = ['P' + str(i) for i in range(0, 16)]
58
+
59
60
def gpu_charts(gpu):
61
fam = gpu.full_name()
@@ -125,6 +129,10 @@ def gpu_charts(gpu):
129
['power_draw', 'power', 'absolute', 1, 100],
130
]
131
},
132
+ POWER_STATE: {
133
+ 'options': [None, 'Power State', 'state', fam, 'nvidia_smi.power_state', 'line'],
134
+ 'lines': [['power_state_' + v.lower(), v, 'absolute'] for v in POWER_STATES]
135
+ },
136
PROCESSES_MEM: {
137
'options': [None, 'Memory Used by Each Process', 'MiB', fam, 'nvidia_smi.processes_mem', 'stacked'],
138
'lines': []
@@ -382,6 +390,10 @@ class GPU:
390
def mem_clock(self):
391
return self.root.find('clocks').find('mem_clock').text.split()[0]
392
393
+ @handle_attr_error
394
+ def power_state(self):
395
+ return str(self.root.find('power_readings').find('power_state').text.split()[0])
396
+
397
@handle_value_error
398
@handle_attr_error
399
def power_draw(self):
@@ -426,6 +438,13 @@ class GPU:
438
'mem_clock': self.mem_clock(),
439
'power_draw': self.power_draw(),
440
}
441
+
442
+ for v in POWER_STATES:
443
+ data['power_state_' + v.lower()] = 0
444
+ p_state = self.power_state()
445
+ if p_state:
446
+ data['power_state_' + p_state.lower()] = 1
447
+
448
processes = self.processes() or []
449
users = set()
450
for p in processes: