[libvirt] [RFC][scale] new API for querying domains stats

Li Wei lw at cn.fujitsu.com
Tue Aug 5 05:46:30 UTC 2014



On 08/05/2014 01:36 PM, Li Wei wrote:
> Hi Richard,
> 
> Thanks for your comment!
> 
> On 08/04/2014 04:39 PM, Richard W.M. Jones wrote:
>> On Mon, Aug 04, 2014 at 11:38:41AM +0800, Li Wei wrote:
>>> Hi,
>>>
>>> On 07/22/2014 03:25 PM, Richard W.M. Jones wrote:
>>>>
>>>> Did anything come of this discussion, and/or is someone working on this?
>>>
>>> I am working on an API to query block stats in a bulk style and proposed an
>>> API as follow:
>>>
>>> virDomainBlockStatsBulkFlags(virDomainPtr dom,
>>> 			     virTypedParameterPtr params,
>>> 			     int nparams,
>>> 			     int ndisks,
>>> 			     unsigned int flags)
>>>
>>> @dom: pointer to domain object
>>> @params: an array of typed param to be populated with block stats
>>> @nparams: how many params used for each block device
>>> @ndisks: how many block devices to query
>>> @flags: flags to filter block devices (not used for now)
>>>
>>> Returns -1 in case of error, 0 in case of success.
>>> with params == NULL, nparams == -1, ndisks == 1, return number of params for each block device.
>>> with params == NULL, nparams == -1, ndisks == -1, return number of disks in the domain.
>>>
>>> A typical usage of this API should be:
>>> nparams = virDomainBlockStatsBulkFlags(dom, NULL, -1, 1, 0);
>>> ndisks = virDomainBlockStatsBulkFlags(dom, NULL, -1, -1, 0);
>>>
>>> params = VIR_ALLOC_N(params, nparams * ndisks);
>>>
>>> ret = virDomainBlockStatsBulkFlags(dom, params, nparams, ndisks, 0);
>>>
>>> ... do something with params
>>>
>>> VIR_FREE(params);
>>>
>>> With this bulk API, virt-top can updates in a short interval for a domain with a lot of disks.
>>> Any comments?
>>
>> I think this works OK for the case where you have 1 domains with
>> lots of disks.
>>
>> However if you have a large number of domains each with 1 or 2
>> disks I think you would have the same problem as currently.
> 
> Yes, it is.
> 
>>
>> Is it possible to design an API that can work across all domains
>> in a single call?
> 
> How about the following API:
> 
> int virConnectGetAllBlockStats(virConnectPtr conn,
> 				virDomainPtr domain,
> 				virDomainBlockBulkStatsPtr *stats,
> 				unsigned int flags);
> @conn: pointer to libvirt connection
> @domain: pointer to the domain to be queried, NULL for all domains
> @stats: array of virDomainBlockBulkStats struct(see below) to be populated
> @flags: filter flags

Because block stats only valid for active domains, may be this filter flag
can be remove.

Thanks.

> Return the number of virDomainBlockBulkStats populated.
> 
> where virDomainBlockBulkStats defined as:
> 
> struct _virDomainBlockBulkStats {
>     virDomainPtr domain;	 /* domain the block stats belongs to */
>     virTypedParameterPtr params; /* params to store block stats */
>     unsigned int nparams;	 /* how many params used for each block stats */
>     unsigned int ndisks;	 /* how many block stats in this domain */
> };
> 
> Note:
> 1. because the API allocate memory to store stats, the caller need to free it after use.
> 2. to distinguish each block stats in a domain, we need use a param to store block device name.
> 
>>
>>> PS:
>>> It seems we need a bunch of bulk APIs to query stats, I wonder if I can submit a patchset for each
>>> bulk API or must supply all the bulk APIs in one patchset?
>>
>> Whichever is easiest to review.  I suspect that smaller patches, each
>> containing a single new API, will be simpler to review, but that's
>> just my opinion.
> 
> I prefer this way also.
> 
> Thanks,
> Li Wei
> 
>>
>> Rich.
>>
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> .
> 




More information about the libvir-list mailing list