mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2024-12-19 04:57:54 +00:00
attempt to graph utilization with pyrrd (doesn't quite work)
This commit is contained in:
parent
1fd3e1f290
commit
f22253d4f2
47
simulator.py
47
simulator.py
@ -2,7 +2,12 @@
|
|||||||
|
|
||||||
import sha as shamodule
|
import sha as shamodule
|
||||||
import os, random
|
import os, random
|
||||||
import rrdtool
|
|
||||||
|
from pkg_resources import require
|
||||||
|
require('PyRRD')
|
||||||
|
from pyrrd import graph
|
||||||
|
from pyrrd.rrd import DataSource, RRD, RRA
|
||||||
|
|
||||||
|
|
||||||
def sha(s):
|
def sha(s):
|
||||||
return shamodule.new(s).digest()
|
return shamodule.new(s).digest()
|
||||||
@ -110,9 +115,11 @@ class Node:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
class Queen:
|
class Queen:
|
||||||
def __init__(self):
|
def __init__(self, simulator):
|
||||||
self.living_files = {}
|
self.living_files = {}
|
||||||
self.utilization = 0 # total size of all active files
|
self.utilization = 0 # total size of all active files
|
||||||
|
self.simulator = simulator
|
||||||
|
self.simulator.stamp_utilization(self.utilization)
|
||||||
|
|
||||||
def get_all_nodes(self):
|
def get_all_nodes(self):
|
||||||
return self.all_nodes
|
return self.all_nodes
|
||||||
@ -120,11 +127,11 @@ class Queen:
|
|||||||
def please_preserve(self, fileid, size, tried, last_givento):
|
def please_preserve(self, fileid, size, tried, last_givento):
|
||||||
self.living_files[fileid] = (size, tried, last_givento)
|
self.living_files[fileid] = (size, tried, last_givento)
|
||||||
self.utilization += size
|
self.utilization += size
|
||||||
|
self.simulator.stamp_utilization(self.utilization)
|
||||||
|
|
||||||
def please_delete(self, fileid):
|
def please_delete(self, fileid):
|
||||||
self.delete(fileid)
|
self.delete(fileid)
|
||||||
|
|
||||||
|
|
||||||
def permute_peers(self, fileid):
|
def permute_peers(self, fileid):
|
||||||
permuted = [(sha(fileid+n.nid),n)
|
permuted = [(sha(fileid+n.nid),n)
|
||||||
for n in self.get_all_nodes()]
|
for n in self.get_all_nodes()]
|
||||||
@ -141,6 +148,7 @@ class Queen:
|
|||||||
if had_it:
|
if had_it:
|
||||||
tried -= 1
|
tried -= 1
|
||||||
self.utilization -= size
|
self.utilization -= size
|
||||||
|
self.simulator.stamp_utilization(self.utilization)
|
||||||
del self.living_files[fileid]
|
del self.living_files[fileid]
|
||||||
|
|
||||||
class Simulator:
|
class Simulator:
|
||||||
@ -153,11 +161,18 @@ class Simulator:
|
|||||||
P_NODEAVAIL = 1.0
|
P_NODEAVAIL = 1.0
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.queen = q = Queen()
|
self.time = 1164783600 # small numbers of seconds since the epoch confuse rrdtool
|
||||||
|
self.prevstamptime = int(self.time)
|
||||||
|
|
||||||
|
ds = DataSource(ds_name='utilizationds', ds_type='GAUGE', heartbeat=1)
|
||||||
|
rra = RRA(cf='AVERAGE', xff=0.1, steps=1, rows=1200)
|
||||||
|
self.rrd = RRD("/tmp/utilization.rrd", ds=[ds], rra=[rra], start=self.time)
|
||||||
|
self.rrd.create()
|
||||||
|
|
||||||
|
self.queen = q = Queen(self)
|
||||||
self.all_nodes = [Node(randomid(), q, self)
|
self.all_nodes = [Node(randomid(), q, self)
|
||||||
for i in range(self.NUM_NODES)]
|
for i in range(self.NUM_NODES)]
|
||||||
q.all_nodes = self.all_nodes
|
q.all_nodes = self.all_nodes
|
||||||
self.time = 0
|
|
||||||
self.next = []
|
self.next = []
|
||||||
self.schedule_events()
|
self.schedule_events()
|
||||||
self.verbose = False
|
self.verbose = False
|
||||||
@ -169,6 +184,24 @@ class Simulator:
|
|||||||
self.failed_files = 0
|
self.failed_files = 0
|
||||||
self.lost_data_bytes = 0 # bytes deleted to make room for new shares
|
self.lost_data_bytes = 0 # bytes deleted to make room for new shares
|
||||||
|
|
||||||
|
def stamp_utilization(self, utilization):
|
||||||
|
if int(self.time) > (self.prevstamptime+1):
|
||||||
|
self.rrd.bufferValue(self.time, utilization)
|
||||||
|
self.prevstamptime = int(self.time)
|
||||||
|
|
||||||
|
def write_graph(self):
|
||||||
|
self.rrd.update()
|
||||||
|
self.rrd = None
|
||||||
|
import gc
|
||||||
|
gc.collect()
|
||||||
|
|
||||||
|
def1 = graph.DataDefinition(vname='uvn', rrdfile='/tmp/utilization.rrd', ds_name='utilizationds')
|
||||||
|
area1 = graph.Area(value=def1.vname, color="#990033", legend='utilizationlegend')
|
||||||
|
g = graph.Graph('/tmp/utilization.png', imgformat='PNG', width=540, height=100, vertical_label='utilizationverticallabel', title='utilizationtitle', lower_limit=0)
|
||||||
|
g.data.append(area1)
|
||||||
|
g.data.append(def1)
|
||||||
|
g.write()
|
||||||
|
|
||||||
def add_file(self):
|
def add_file(self):
|
||||||
size = random.randrange(1000)
|
size = random.randrange(1000)
|
||||||
n = random.choice(self.all_nodes)
|
n = random.choice(self.all_nodes)
|
||||||
@ -224,7 +257,7 @@ class Simulator:
|
|||||||
elif etype == "DELNODE":
|
elif etype == "DELNODE":
|
||||||
#self.del_node()
|
#self.del_node()
|
||||||
pass
|
pass
|
||||||
self.print_stats(current_time, etype)
|
# self.print_stats(current_time, etype)
|
||||||
|
|
||||||
def print_stats_header(self):
|
def print_stats_header(self):
|
||||||
print "time: added failed lost avg_tried"
|
print "time: added failed lost avg_tried"
|
||||||
@ -247,7 +280,7 @@ def main():
|
|||||||
# )
|
# )
|
||||||
global s
|
global s
|
||||||
s = Simulator()
|
s = Simulator()
|
||||||
s.print_stats_header()
|
# s.print_stats_header()
|
||||||
for i in range(1000):
|
for i in range(1000):
|
||||||
s.do_event()
|
s.do_event()
|
||||||
print "%d files added, %d files deleted" % (s.added_files, s.deleted_files)
|
print "%d files added, %d files deleted" % (s.added_files, s.deleted_files)
|
||||||
|
Loading…
Reference in New Issue
Block a user