@cryptotaxi247 / netdata-1 / commits / 5e31008d2

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: