|  | virtio balloon memory statistics | 
|  | ================================ | 
|  |  | 
|  | The virtio balloon driver supports guest memory statistics reporting. These | 
|  | statistics are available to QEMU users as QOM (QEMU Object Model) device | 
|  | properties via a polling mechanism. | 
|  |  | 
|  | Before querying the available stats, clients first have to enable polling. | 
|  | This is done by writing a time interval value (in seconds) to the | 
|  | guest-stats-polling-interval property. This value can be: | 
|  |  | 
|  | > 0  enables polling in the specified interval. If polling is already | 
|  | enabled, the polling time interval is changed to the new value | 
|  |  | 
|  | 0    disables polling. Previous polled statistics are still valid and | 
|  | can be queried. | 
|  |  | 
|  | Once polling is enabled, the virtio-balloon device in QEMU will start | 
|  | polling the guest's balloon driver for new stats in the specified time | 
|  | interval. | 
|  |  | 
|  | To retrieve those stats, clients have to query the guest-stats property, | 
|  | which will return a dictionary containing: | 
|  |  | 
|  | o A key named 'stats', containing all available stats. If the guest | 
|  | doesn't support a particular stat, or if it couldn't be retrieved, | 
|  | its value will be -1. Currently, the following stats are supported: | 
|  |  | 
|  | - stat-swap-in | 
|  | - stat-swap-out | 
|  | - stat-major-faults | 
|  | - stat-minor-faults | 
|  | - stat-free-memory | 
|  | - stat-total-memory | 
|  |  | 
|  | o A key named last-update, which contains the last stats update | 
|  | timestamp in seconds. Since this timestamp is generated by the host, | 
|  | a buggy guest can't influence its value. The value is 0 if the guest | 
|  | has not updated the stats (yet). | 
|  |  | 
|  | It's also important to note the following: | 
|  |  | 
|  | - Previously polled statistics remain available even if the polling is | 
|  | later disabled | 
|  |  | 
|  | - As noted above, if a guest doesn't support a particular stat its value | 
|  | will always be -1. However, it's also possible that a guest temporarily | 
|  | couldn't update one or even all stats. If this happens, just wait for | 
|  | the next update | 
|  |  | 
|  | - Polling can be enabled even if the guest doesn't have stats support | 
|  | or the balloon driver wasn't loaded in the guest. If this is the case | 
|  | and stats are queried, last-update will be 0. | 
|  |  | 
|  | - The polling timer is only re-armed when the guest responds to the | 
|  | statistics request. This means that if a (buggy) guest doesn't ever | 
|  | respond to the request the timer will never be re-armed, which has | 
|  | the same effect as disabling polling | 
|  |  | 
|  | Here are a few examples. QEMU is started with '-balloon virtio', which | 
|  | generates '/machine/peripheral-anon/device[1]' as the QOM path for the | 
|  | balloon device. | 
|  |  | 
|  | Enable polling with 2 seconds interval: | 
|  |  | 
|  | { "execute": "qom-set", | 
|  | "arguments": { "path": "/machine/peripheral-anon/device[1]", | 
|  | "property": "guest-stats-polling-interval", "value": 2 } } | 
|  |  | 
|  | { "return": {} } | 
|  |  | 
|  | Change polling to 10 seconds: | 
|  |  | 
|  | { "execute": "qom-set", | 
|  | "arguments": { "path": "/machine/peripheral-anon/device[1]", | 
|  | "property": "guest-stats-polling-interval", "value": 10 } } | 
|  |  | 
|  | { "return": {} } | 
|  |  | 
|  | Get stats: | 
|  |  | 
|  | { "execute": "qom-get", | 
|  | "arguments": { "path": "/machine/peripheral-anon/device[1]", | 
|  | "property": "guest-stats" } } | 
|  | { | 
|  | "return": { | 
|  | "stats": { | 
|  | "stat-swap-out": 0, | 
|  | "stat-free-memory": 844943360, | 
|  | "stat-minor-faults": 219028, | 
|  | "stat-major-faults": 235, | 
|  | "stat-total-memory": 1044406272, | 
|  | "stat-swap-in": 0 | 
|  | }, | 
|  | "last-update": 1358529861 | 
|  | } | 
|  | } | 
|  |  | 
|  | Disable polling: | 
|  |  | 
|  | { "execute": "qom-set", | 
|  | "arguments": { "path": "/machine/peripheral-anon/device[1]", | 
|  | "property": "stats-polling-interval", "value": 0 } } | 
|  |  | 
|  | { "return": {} } |