  Current serverless offerings give users a limited degree of flexibility for
configuring the resources allocated to their function invocations by either
coupling memory and CPU resources together or providing no knobs at all. These
configuration choices simplify resource allocation decisions on behalf of
users, but at the same time, create deployments that are resource inefficient.
  In this paper, we take a principled approach to the problem of resource
allocation for serverless functions, allowing this choice to be made in an
automatic way that leads to the best combination of performance and cost. In
particular, we systematically explore the opportunities that come with
decoupling memory and CPU resource allocations and also enabling the use of
different VM types. We find a rich trade-off space between performance and
cost. The provider can use this in a number of ways: from exposing all these
parameters to the user, to eliciting preferences for performance and cost from
users, or by simply offering the same performance with lower cost. This
flexibility can also enable the provider to optimize its resource utilization
and enable a cost-effective service with predictable performance.
  Our results show that, by decoupling memory and CPU allocation, there is
potential to have up to 40% lower execution cost than the preset coupled
configurations that are the norm in current serverless offerings. Similarly,
making the correct choice of VM instance type can provide up to 50% better
execution time. Furthermore, we demonstrate that providers can utilize
different instance types for the same functions to maximize resource
utilization while providing performance within 10-20% of the best resource
configuration for each respective function.
