mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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 <rshriram@cs.ubc.ca> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
d732509e34
commit
5bb2e121f0
2 files changed
+22
-7
No files matched your search
@@ -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):
|
||||
|
||||
+16
-7
@@ -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'
|
||||
|
||||