def GetSstAccFreqAtSpecificTime(at_simulated_time):
    fn = "%s/sst-accfreq-%s-at-%.04f" % (Conf.Get("dn_result"),
                                         Conf.Get("simulation_time_begin"),
                                         at_simulated_time)
    if os.path.isfile(fn):
        return fn

    # t0: a specific time when we take the snapshot
    t0 = SimTime.SimulatedTimeAt(at_simulated_time)
    Cons.P("t0 (time of snapshot): %s" % t0)

    sst_lives = GetSstLives()

    with open(fn, "w") as fo:
        fmt = "%4d %13s %13s %7.3f %1d %5.2f"
        fo.write("# t0 (time of snapshot): %s\n" % t0)
        fo.write("%s\n" % Util.BuildHeader(
            fmt,
            "sst_id ts_before ts_after reads_per_64MB_per_sec level age_in_day"
        ))

        for sst_id, sl in sst_lives.iteritems():
            if t0 < SimTime.ToSimulatedTime(sl.ts_created):
                continue
            if (sl.ts_deleted is not None) and (SimTime.ToSimulatedTime(
                    sl.ts_deleted) < t0):
                continue

            ts_prev = None
            for ts, v in sorted(sl.ts_acccnt.iteritems()):
                ts_simulated = SimTime.ToSimulatedTime(ts)
                if ts_simulated < t0:
                    ts_prev = ts_simulated
                    continue
                #Cons.P("ts_simulated: %s" % ts_simulated)
                if ts_prev is not None:
                    #cnt = v[0]
                    cnt_per_64MB_per_sec = v[1]
                    #temp = v[2]
                    fo.write(
                        (fmt + "\n") %
                        (sst_id, ts_prev.strftime("%y%d%m-%H%M%S"),
                         ts_simulated.strftime("%y%d%m-%H%M%S"),
                         cnt_per_64MB_per_sec, sl.Level(),
                         ((t0 - SimTime.ToSimulatedTime(
                             sl.TsCreated())).total_seconds() / 3600.0 / 24)))
                    break
    Cons.P("Created %s %d" % (fn, os.path.getsize(fn)))
    return fn
Exemple #2
0
    def PrepareData(self):
        simulation_time_begin_year = SimTime.SimulationTimeBegin().strftime(
            "%y")

        self.row = []
        for h, i in sorted(_header_idx.iteritems()):
            if h.startswith("dsk/xvd") \
              or h.startswith("io/xvd") \
              or h.startswith("total_cpu_usage:"):
                self.row.append(float(self.raw_row[i]))
            elif h.startswith("system:time"):
                # It doesn't have year. Use simulation_time_begin_year.
                # 27-12 15:34:18
                # 01234567890123
                simulation_time = datetime.datetime.strptime(
                    (simulation_time_begin_year + self.raw_row[i]),
                    "%y%d-%m %H:%M:%S")
                self.row.append(
                    SimTime.ToSimulatedTime(simulation_time).strftime(
                        "%m%d-%H%M%S"))
            elif h.startswith("memory_usage:") \
              or h.startswith("net/total:") \
              or h.startswith("system:"):
                self.row.append(float(self.raw_row[i]) / 1024.0)
            else:
                self.row.append(self.raw_row[i])
        def __init__(self, ts, event, sst_id):
            self.ts = ts
            if ts is not None:
                self.ts = SimTime.ToSimulatedTime(self.ts)

            # "C"reated or "D"eleted
            self.event = event
            self.sst_id = sst_id

            if self.ts is not None:
                if SimTime.SimulatedTimeEnd() < self.ts:
                    # This happens. Tolerate ts no bigger than SimTime.SimulatedTimeEnd()
                    # by 5 minutes, which is small compared with the 14 day time
                    # interval.
                    if SimTime.SimulatedTimeEnd() < self.ts:
                        Cons.P("SimTime.SimulatedTimeEnd() %s < self.ts %s. event=%s. It's okay. Adjust to the former" \
                          % (SimTime.SimulatedTimeEnd(), self.ts, event))
                        self.ts = SimTime.SimulatedTimeEnd()

            if self.event == "D" and self.ts is None:
                self.ts = SimTime.SimulatedTimeEnd()

            if self.ts is None:
                raise RuntimeError("Unexpected")
