From: Shriram Rajagopalan Date: Tue, 30 Aug 2011 16:23:10 +0000 (+0100) Subject: remus: blackhole replication target X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=f0ff720550b84fe1aa576dfed777690224dd6d47;p=people%2Fvhanquez%2Fxen.git remus: blackhole replication target The new --null option allows one to test and play with just the memory checkpointing and network buffering aspect of remus, without the need for a second host. The disk is not replicated. All replication data is sent to /dev/null. This option is pretty handy when a user wants to see the page churn for his workload or observe the latency hit though the latter will not be accurate. Signed-off-by: Shriram Rajagopalan Committed-by: Ian Jackson xen-unstable changeset: 23196:29d81623dc14 Backport-requested-by: Shriram Rajagopalan Committed-by: Ian Jackson --- diff --git a/tools/python/xen/remus/save.py b/tools/python/xen/remus/save.py index 9858aec57..0c86eeb55 100644 --- a/tools/python/xen/remus/save.py +++ b/tools/python/xen/remus/save.py @@ -95,6 +95,12 @@ class MigrationSocket(_proxy): self.sock = sock super(MigrationSocket, self).__init__(fd) +class NullSocket(_proxy): + def __init__(self, address): + filedesc = os.open('/dev/null', 0666) + fd = os.fdopen(filedesc, 'w+') + super(NullSocket, self).__init__(fd) + class Keepalive(object): "Call a keepalive method at intervals" def __init__(self, method, interval=0.1): diff --git a/tools/remus/remus b/tools/remus/remus index 11d83e418..93a7eb841 100644 --- a/tools/remus/remus +++ b/tools/remus/remus @@ -21,6 +21,7 @@ class Cfg(object): self.domid = 0 self.host = 'localhost' + self.nullremus = False self.port = XendOptions.instance().get_xend_relocation_port() self.interval = 200 self.netbuffer = True @@ -33,6 +34,8 @@ class Cfg(object): help='checkpoint every MS milliseconds') parser.add_option('-p', '--port', dest='port', type='int', help='send stream to port PORT', metavar='PORT') + parser.add_option('', '--blackhole', dest='nullremus', action='store_true', + help='replicate to /dev/null (no disk checkpoints, only memory & net buffering)') parser.add_option('', '--no-net', dest='nonet', action='store_true', help='run without net buffering (benchmark option)') parser.add_option('', '--timer', dest='timer', action='store_true', @@ -49,6 +52,8 @@ class Cfg(object): self.interval = opts.interval if opts.port: self.port = opts.port + if opts.nullremus: + self.nullremus = True if opts.nonet: self.netbuffer = False if opts.timer: @@ -107,18 +112,22 @@ def run(cfg): bufs = [] # disks must commit before network can be released - for disk in dom.disks: - try: - bufs.append(ReplicatedDisk(disk)) - except ReplicatedDiskException, e: - print e - continue + if not cfg.nullremus: + for disk in dom.disks: + try: + bufs.append(ReplicatedDisk(disk)) + except ReplicatedDiskException, e: + print e + continue if cfg.netbuffer: for vif in dom.vifs: bufs.append(BufferedNIC(vif)) - fd = save.MigrationSocket((cfg.host, cfg.port)) + if cfg.nullremus: + fd = save.NullSocket((cfg.host, cfg.port)) + else: + fd = save.MigrationSocket((cfg.host, cfg.port)) def postsuspend(): 'Begin external checkpointing after domain has paused'