On 10/11/18 8:02 AM, Wang, Huaqiang wrote:
> Answers refined.
>
> On 10/11/2018 3:14 AM, John Ferlan wrote:
>>
>> On 10/9/18 6:30 AM, Wang Huaqiang wrote:
>>> In resctrl file system, more than one monitoring groups
>>> could be created within one allocation group, along with
>>> the creation of allocation group, a monitoring group is
>>> created at the same, which monitors the resource
>>> utilization information of whole allocation group.
>>>
>>> This patch is introducing the concept of default monitor,
>>> which represents the particular monitoring group that
>>> created along with the creation of allocation group.
>>>
>>> Default monitor shares the common 'vcpu' list with the
>>> allocation.
>>>
>>> Signed-off-by: Wang Huaqiang <[email protected]>
>>> ---
>>> src/libvirt_private.syms | 1 +
>>> src/util/virresctrl.c | 23 +++++++++++++++++++++++
>>> src/util/virresctrl.h | 2 ++
>>> 3 files changed, 26 insertions(+)
>>>
I assume the two responses to my review are very similar, but I'll use
this second one since it's timewise later...
>>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>>> index c93d19f..4b22ed4 100644
>>> --- a/src/libvirt_private.syms
>>> +++ b/src/libvirt_private.syms
>>> @@ -2689,6 +2689,7 @@ virResctrlMonitorGetID;
>>> virResctrlMonitorNew;
>>> virResctrlMonitorRemove;
>>> virResctrlMonitorSetCacheLevel;
>>> +virResctrlMonitorSetDefault;
>>> virResctrlMonitorSetID;
>>>
[...]
>>> + * a monitoring group is created at the same, which monitors the resource
>>> + * utilization information of whole allocation group.
>> Reword - it's a bit redundant
>
> Rewording like these:
>
> * There are two type of monitors, the default monitor and the non-default
> * monitor. Within one allocation, up to one default monitor and more than
> * one non-default monitors could be created.
> *
> * The flag 'default_monitor' defined in structure virResctrlMonitor denotes
> * if a monitor is the default one or not.
>
Starting with "Within one allocation,..." - doesn't make much sense to
me as a reader, sorry.
>>> + * A virResctrlMonitor with @default_monitor marked as 'true' is
>>> representing
>>> + * the monitoring group created along with the creation of allocation
>>> group.
>> Well I'm a bit lost, but let's see what happens. I'm not sure what
>> you're trying to delineate here. There is the creation of an
>> resctrl->alloc when a <monitor> is found by no <cachetune> is found.
>> Thus, we create an empty <cachetune> (one with no <cache> elements). To
>> me that's a default environment.
>>
>> I assume a similar paradigm could exist if there was or wasn't a
>> <memorytune> element...
>
> Make you confused, my bad. I was trying to introducing the situation of
> '/sys/fs/resctrl' filesystem and what I was done here at the same time.
>
> Regarding the XML layout for default monitor, following XML lines represents
> a default monitor, the key rule is the default monitor's <monitor> entry has
> the same 'vcpus' setting as <cachetune>.
>
> <cachetune vcpus='0-1'>
> <monitor level='3' vcpus='0-1'/>
> </cachetune>
>
> and following example illustrates a <cachetune> with two monitors, one of
> them is a default monitor
> <cachetune vcpus='0-1'>
> <monitor level='3' vcpus='0-1'/>
This gets tagged as a default monitor just because the vcpus match?
> <monitor level='3' vcpus='0'/>
and this is not a default monitor because the vcpus don't match
> </cachetune>
>
> Particularly, following XML layout doesn't define any monitor or allocation.
> Following XML lines does not have any effect, and does not indicate an
> error.
>
> <cachetune vcpus='0-1'/>
>
> or
>
> <cachetune vcpus='0-1'>
> </cachetune>
>
I understand that, but that wasn't my point. If someone modified their
XML and added just that, then add the resctrl->alloc as soon as you see
it. Then when you see a <cache>, that gets added to some cache list.
When you see a <monitor> that gets added to some monitor list.
The whole concept of calling some a default something just isn't working
for me. It's a cache or monitor for either all or some subset of the
vcpus for the cachetune (or resctrl->alloc). Nothing more, nothing less.
>>> */
>>> struct _virResctrlMonitor {
>>> virObject parent;
>>> @@ -355,6 +362,8 @@ struct _virResctrlMonitor {
>>> /* libvirt-generated path in /sys/fs/resctrl for this particular
>>> * monitor */
>>> char *path;
>>> + /* Boolean flag for default monitor */
>>> + bool default_monitor;
>>> /* The cache 'level', special for cache monitor */
>>> unsigned int cache_level;
>>> };
>>> @@ -2499,6 +2508,13 @@ virResctrlMonitorDeterminePath(virResctrlMonitorPtr
>>> monitor,
>>> return -1;
>>> }
>>>
>>> + if (monitor->default_monitor) {
>>> + if (VIR_STRDUP(monitor->path, monitor->alloc->path) < 0)
>> See check below ... at this point monitor->alloc could be NULL and won't
>> make this STRDUP very happy.
>
> Thanks for catching my bug. I did not run the code on my machine with default
> monitor, because I have trouble in run libvirt with CAT, creating non-default
> resctrl allocation. I am working on it, and will more tests for monitor.
>
> Using following code to fix it: (also changed next lines....)
>
> if (monitor->alloc)
> alloc_path = monitor->alloc->path;
> else
> alloc_path = SYSFS_RESCTRL_PATH;
>
> if (monitor->default_monitor) {
> if (VIR_STRDUP(monitor->path, alloc_path) < 0)
>
> return -1;
>
> return 0;
> }
>
>>
>>> + return -1;
>>> +
>>> + return 0;
>>> + }
>>> +
>>> if (monitor->alloc)
>>> alloc_path = monitor->alloc->path;
>>> else
>>> @@ -2739,3 +2755,10 @@
>>> virResctrlMonitorGetCacheOccupancy(virResctrlMonitorPtr monitor,
>>> return virResctrlMonitorGetStatistic(monitor, "llc_occupancy",
>>> nbank, bankids, bankcaches);
>>> }
>>> +
>>> +
>>> +void
>>> +virResctrlMonitorSetDefault(virResctrlMonitorPtr monitor)
>>> +{
>>> + monitor->default_monitor = true;
>>> +}
>>
>> I really don't see what the value of this is. Looking later on it seems
>> there's some sort of check that the vcpus desired for the monitor match
>> that of some cachetune entry and you then set default.
>>
>> To me that could happen multiple times, e.g.:
>>
>> <cachetune vcpus='0-1' ... />
>> <cachetune vcpus='2-3' ... />
>>
>> and
>>
>> <monitor vcpus='0-1' .../>
>> <monitor vcpus='2-3' .../>
>>
>> so, then it would seem there would be two defaults.
>
> Yes. Two defaults. But I think the <monitor .. > entry should be placed under
> <cachetune> entry.
>
> I'd like to rewrite your configuration in following way:
>
> <cachetune vcpus='0-1'>
> <monitor levels='3' vcpus='0-1'/>
> <cachetune/>
>
> <cachetune vcpus='2-3'>
> <monitor levels='3' vcpus='2-3'/>
> <cachetune/>
>
> upper configuration creates two allocations and one default monitor for each
> allocation.
and a default monitor vs. a non-default monitor has no specific meaning
afaict.
>
> By the way
>
> <cachetune vcpus='0-1' />
>
> has no effect for resctrl but not be considered as an error.
>
> Unlike default allocation, default monitor could be created for multiple
> times in scope of system, but with a limitation that you can only create one
> default monitor for one allocation at most.
> There is only one default allocation in whole system.
>
> Every monitor is linked with some specific allocation, either default
> allocation
> or non-default allocation (or just 'allocation').
>
Simplify the code - default allocation means no <cache> lines true?
Is monitor the related to the cache or the cachetune? If you had:
<cachetune 0-4>
<cache 0>
<cache 1-2>
<cache 3>
<cache 4>
...
Then is :
<monitor 0-4>
<monitor 2>
acceptible? If so, then I'm not seeing the need for default monitor
and/or default allocation.
> The upper manner of monitor is determined by kernel's 'resctrl' file system.
>
> If I created an allocation by creating a directory 'p0' under
> '/sys/fs/resctrl/',
> and after adding two vcpus' PID to file '/sys/fs/resctrl/p0/tasks' and making
> some changes to 'sys/fs/resctrl/p0/schemata' file, then
> the allocation is functional for resource limitation.
> The libvirt CAT code is doing similar operations for VM in an automatic way.
>
The next hunk I'll need to look at later - too many other things cycling
through my head right now. Nice picture, but correlating this to code is
not clicking. My quick look though - I see the same files in both the
default and non-default pictures - the path to get there is different,
but that path afaik is generated as part of the processing and shouldn't
know whether it's default or non-default. It's just a path to data based
on some other "base" path.
John
> Let me show the files under '/sys/fs/resctrl/p0':
>
> .
> ├── cpus
> ├── cpus_list
> ├── mon_data
> │ ├── mon_L3_00
> │ │ ├── llc_occupancy
> │ │ ├── mbm_local_bytes
> │ │ └── mbm_total_bytes
> │ └── mon_L3_01
> │ ├── llc_occupancy
> │ ├── mbm_local_bytes
> │ └── mbm_total_bytes
> ├── mon_groups
> ├── schemata
> └── tasks
>
> We can find some files for the monitoring role, the 'llc_occupancy'
> file, the 'mbm_local_bytes' file and the 'mbm_total_bytes' file.
> The truth is 'resctrl' fs create a monitoring group for each allocation
> group along with its creation, and this monitoring group is what I
> introduced default monitor.
> The default monitor shares the same 'tasks' file with allocation, so
> it monitors the resource utilization for all pids existing in 'tasks' file.
>
> Since this monitoring group is created whenever creating a libvirt
> allocation, in the design of libvirt resctrl monitor, I choose to make it
> shown not shown according to the XML configuration.
>
> To create other monitoring groups just making sub-directories under
> the 'mon_group' directory, and adding corresponding vcpu PID to
> that sub-directory's 'tasks' file.
> The virResctrlMonitorCreate function creates this kind of sub-directory
> under this 'mon_group' directory for non-default monitor.
> For non-default monitor, you can specify a subset of pids of that in
> allocation 'tasks' file, and no pid overlap allowed between non-default
> monitors.
>
> For an allocation with one default monitor and a non-default monitor
> (or just 'monitor' in wording), the files layout are like these:
> .
> ├── cpus
> ├── cpus_list
> ├── mon_data <--- default monitor interface
> │ ├── mon_L3_00
> │ │ ├── llc_occupancy
> │ │ ├── mbm_local_bytes
> │ │ └── mbm_total_bytes
> │ └── mon_L3_01
> │ ├── llc_occupancy
> │ ├── mbm_local_bytes
> │ └── mbm_total_bytes
> ├── mon_groups
> │ └── mon1
> │ ├── cpus
> │ ├── cpus_list
> │ ├── mon_data <--- non-default monitor interface
> │ │ ├── mon_L3_00
> │ │ │ ├── llc_occupancy
> │ │ │ ├── mbm_local_bytes
> │ │ │ └── mbm_total_bytes
> │ │ └── mon_L3_01
> │ │ ├── llc_occupancy
> │ │ ├── mbm_local_bytes
> │ │ └── mbm_total_bytes
> │ └── tasks
> ├── schemata
> └── tasks
>
> This patch is trying to let monitor has the capability to mark a monitor
> as a default monitor, and the default monitor is 'physically' existed in
> kernel 'resctrl' file system, and which has a different manner with
> other monitors.
>
>>
>> Is all this being done to save a few steps in
>> virResctrlMonitorDeterminePath? If so, then I see no value. It only adds
>> confusion.
>
> default monitor has a different role with other monitors, hope I have
> documented it clearly.
>
> Without identifying the default monitor, all monitors will be create under
> allocation's 'mon_group' directory, the following configuration will not be
> supported due to overlap between monitors.
>
> <cachetune vcpus='0-1'>
> <monitor level='3' vcpus='0-1'/>
> <monitor level='3' vcpus='0'/>
> </cachetune>
>
> So default monitor is valuable if you get to know the backend mechanisim
> of kernel resctrl file system.
>
[...]
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list