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
>

Reply via email to