Exemple #4
0
def GetData():
	fn_hm = "%s/sst-heatmap-by-time-%s" % (Conf.dn_result, Conf.Get("simulation_time_begin"))
	fn_vl = "%s/sst-heatmap-by-time-vertical-lines-%s" % (Conf.dn_result, Conf.Get("simulation_time_begin"))
	if os.path.isfile(fn_hm) and os.path.isfile(fn_vl):
		return (fn_hm, fn_vl, _MaxHeatFromHeatmapByTimeData(fn_hm))

	# {sst_id, SstLife()}
	sst_lives = RocksdbLogReader.GetSstLives()

	with Cons.MT("Generating Sst heatmap by time ..."):
		# Gather temperature info at n different times
		num_times = Conf.heatmap_by_time_num_times

		# Set start and end times
		# Start time is when the first Sstable is created, not the simulation_time_begin, when no SSTable exists yet.
		#   Exp start time:          160927-143257.395
		#   First Sstable open time: 160927-143411.273
		min_sst_opened = None
		for sst_gen, sl in sorted(sst_lives.iteritems()):
			min_sst_opened = sl.TsCreated() if min_sst_opened is None else min(min_sst_opened, sl.TsCreated())
		st = min_sst_opened
		et = SimTime.SimulationTimeEnd()
		dur = (et - st).total_seconds()

		# { t0: {HeatBoxes} }
		time_heatboxes = {}
		max_temperature = None
		for i in range(0, num_times):
			t0 = st + datetime.timedelta(seconds=(float(dur) * i / num_times + time_offset_in_sec))
			t1 = st + datetime.timedelta(seconds=(float(dur) * (i+1) / num_times + time_offset_in_sec))

			# Sort boxes by their temperature. Heights are proportional to their sizes.
			boxes = []
			for sst_gen, sl in sorted(sst_lives.iteritems()):
				temp = sl.TempAtTime(t0)
				if max_temperature is None:
					max_temperature = temp
				else:
					max_temperature = max(max_temperature, temp)
				if temp is None:
					continue
				boxes.append(_Box(sl, t0, t1, temp))
			boxes.sort(key=lambda b: b.temp, reverse=True)
			time_heatboxes[t0] = boxes

			Cons.ClearLine()
			Cons.Pnnl("%4d/%4d" % (i + 1, num_times))
		print ""

		for t, boxes in sorted(time_heatboxes.iteritems()):
			for b in boxes:
				b.SetTempColor(max_temperature)

		# Set y-coordinate of each box
		for t, boxes in sorted(time_heatboxes.iteritems()):
			total_size = 0
			for b in boxes:
				total_size += b.sl.Size()
			s = 0
			for b in boxes:
				b.y0 = float(s) / total_size
				s += b.sl.Size()
				b.y1 = float(s) / total_size

		# Convert to simulated time
		# { t0: {HeatBoxes} }
		time_heatboxes1 = {}
		for t, boxes in sorted(time_heatboxes.iteritems()):
			t1 = SimTime.ToSimulatedTime(t)
			for b in boxes:
				b.t0 = SimTime.ToSimulatedTime(b.t0)
				b.t1 = SimTime.ToSimulatedTime(b.t1)
			time_heatboxes1[t1] = boxes

		# Make leftmost time to 0.
		t_first = None
		#t_base = datetime.datetime(2000, 1, 1)
		vertical_lines = []
		for t, boxes in sorted(time_heatboxes1.iteritems()):
			if t_first is None:
				t_first = t
			vl = None
			for b in boxes:
				#b.t0 = t_base + (b.t0 - t_first)
				#b.t1 = t_base + (b.t1 - t_first)
				b.t0 = (b.t0 - t_first).total_seconds()
				b.t1 = (b.t1 - t_first).total_seconds()
				vl = b.t1
			vertical_lines.append(vl)
		del vertical_lines[-1]

		fmt = "%4d %1d" \
				" %8d %8d" \
				" %6.4f %6.4f" \
				" %8.3f %11.6f %8d %6s"
		with open(fn_hm, "w") as fo:
			fo.write("# max_temperature=%f\n" % max_temperature)

			# y0 is smaller than y1 (y0 is placed higher in the plot than y1).
			fo.write("%s\n" % Util.BuildHeader(fmt, \
					"sst_gen level t0 t1 y0 y1" \
					" temp temp_relative temp_color heat_color_hex"))

			for t, boxes in sorted(time_heatboxes1.iteritems()):
				for b in boxes:
					fo.write((fmt + "\n") % ( \
							b.sl.Id(), b.sl.Level()
							#, b.t0.strftime("%y%m%d-%H%M%S.%f")[:-3], b.t1.strftime("%y%m%d-%H%M%S.%f")[:-3]
							, b.t0, b.t1
							, b.y0, b.y1
							, b.temp, (float(b.temp) / max_temperature)
							, b.temp_color, ("%0.6X" % b.temp_color)
							))
				fo.write("\n")
		Cons.P("Created %s %d" % (fn_hm, os.path.getsize(fn_hm)))

		with open(fn_vl, "w") as fo:
			for vl in vertical_lines:
				#fo.write("%s\n" % vl.strftime("%y%m%d-%H%M%S.%f")[:-3])
				fo.write("%8d\n" % vl)
		Cons.P("Created %s %d" % (fn_vl, os.path.getsize(fn_vl)))
	return (fn_hm, fn_vl, max_temperature)