minimum width=3.5cm, text width=3.5cm,left of=appFound, xshift=-3.5cm\] [Destination:\
Clone app as instance]{}; (rsyncApp) \[process, minimum width=3.5cm, text width=3.5cm,above of=cloneBase, yshift=-0.5cm\] [Source to destination:\
*rsync* app filesystem]{}; (checkpoint) \[process, minimum width=3.5cm, text width=3.5cm,left of=instanceFound, xshift=-3.5cm\] [Source:\
Suspend instance]{}; (rsyncInstance) \[process, minimum width=3.5cm, text width=3.5cm, above of=checkpoint, yshift=-0cm, align=center\] [Source to destination:\
*rsync* instance filesystem & in-memory state]{}; (end) \[startstop, left of=start, xshift=-3.5cm\] [Destination:\
Restore instance]{}; (start) – (instanceFound); (instanceFound) – node\[anchor=west\] [N]{} (appFound); (appFound) – node\[anchor=west\] [N]{} (baseFound); (baseFound) |- node\[anchor=west\] [N]{} (rsyncBase); (instanceFound) – node\[anchor=south\] [Y]{} (checkpoint); (appFound) – node\[anchor=south\] [Y]{} (cloneApp); (baseFound) – node\[anchor=south\] [Y]{} (cloneBase); (rsyncBase) – (cloneBase); (cloneBase) – (rsyncApp); (rsyncApp) – (cloneApp); (cloneApp) – (checkpoint); (checkpoint) – (rsyncInstance); (rsyncInstance) – (end); (3,-6) – (3,-9.2); (-7.5,-6) – (-7.5,-9.2); (3,-9.2) – (-7.5,-9.2); (3,-6) – (-7.5,-6);

The problem with migrating an encapsulated service directly using the above basic live migration procedure is that the “package” contains the guest OS, virtualization data, and, for VMs, the system kernel, which are required to make the service self-contained. A base package with no services installed can have a size that tips the scale at about $400$ MB and $2.7$ GB for LXC and KVM, respectively. Our experiments using the live migration method discussed 