This paper was presented by Alexandros from NetApp. The main idea is to adaptively schedule asynchronous requests in order to favor synchronous ones to improve application's performance. For example, when the server is congested, the clients would delay asynchronous writes, read-ahead and send only the reads, metadata requests to the server. This obviously requires the client to consume more memory to keep those dirty pages for longer interval. To handle the pressure on other resources, authors propose a mechanism that can look at utilization of all resources, assign a cost to them and compare those to make such decisions.
The main issue is deciding the cost of an operation based on multiple resources.
They use a previously known result which says that increasing the price exponentially with increase in utilization of a resource leads to a competitive ratio of (log k), where k is the ratio of benefit obtained by and offline vs an online algorithm. They use the pricing function that takes a number K_i per resource and utilization u_i to compute the price. The price is computed for each resource based on its utilization and the highest value is used to depict the current bottleneck. The price calculated by server is sent to clients as part of FSSTAT call. The prices are computed every second and FSSTAT is send along with every tenth read/write request. This is a non-blocking call and doesn't impact clients' performance.
Finally they showed using both micro-benchmarks and real apps that this can lead to about 20% better performance.
Here is something to chew : Can we extend this mechanism to provide prioritization among different clients, in terms of proportionate shares or weights?
http://www.usenix.org/events/fast09/tech/full_papers/batsakis/batsakis.pdf
That's a very interesting question. My guess is yes.
Shouldn't one just do a proportional weight on the price of the resource?