Gilad Chaplik has uploaded a new change for review. Change subject: core: pre-defined weight modules ......................................................................
core: pre-defined weight modules To be compatible with former scheduler. * none -> should use evenly distributed * even distribution -> weight will be calculated according to cpuLoad, is_spm (config), avg vm consumtions (config), vm's cpu count and host core count. * power saving -> host with no vm will be less likely to be selected, other hosts will be sorted (desc) by even distribution logic. Change-Id: I55cf5014bc472bf1e126a9737829e7fcf7e21853 Signed-off-by: Gilad Chaplik <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql M packaging/etc/engine-config/engine-config.properties 8 files changed, 61 insertions(+), 12 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/60/18560/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java index 3f46d55..7b13cff 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java @@ -17,6 +17,8 @@ import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.scheduling.PolicyUnit; import org.ovirt.engine.core.common.scheduling.PolicyUnitType; import org.ovirt.engine.core.common.utils.Pair; @@ -25,6 +27,8 @@ import org.ovirt.engine.core.utils.log.LogFactory; public class PolicyUnitImpl extends PolicyUnit { + public static final int MaxSchedulerWeight = Config.<Integer> GetValue(ConfigValues.MaxSchedulerWeight);; + public static PolicyUnitImpl getPolicyUnitImpl(PolicyUnit policyUnit) { switch (policyUnit.getName()) { case "Migration": diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java index 928b0eb..b384037 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java @@ -71,14 +71,15 @@ public static Integer getEffectiveCpuCores(VDS vds) { VDSGroup vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(vds.getVdsGroupId()); + return getEffectiveCpuCores(vds, vdsGroup != null ? vdsGroup.getCountThreadsAsCores() : false); + } + public static Integer getEffectiveCpuCores(VDS vds, boolean countThreadsAsCores) { if (vds.getCpuThreads() != null - && vdsGroup != null - && Boolean.TRUE.equals(vdsGroup.getCountThreadsAsCores())) { + && countThreadsAsCores) { return vds.getCpuThreads(); } else { return vds.getCpuCores(); } } - } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java index b3d0463..0b8974eb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java @@ -33,15 +33,47 @@ super(policyUnit); } + /** + * Calculate a single host weight score according to various parameters. + * @param vds + * @param vm + * @param hostCores - threads/cores according to cluster + * @return + */ + private double calcDistributeMetric(VDS vds, VM vm, int hostCores) { + int vcpu = Config.<Integer> GetValue(ConfigValues.VcpuConsumptionPercentage); + int spmCpu = (vds.getSpmStatus() == VdsSpmStatus.None) ? 0 : Config + .<Integer> GetValue(ConfigValues.SpmVCpuConsumption); + double hostCpu = vds.getUsageCpuPercent(); + double pendingVcpus = vds.getPendingVcpusCount(); + + return (hostCpu / vcpu) + (pendingVcpus + vm.getNumOfCpus() + spmCpu) / hostCores; + } + + protected int calcEvenDistributionScore(VDS vds, VM vm, boolean countThreadsAsCores) { + int score = MaxSchedulerWeight - 1; + Integer effectiveCpuCores = SlaValidator.getEffectiveCpuCores(vds, countThreadsAsCores); + if (effectiveCpuCores != null + && vds.getUsageCpuPercent() != null + && vds.getPendingVcpusCount() != null) { + // round up result, fractions matters + score = Math.min((int) Math.ceil(calcDistributeMetric(vds, vm, effectiveCpuCores)), MaxSchedulerWeight); + } + return score; + } + @Override public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { + VDSGroup vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(hosts.get(0).getVdsGroupId()); + boolean countThreadsAsCores = vdsGroup != null ? vdsGroup.getCountThreadsAsCores() : false; List<Pair<Guid, Integer>> scores = new ArrayList<Pair<Guid, Integer>>(); for (VDS vds : hosts) { - scores.add(new Pair<Guid, Integer>(vds.getId(), vds.getUsageCpuPercent())); + scores.add(new Pair<Guid, Integer>(vds.getId(), calcEvenDistributionScore(vds, vm, countThreadsAsCores))); } return scores; } + @Override public Pair<List<Guid>, Guid> balance(VDSGroup cluster, List<VDS> hosts, diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java index 95d2a0c..8227895 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Map; -import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; @@ -12,7 +11,7 @@ import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; -public class NonePolicyUnit extends PolicyUnitImpl { +public class NonePolicyUnit extends EvenDistributionPolicyUnit { public NonePolicyUnit(PolicyUnit policyUnit) { super(policyUnit); @@ -20,11 +19,7 @@ @Override public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { - List<Pair<Guid, Integer>> list = new ArrayList<Pair<Guid, Integer>>(); - for (VDS host : hosts) { - list.add(new Pair<Guid, Integer>(host.getId(), 1)); - } - return list; + return super.score(hosts, vm, parameters); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java index b8ba2aa..22337fa 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java @@ -15,6 +15,7 @@ import org.ovirt.engine.core.common.scheduling.PolicyUnit; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; @@ -26,9 +27,18 @@ @Override public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { + VDSGroup vdsGroup = null; List<Pair<Guid, Integer>> scores = new ArrayList<Pair<Guid, Integer>>(); for (VDS vds : hosts) { - scores.add(new Pair<Guid, Integer>(vds.getId(), 100 - vds.getUsageCpuPercent())); + int score = MaxSchedulerWeight - 1; + if (vds.getVmCount() > 0) { + if (vdsGroup == null) { + vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(hosts.get(0).getVdsGroupId()); + } + score -= + calcEvenDistributionScore(vds, vm, vdsGroup != null ? vdsGroup.getCountThreadsAsCores() : false); + } + scores.add(new Pair<Guid, Integer>(vds.getId(), score)); } return scores; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java index 139fb45..000192a 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java @@ -1465,6 +1465,10 @@ @DefaultValueAttribute("false") ExternalSchedulerEnabled(534), + @TypeConverterAttribute(Integer.class) + @DefaultValueAttribute("1000") + MaxSchedulerWeight(535), + Invalid(65535); private int intValue; diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql index 9590bee..a66b4ff 100644 --- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql +++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql @@ -358,6 +358,7 @@ select fn_db_add_config_value('GlusterFsStorageEnabled','false','3.1'); select fn_db_add_config_value('GlusterFsStorageEnabled','false','3.2'); select fn_db_add_config_value('GlusterFsStorageEnabled','true','3.3'); +select fn_db_add_config_value('MaxSchedulerWeight','1000','general'); select fn_db_add_config_value('MTUOverrideSupported','false','3.0'); select fn_db_add_config_value('MTUOverrideSupported','true','3.1'); select fn_db_add_config_value('MTUOverrideSupported','true','3.2'); diff --git a/packaging/etc/engine-config/engine-config.properties b/packaging/etc/engine-config/engine-config.properties index 6fcfea0..d399ae3 100644 --- a/packaging/etc/engine-config/engine-config.properties +++ b/packaging/etc/engine-config/engine-config.properties @@ -69,6 +69,8 @@ MaxNumOfVmSockets.type=Integer MaxRerunVmOnVdsCount.description="Max Virtual Machine Rerun Attempts on a Host" MaxRerunVmOnVdsCount.type=Integer +MaxSchedulerWeight.description="Max weight score for a single scheduler weight module" +MaxSchedulerWeight.type=Integer MaxStorageVdsDelayCheckSec.description="Max delay for check of domain in seconds" MaxStorageVdsDelayCheckSec.type=Integer MaxStorageVdsTimeoutCheckSec.description="Max timeout for last check of domain in seconds" -- To view, visit http://gerrit.ovirt.org/18560 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I55cf5014bc472bf1e126a9737829e7fcf7e21853 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.3 Gerrit-Owner: Gilad Chaplik <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
