Отримайте використання оперативної пам’яті VirtualBox VM через vboxapi


0

Отже, я працюю над додатком 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 документа.

Пс. мій хост - це машина Windows, мої гості - Ubuntu 16.04.

Відповіді:


0

Я зрозумів це врешті-решт. Про всяк випадок, якщо хтось інший розбирається в цьому:

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)

Як запустити цей сценарій? Просто py <filename>чи таке?
Френк Нокк

Це частина більшої програми, але якщо ви поєднаєте код мого запитання та відповіді, я думаю, він повинен працювати.
Джорен Інгелбрехт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.