So if the input resources are "cpus:0.001,disk:1024", the `allocatable` method will return "disk:1024"? This seems not compatible with the existing behavior: with the current implementation of `allocatable`, the same input resources will be just skipped because we think "cpus:0.001" is too small for framework to launch a task.
allocatable = input > foreach known resource type t: do > r = resources of type t from the input > if r is less than the min resource of type t; then > allocatable -= r > fi > done > return allocatable > Are we going to define min amount for each known resource type (including disk and gpu)? Regards, Qian Zhang On Wed, Mar 7, 2018 at 6:10 AM, Jie Yu <yujie....@gmail.com> wrote: > Chatted with BenM offline on this. There's another option what both of us > agreed that it's probably better than any of the ones mentioned above. > > The idea is to make `allocable` return the portion of the input resources > that are allocatable, and strip the unelectable portion. > > For example: > 1) If the input resources are "cpus:0.001,gpus:1", the `allocatable` method > will return "gpus:1". > 2) If the input resources are "cpus:1,mem:1", the `allocatable` method will > return "cpus:1". > 3) If the input resources are "cpus:0.001,mem:1", the `allocatable` method > will return an empty Resources object. > > Basically, the algorithm is like the following: > > allocatable = input > foreach known resource type t: do > r = resources of type t from the input > if r is less than the min resource of type t; then > allocatable -= r > fi > done > return allocatable > > Let me know what do you guys think! > > Thanks! > - Jie > > On Fri, Mar 2, 2018 at 4:44 PM, Benjamin Mahler <bmah...@apache.org> > wrote: > > > I think (2) would need to be: > > > > bool HierarchicalAllocatorProcess::allocatable( > > const Resources& resources) > > { > > if (something outside {cpu, mem, disk} is present) return true > > else return true iff at least one of {cpu, mem, disk} has >= {MIN_CPU, > > MIN_MEM, MIN_DISK} > > } > > > > Otherwise, 1 GPU would be offered but 1GPU + 0.001 CPU would not? > > > > On Fri, Mar 2, 2018 at 9:27 AM, Jie Yu <yujie....@gmail.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. > > > > > > 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); > > > } > > > > > > As pointed by Benjamin in MESOS-7398 > > > <https://issues.apache.org/jira/browse/MESOS-7398>, it now seems to > > mainly > > > help to minimize the performance overhead from too many small offers > > > (instead too small resource amounts are kept out of the offer pool > until > > > they became accumulated into larger resources). > > > > > > This check does cause issues when new resources types are introduced. > For > > > instance, this check does prevent GPU resources alone from being > > allocated > > > to a framework. There are some other issues we discover MESOS-8626 > > > <https://issues.apache.org/jira/browse/MESOS-8626>. > > > > > > There are several proposals: > > > > > > (1) *Completely remove this check*. This check is a heuristic anyway, > and > > > only applies to a subset of resources (cpu/memory). However, there > might > > be > > > some implication of that change since it's also leveraged to prevent > too > > > many small offers. *If you are concerned about this approach, please > > raise > > > your voice.* > > > > > > (2) *Consider adjust the check to the following. * > > > > > > bool HierarchicalAllocatorProcess::allocatable( > > > const Resources& resources) > > > { > > > Option<double> cpus = resources.cpus(); > > > Option<Bytes> mem = resources.mem(); > > > > > > if (cpus.isSome() && mem.isSome()) { > > > return cpus.get() >= MIN_CPUS || mem.get() >= MIN_MEM; > > > } else if (cpus.isSome()) { > > > return cpus.get() >= MIN_CPUS; > > > } else if (mem.isSome()) { > > > return mem.get() >= MIN_MEM; > > > } else { > > > return true; > > > } > > > } > > > > > > Let me know what you think! Thanks! > > > > > > - Jie > > > > > >