[libvirt] [PATCH v1 1/4] Introduce virDomain{Get,Set}Time APIs
Michal Privoznik
mprivozn at redhat.com
Fri Feb 14 16:44:42 UTC 2014
On 14.02.2014 16:39, Eric Blake wrote:
> On 02/14/2014 08:14 AM, Michal Privoznik wrote:
>> On 13.02.2014 19:51, Michal Privoznik wrote:
>>> These APIs allow users to get or set time in a domain, which may come
>>> handy if the domain has been resumed just recently and NTP is not
>>> configured or hasn't kicked in yet and the guest is running
>>> something time critical. In addition, NTP may refuse to re-set the clock
>>> if the skew is too big.
>>>
>
>>> + *
>>> + * This API tries to set guest time to the given value. The time
>>> + * should be in seconds, relative to the Epoch of 1970-01-01 in UTC.
>>
>> One question though. qemu-ga currently takes nanoseconds in its 'guest-set-time' and returns nanoseconds in 'guest-get-time'. I know nanoseconds are out of scope for libvirt. But aren't seconds too gross? Maybe we want something more finer - miliseconds perhaps. In my measurements I was unable to get below 6-7 miliseconds:
>
> We definitely need subsecond resolution. Maybe best is to mirror struct
> timespec, by providing 'long long seconds' and 'unsigned int nanos'.
> Even if nanos are too fine and precision is lost along the way, there's
> no need to artificially limit things for when performance gets faster in
> the future.
>
>>
>> for ((i=0; i<100; i++)) ; do virsh -t qemu-agent-command rhel7 '{"execute":"guest-ping"}' | grep Time; done | sort -n -t ':' -k 2
>> (Time: 7,590 ms)
>> (Time: 7,601 ms)
>> (Time: 7,635 ms)
>> (Time: 7,682 ms)
>>
>> (although to be fair, this involves domain lookup API too)
>
> Not to mention that your approach was spawning an app and connection per
> request, rather than reusing a connection within a single app.
Reconnecting is not counted in the timing:
if ((ctl->conn == NULL || disconnected) &&
!(cmd->def->flags & VSH_CMD_FLAG_NOCONNECT))
vshReconnect(ctl);
if (enable_timing)
GETTIMEOFDAY(&before);
if ((cmd->def->flags & VSH_CMD_FLAG_NOCONNECT) ||
vshConnectionUsability(ctl, ctl->conn)) {
ret = cmd->def->handler(ctl, cmd);
} else {
/* connection is not usable, return error */
ret = false;
}
if (enable_timing)
GETTIMEOFDAY(&after);
>
> And while I'm thinking about it, I would like to make sure that at least
> the virsh command has a way to both set an explicit time, as well as to
> request a sync to the host time without having to specify a timestamp
> (that is, a common use case will be to sync the guest to the time that
> the host is using, without having to first figure out the host time and
> type that into the virsh command line). But I'm not sure whether such
> convenience should be limited to virsh, or actually folded into the API
> via another flag. Remember, if it is virsh that does it, then the time
> being chosen is local to the host running virsh; whereas if a flag is
> used, then the time chosen will be on the hypervisor (which is different
> than the host running virsh if you use remote connection)
>
The patches I'm proposing have the virsh part. With them you can do both:
virsh domtime $dom --sync
virsh domtime $dom --now
virsh domtime $dom 1234567890
Where --now is taken from the host running virsh, not where libvirtd is
running. For --host-now (to take the $now from libvirtd) - my patches
don't implement this right now, but they certainly create environment
for it - just a new flag needs to be added.
Michal
More information about the libvir-list
mailing list