**Suffer algorithm**

The rationale behind sufferage is that a host should be assigned to the task that would "suffer" the most if not assigned to that host. For each task, its sufferage value is defined as the difference between its best MCT and its second-best MCT. Tasks with a higher sufferage value take precedence Berman et al. (2005); Casanova et al. (2000). To adapt a suffer algorithm to our problem, we analyze the workflow into a set of sub-jobs in sequential layers. Sub-jobs in the same layer do not depend on each other. With each sub-job in the sequential layer, we find the earliest and the second-earliest finish time of the sub-job. The sub-job in the layer which has the highest difference between the earliest and the second-earliest finish time will be assigned to the determined RMS. A more detailed description about the algorithm can be seen in Quan (2007).
