Hi all, We had a nice discussion about this in the API working group meeting today. I agree that it's a good idea to do our best to make this change compatible with future updates to the Request call and/or quota. I think it would be beneficial to have a meeting in a few days to brainstorm some ideas; please let me know if you would like to be included in that meeting and I will add you to an invite!
Cheers, Greg On Tue, Jun 12, 2018 at 8:06 AM, Alex Rukletsov <a...@mesosphere.com> wrote: > Instead of the master flag, why not a master API call. This will allow to > update the value without restarting the master. > > Another thought is that we should explain operators how and when to use > this knob. For example, if they observe a behavioural pattern A, then it > means B is happening, and tuning the knob to C might help. > > On Tue, Jun 12, 2018 at 7:36 AM, Jie Yu <yujie....@gmail.com> wrote: > >> I would suggest we also consider the possibility of adding per framework >> control on `min_allocatable_resources`. >> >> If we want to consider supporting per-framework setting, we should >> probably >> model this as a protobuf, rather than a free form JSON. The same protobuf >> can be reused for both master flag, framework API, or even supporting >> Resource Request in the future. Something like the following: >> >> message ResourceQuantityPredicate { >> enum Type { >> SCALAR_GE, >> } >> optional Type type; >> optional Value.Scalar scalar; >> } >> message ResourceRequirement { >> required string resource_name; >> oneof predicates { >> ResourceQuantityPredicate quantity; >> } >> } >> message ResourceRequirementList { >> // All requirements MUST be met. >> repeated ResourceRequirement requirements; >> } >> >> // Resource request API. >> message Request { >> repeated ResoruceRequrementList accepted; >> } >> >> // `allocatable()` >> message MinimalAllocatableResources { >> repeated ResoruceRequrementList accepted; >> } >> >> On Mon, Jun 11, 2018 at 3:47 PM, Meng Zhu <m...@mesosphere.com> wrote: >> >> > Hi: >> > >> > The allocatable >> > <https://github.com/apache/mesos/blob/1.5.x/src/master/alloc >> ator/mesos/hierarchical.cpp#L2471-L2479> >> > check in the allocator (shown below) was originally introduced to >> > >> > help alleviate the situation where a framework receives some resources, >> > but no >> > >> > cpu/memory, thus cannot launch a task. >> > >> > >> > constexpr double MIN_CPUS = 0.01;constexpr Bytes MIN_MEM = >> Megabytes(32); >> > bool HierarchicalAllocatorProcess::allocatable( >> > const Resources& resources) >> > { >> > Option<double> cpus = resources.cpus(); >> > Option<Bytes> mem = resources.mem(); >> > >> > return (cpus.isSome() && cpus.get() >= MIN_CPUS) || >> > (mem.isSome() && mem.get() >= MIN_MEM); >> > } >> > >> > >> > Issues >> > >> > However, there has been a couple of issues surfacing lately surrounding >> > the check. >> > >> > - >> > - - MESOS-8935 Quota limit "chopping" can lead to cpu-only and >> >> > memory-only offers. >> > >> > We introduced fined-grained quota-allocation (MESOS-7099) in Mesos 1.5. >> > When we >> > >> > allocate resources to a role, we'll "chop" the available resources of >> the >> > agent up to the >> > >> > quota limit for the role. However, this has the unintended consequence >> of >> > creating >> > >> > cpu-only and memory-only offers, even though there might be other agents >> > with both >> > >> > cpu and memory resources available in the cluster. >> > >> > >> > - MESOS-8626 The 'allocatable' check in the allocator is problematic >> with >> > multi-role frameworks. >> > >> > Consider roleA reserved cpu/memory on an agent and roleB reserved disk >> on >> > the same agent. >> > >> > A framework under both roleA and roleB will not be able to get the >> > reserved disk due to the >> > >> > allocatable check. With the introduction of resource providers, the >> > similar situation will >> > >> > become more common. >> > >> > Proposed change >> > >> > Instead of hardcoding a one-size-fits-all value in Mesos, we are >> proposing >> > to add a new master flag >> > >> > min_allocatable_resources. It specifies one or more scalar resources >> > quantities that define the >> > >> > minimum allocatable resources for the allocator. The allocator will only >> > offer resources that are more >> > >> > than at least one of the specified resources. The default behavior *is >> > backward compatible* i.e. >> > >> > by default, the flag is set to “cpus:0.01|mem:32”. >> > >> > Usage >> > >> > The flag takes in either a simple text of resource(s) delimited by a bar >> > (|) or a JSON array of JSON >> > >> > formatted resources. Note, the input should be “pure” scalar quantities >> > i.e. the specified resource(s) >> > >> > should only have name, type (set to scalar) and scalar fields set. >> > >> > >> > Examples: >> > >> > - - To eliminate cpu or memory only offer due to the quota chopping, >> > - we could set the flag to “cpus:0.01;mem:32” >> > - >> > - - To enable offering disk only offer, we could set the flag to >> > “disk:32” >> > - >> > - - For both, we could set the flag to “cpus:0.01;mem:32|disk:32”. >> > - Then the allocator will only offer resources that at least contain >> > “cpus:0.01;mem:32” >> > - OR resources that at least contain “disk:32”. >> > >> > >> > Let me know what you think! Thanks! >> > >> > >> > -Meng >> > >> > >> > >