Получить использование виртуальной памяти VirtualBox через vboxapi
Итак, я работаю над приложением python, которое сообщает информацию о хосте, на котором работает VirtualBox, веб-серверу. Поэтому я использую vboxapi. Я могу отправить информацию о хосте с помощью следующего кода:
from vboxapi import VirtualBoxManager
mgr = VirtualBoxManager(None, None)
vbox = mgr.vbox
host = vbox.host
log['host'] = {
'processorCount': host.processorCount,
'processorCoreCount': host.processorCoreCount,
'processorOnlineCount': host.processorOnlineCount,
'processorOnlineCoreCount': host.processorOnlineCoreCount,
'memorySize': host.memorySize,
'memoryAvailable': host.memoryAvailable,
}
send_to_webserver(log)
То, что я хотел бы сделать, это отправить информацию о запущенных гостях, таких как использование ОЗУ и ЦП. Я могу получить максимально доступный объем оперативной памяти с machine.memorySize
, но не текущее использование. При просмотре документации по vboxapi это должно быть возможно с помощью PerformanceCollector, но я могу заставить это работать, а также не могу найти рабочий пример. Может кто-то помочь мне с этим?
Необходимые действия приведены на стр. 274 документации.
Ps. мой хост - машина с Windows, мои гости - Ubuntu 16.04.
1 ответ
Я понял это в конце концов. На всякий случай, если кто-то еще изучает это:
mgr = VirtualBoxManager(None, None)
vbox = mgr.vbox
# Enabling performance collection
perfomance_collector = self.vbox.performanceCollector
# Enable metrics (None = all metrics, None = all machines)
perfomance_collector.enableMetrics(None, None)
# Setup metrics (None = all metrics, None = all machines, 1 sample every second, keep up to 15 samples)
perfomance_collector.setupMetrics(None, None, 1, 15)
while True:
# get metrics
(values, names_out, objects_out, units, scales, sequence_numbers, indices, lengths) = perfomance_collector.queryMetricsData(None, None)
out = []
# process results
for i in range(0, len(names_out)):
scale = int(scales[i])
if scale != 1:
fmt = '%.2f%s'
else:
fmt = '%d %s'
out.append({
'name': str(names_out[i]),
'object': str(objects_out[i]),
'unit': str(units[i]),
'scale': scale,
'values': [int(values[j]) for j in range(int(indices[i]), int(indices[i]) + int(lengths[i]))],
'values_as_string': '[' + ', '.join([fmt % (int(values[j]) / scale, units[i]) for j in range(int(indices[i]), int(indices[i]) + int(lengths[i]))]) + ']'
})
# print something useful
for metric in out:
print(metric['name'], metric['values_as_string'])
time.sleep(5)