def predict(self, workload: Workload, cpu_usage_last_hour: np.array, pred_env: PredEnvironment) -> float: if workload.get_id() == 'static_a': return workload.get_thread_count() * 0.8 elif workload.get_id() == 'static_b': return workload.get_thread_count() * 0.01 elif workload.get_id() == 'burst_c': return workload.get_thread_count() * 0.9
def predict(self, workload: Workload, cpu_usage_last_hour: np.array, pred_env: PredEnvironment) -> float: image = workload.get_image() tokens = image.split('@') valid_digest = False if cpu_usage_last_hour is None: cpu_usage_last_hour = np.full((60,), np.nan, dtype=np.float32) image_name = None if len(tokens) == 2 and tokens[-1].startswith("sha256:"): m = self._img_name_regex.search(tokens[0]) if m is not None: valid_digest = True image_name = m.groups(0)[0] entry_point = workload.get_entrypoint()[:1000] if entry_point is None: entry_point = "" filter_key = "%s@%s" % (tokens[-1], entry_point) if self.__use_whitelist and valid_digest and (filter_key not in self.__model.filter): # not in whitelist, predict without context features q = Query2( None, # image_name None, # user None, # app_name workload.get_thread_count(), None, # ram_requested None, # disk_requested None, # network_requested None, # job_type None, # region None, # env None, # hour of day build_ts_features(cpu_usage_last_hour) ) else: q = Query2( image_name, workload.get_owner_email(), workload.get_app_name(), workload.get_thread_count(), workload.get_mem(), workload.get_disk(), workload.get_network(), workload.get_job_type().lower(), pred_env.region, pred_env.nflx_env, pred_env.hour_of_day, build_ts_features(cpu_usage_last_hour) ) return min(self.__model.ml_model.predict_single(q), workload.get_thread_count())
def test_construction(self): identifier = uuid.uuid4() thread_count = 2 workload_type = STATIC w = Workload(identifier, thread_count, workload_type) self.assertEqual(identifier, w.get_id()) self.assertEqual(thread_count, w.get_thread_count()) self.assertEqual(workload_type, w.get_type())
def test_free_cpu(self): for allocator_class in ALLOCATORS: cpu = get_cpu() allocator = allocator_class(cpu) self.assertEqual(DEFAULT_TOTAL_THREAD_COUNT, len(cpu.get_empty_threads())) w = Workload(uuid.uuid4(), 3, STATIC) allocator.assign_threads(w) self.assertEqual( DEFAULT_TOTAL_THREAD_COUNT - w.get_thread_count(), len(cpu.get_empty_threads())) allocator.free_threads(w.get_id()) self.assertEqual(DEFAULT_TOTAL_THREAD_COUNT, len(cpu.get_empty_threads()))
def predict(self, workload: Workload, cpu_usage_last_hour: np.array, pred_env: PredEnvironment) -> float: return workload.get_thread_count() * self.__constant_percent_busy / 100
def _occupies_entire_cpu(workload: Workload, cpu: Cpu): return len(cpu.get_threads()) == workload.get_thread_count()