GroupAdjust adjusts a set of candidate allotment vectors to consume a specified amount of memory and/or storage resource. GroupAdjust may adapt the vectors to conform to resource constraints or to allocate a resource surplus to meet system-wide goals.
For example, GroupAdjust can reprovision available memory to maximize hit ratio across a group of hosted services. This is an effective way to allocate surplus memory to optimize global response time, to degrade service fairly when faced with a memory constraint, or to reduce storage loads in order to adapt to a storage constraint. Note that invoking GroupAdjust to adapt to constraints on specific shared storage units is an instance of storage-aware caching [16], achieved naturally as a side effect of model-based resource provisioning.
GroupAdjust assigns available memory to maximize hit ratio across a group as follows. First, multiply Equation (1) for each service by its expected request arrival rate . This gives a weighted value of service hit rates (hits or bytes per unit of time) for each service, as a function of its memory allotment M. The derivative of this function gives the marginal benefit for allocating a unit of memory to each service at its current allotment M. A closed form solution is readily available, since Equation (1) was obtained by integrating over the Zipf probability distribution (see Section 3.1). GroupAdjust uses a gradient-climbing approach (based on the Muse MSRP algorithm [12]) to assign each unit of memory to the service with the highest marginal benefit at its current M. This algorithm is efficient: it runs in time proportional to the product of the number of candidate vectors to adjust and the number of memory units to allocate.
To illustrate, Figure 6 shows the memory allotments of GroupAdjust to four competing services with different cache behavior profiles , as available memory increases on the x-axis. The left-hand graph varies the and T parameters, holding offered load constant across all services. Services with higher concentrate more of their references on the most popular objects, improving cache effectiveness for small M, while services with lower T can cache a larger share of their objects with a given M. The graph shows that for services with the same values, GroupAdjust prefers to allocate memory to services with lower T. In the low-memory cases, it prefers higher-locality services (higher ); as total memory increases and the most popular objects of higher services fit in cache, the highest marginal benefit for added memory moves to lower services. These properties of Web service cache behavior result in the crossover points for services with differing values.
The right-hand graph in Figure 6 shows four services with equal and T but varying offered load . Higher increases the marginal benefit of adding memory for a service, because a larger share of requests go to that service's objects. GroupAdjust effectively balances these competing demands. When the goal is to maximize global hit ratio, as in this example, a global perfect-LFU policy in the Web servers would ultimately yield the same M shares devoted to each service. Our model-based partitioning scheme produces the same result as the reactive policy (if the models are accurate), but it also accommodates other system goals in a unified way. For example, GroupAdjust can use the models to optimize for global response time in a storage-aware fashion; it determines the marginal benefit in response time for each service as a function of its M, factoring in the reduced load on shared storage. Similarly, it can account for service priority by optimizing for ``utility'' [12,21] or ``yield'' [32], composing the response time function for each service with a yield function specifying the value for each level of service quality.