Esempio n. 1
0
TEST(QoSPipelineTest, FiltersNotProperlyFed) {
  uint64_t WINDOWS_SIZE = 10;
  uint64_t CONTENTION_COOLDOWN = 10;
  double_t FRATIONAL_THRESHOLD = 0.5;

  Try<mesos::FixtureResourceUsage> usages =
      JsonUsage::ReadJson("tests/fixtures/pipeline/insufficient_metrics.json");
  if (usages.isError()) {
    LOG(ERROR) << "JsonSource failed: " << usages.error() << std::endl;
  }

  ResourceUsage usage;
  usage.CopyFrom(usages.get().resource_usage(0));

  SerenityConfig conf;
  conf["Detector"] = createAssuranceDetectorCfg(
    WINDOWS_SIZE, CONTENTION_COOLDOWN, FRATIONAL_THRESHOLD);

  conf.set(ENABLED_VISUALISATION, false);
  conf.set(VALVE_OPENED, true);

  QoSControllerPipeline* pipeline = new CpuQoSPipeline(conf);

  Result<QoSCorrections> corrections = pipeline->run(usage);
  EXPECT_NONE(corrections);

  delete pipeline;
}
Esempio n. 2
0
TEST(QoSPipelineTest, NoCorrections) {
  uint64_t WINDOWS_SIZE = 10;
  uint64_t CONTENTION_COOLDOWN = 10;
  double_t FRATIONAL_THRESHOLD = 0.5;

  MockSlaveUsage mockSlaveUsage(QOS_PIPELINE_FIXTURE1);

  SerenityConfig conf;
  conf["Detector"] = createAssuranceDetectorCfg(
    WINDOWS_SIZE, CONTENTION_COOLDOWN, FRATIONAL_THRESHOLD);

  conf.set(ENABLED_VISUALISATION, false);
  conf.set(VALVE_OPENED, true);

  QoSControllerPipeline* pipeline = new CpuQoSPipeline(conf);

  // First iteration.
  Result<QoSCorrections> corrections =
      pipeline->run(mockSlaveUsage.usage().get());
  EXPECT_NONE(corrections);

  // Second iteration.
  corrections = pipeline->run(mockSlaveUsage.usage().get());
  EXPECT_SOME(corrections);

  EXPECT_TRUE(corrections.get().empty());

  delete pipeline;
}
Esempio n. 3
0
 /**
  * TODO(skonefal): SerenityConfig should have const methods inside.
  *                 Currently, it cannot be passed as const.
  */
 explicit SeniorityStrategy(SerenityConfig _config)
     : RevocationStrategy(Tag(QOS_CONTROLLER, NAME)) {
   initialize();
   if (_config.hasKey(STARTING_SEVERITY_KEY)) {
      severity = _config.getD(STARTING_SEVERITY_KEY);
   }
 }
Esempio n. 4
0
 explicit SeniorityStrategy(const SerenityConfig& _config)
     : RevocationStrategy(Tag(QOS_CONTROLLER, "SeniorityStrategy")),
       cooldownCounter(None()),
       estimatorDisabled(false) {
   SerenityConfig config = SeniorityConfig(_config);
   this->cfgCooldownTime = config.getU64(decider::CONTENTION_COOLDOWN);
   this->cfgDefaultSeverity = config.getD(decider::STARTING_SEVERITY);
 }
Esempio n. 5
0
 explicit CpuContentionStrategy(
     const SerenityConfig& _config,
     const lambda::function<usage::GetterFunction>& _cpuUsageGetFunction)
     : RevocationStrategy(Tag(QOS_CONTROLLER, "CpuContentionStrategy")),
       cpuUsageGetFunction(_cpuUsageGetFunction),
       cooldownCounter(None()),
       estimatorDisabled(false) {
   SerenityConfig config = CpuContentionStrategyConfig(_config);
   this->cfgCooldownTime = config.getU64(strategy::CONTENTION_COOLDOWN);
   this->cfgDefaultSeverity = config.getD(strategy::DEFAULT_CPU_SEVERITY);
 }
Esempio n. 6
0
 OverloadDetector(
     Consumer<Contentions>* _consumer,
     const lambda::function<usage::GetterFunction>& _cpuUsageGetFunction,
     SerenityConfig _conf,
     const Tag& _tag = Tag(QOS_CONTROLLER, NAME))
   : tag(_tag),
     cpuUsageGetFunction(_cpuUsageGetFunction),
     Producer<Contentions>(_consumer) {
   SerenityConfig config = OverloadDetectorConfig(_conf);
   this->cfgUtilizationThreshold =
     config.getD(detector::THRESHOLD);
 }
Esempio n. 7
0
TEST(QoSIpcPipelineTest, AssuranceDetectorTwoDropCorrectionsWithEma) {
  uint64_t WINDOWS_SIZE = 10;
  uint64_t CONTENTION_COOLDOWN = 4;
  double_t FRATIONAL_THRESHOLD = 0.3;
  double_t SEVERITY_LEVEL = 1;
  double_t NEAR_LEVEL = 0.1;

  MockSlaveUsage mockSlaveUsage(QOS_PIPELINE_FIXTURE2);

  SerenityConfig conf;
  conf["Detector"] = createAssuranceDetectorCfg(
    WINDOWS_SIZE,
    CONTENTION_COOLDOWN,
    FRATIONAL_THRESHOLD,
    SEVERITY_LEVEL,
    NEAR_LEVEL);
  conf.set(ema::ALPHA, 0.9);
  conf.set(ENABLED_VISUALISATION, false);
  conf.set(VALVE_OPENED, true);

  QoSControllerPipeline* pipeline = new CpuQoSPipeline(conf);

  // First iteration.
  Result<QoSCorrections> corrections =
      pipeline->run(mockSlaveUsage.usage().get());
  EXPECT_NONE(corrections);

  ResourceUsage usage = mockSlaveUsage.usage().get();
  const int32_t LOAD_ITERATIONS = 17;
  LoadGenerator loadGen(
      [](double_t iter) { return 1; },
      new ZeroNoise(),
      LOAD_ITERATIONS);

  for (; loadGen.end(); loadGen++) {
    // Test scenario: After 10 iterations create drop in IPC
    // for executor num 3.
    double_t ipcFor3Executor = (*loadGen)();
    if (loadGen.iteration >= 11) {
      ipcFor3Executor /= 2.0;
    }

    usage.mutable_executors(PR_4CPUS)->CopyFrom(
        generateIPC(usage.executors(PR_4CPUS),
                    ipcFor3Executor,
                    (*loadGen).timestamp));

    usage.mutable_executors(PR_2CPUS)->CopyFrom(
        generateIPC(usage.executors(PR_2CPUS),
                    (*loadGen)(),
                    (*loadGen).timestamp));
    // Third iteration (repeated).
    corrections = pipeline->run(usage);

    // Assurance Detector will wait for signal to be returned to the
    // established state.
    if (loadGen.iteration == 11 || loadGen.iteration == 16) {
      EXPECT_SOME(corrections);
      ASSERT_EQ(slave::QoSCorrection_Type_KILL,
                corrections.get().front().type());
      // Make sure that we do not kill PR tasks!
      EXPECT_NE("serenityPR",
                corrections.get().front().kill().executor_id().value());
      EXPECT_NE("serenityPR2",
                corrections.get().front().kill().executor_id().value());
    } else {
      EXPECT_SOME(corrections);
      EXPECT_TRUE(corrections.get().empty());
    }
  }

  delete pipeline;
}