Azure service fabric cpu使用率为100%时的CpuShares服务结构代码包值(最大值)

Azure service fabric cpu使用率为100%时的CpuShares服务结构代码包值(最大值),azure-service-fabric,service-fabric-stateless,Azure Service Fabric,Service Fabric Stateless,我有2个服务结构应用程序(sln)和3个服务(3个代码包)。我想将这些分配到最大CPU百分比的40%20%20%,而不考虑核心,即不限制CPU核心的数量(当前机器为4核逻辑)。根据上面的内容/博客,如果我指定CpuShares=512、CpuShares=256和CpuShares=256,那么它应该占用40%、20%、20%的最大CPU。然而,情况并非如此,它只允许各服务的最大CPU使用量的5%2%和2%。通过阅读本文() 我认为1024是CpuShares的默认值(最大值),经过多次尝试和错

我有2个服务结构应用程序(sln)和3个服务(3个代码包)。我想将这些分配到最大CPU百分比的40%20%20%,而不考虑核心,即不限制CPU核心的数量(当前机器为4核逻辑)。根据上面的内容/博客,如果我指定CpuShares=512、CpuShares=256和CpuShares=256,那么它应该占用40%、20%、20%的最大CPU。然而,情况并非如此,它只允许各服务的最大CPU使用量的5%2%和2%。通过阅读本文() 我认为1024是CpuShares的默认值(最大值),经过多次尝试和错误后,我最终得出了CpuShares的值10000,如果我们应用任何大于此值的值,我们会在服务浏览器中得到错误,称CpuShare的Arg无效。
因此,考虑10000=100%的CPU使用率是允许的。在测试中,我已将上述CPU共享值修改为CpuShares=4000、CpuShares=2000和CpuShares=2000。我可以看到最大CPU使用率为40%20%20%(不是精确的5%差异)。所以问题是我在任何文档中都找不到10000=100%的CPU使用率值。因此,我想确认这是否正确,如果不正确,那么如何将服务或代码包限制为特定的百分比。请在这方面提供帮助。

关于SF中服务的资源治理的一个常见误解是,它是为您的服务保留的资源和隔离的容量,就像在docker容器上一样,这是错误的

这些指标只是保持集群中服务平衡的软限制,并不意味着它们专门为您的服务保留,其他服务可以,并且如果没有设置限制,它们将消耗这些资源

为了使资源限制强制生效,服务包中的所有代码包都应该指定内存限制

这些指标用于在集群中找到服务的适当平衡,并将服务放置在具有可用资源的节点中,因此假设您有服务a、B和C,并且每个服务都有特定数量的资源需求,比如内存,这是一个易于理解的值,a=1000MB,B=512MB,C=512MB,而a节点有2GB的内存,这些内存可以放在同一个节点上,因此假设服务C需要1000MB,当服务C需要激活时,它将避免激活a和B的同一个节点,因为它没有在其中运行的能力,即使这些服务没有消耗所有请求的资源,将选择另一个节点

从:

服务结构运行时当前未为提供保留 资源。当进程或容器打开时,运行时设置 创建时定义的加载的资源限制。 此外,运行时拒绝打开新的服务包 超过资源时可用的

关于您关于股票的主要问题:

相同的文档描述了共享是保留给服务包的保留CPU核心的一部分,在该节点上激活的所有代码包之间分割,如果您为每个代码包定义共享,那么它们的总和将是总的,并且每个都将获得这些共享的一部分

这些股票是如何控制的

请记住,下面的内容在任何地方都没有正式的文档记录,我可能在某些方面是错的,我从源代码中获得了这些信息,可能遗漏了一些细节

假设激活了带有代码包a和B的服务包,并进行了以下共享拆分:

  • 代码包A(CP.A)=1500股
  • 代码包B(CP.B)=500股
SF将:

  • 确定为服务包保留的CPU核心容量:
    • 容量将是CPU核心保留容量(%)/总可用容量
    • 在4核cpu上:保留1核cpu=25%
  • 从代码包中获取所有共享并对其值求和,以确定多少共享应代表100%的保留容量(25%)
    • 1500+500=2000股总股数
    • CP.A应接受4的3个分数
    • CP.B应获得4的1分
  • 将共享部分转换为CPU作业周期(请参见下面的原因)
    • CP.A应接受10000->7500次循环的3/4
    • CP.B应接受10000->2500次循环的1/4
  • 将保留的周期数乘以保留的cpu内核数量
    • CP.A应接受7500次循环的25%
    • CP.B应接受2500次循环的25%
这些限制受到以下限制:当流程(代码包)被激活时,它被分配给设置了这些限制的作业,每当流程消耗的周期超过作业中设置的限制时,线程被抢占,并且在核心中调度另一个流程线程。在代码中,他们建议
10000表示所有可用的内核
,但正确的是
作业对象中的线程在每个调度间隔期间可以使用的处理器周期数
。在作业中,10000个周期是每个作业计划的间隔,在此作业中计划了一个线程并将消耗此计划的x个周期,如果保留4个内核,则仅消耗10000个周期

确切的逻辑在这段代码中:

    double shares = fractionOfSp * Constants::JobObjectCpuCyclesNumber;
    shares = shares * (numCoresAllocated / max(numAvailableCores_, systemCpuCores_));
    rg.CpuShares = static_cast<uint>(shares);

    //fractionOfSp -> Fraction of a Service Package
    //   - A service package represents 100% (Like a Pizza) of reserved core capacity
    //   - Each Code Package will have one or more fraction (A slice of the pizza)
    //Constants::JobObjectCpuCyclesNumber -> is a constant for 10000 cycles
    //numCoresAllocated -> How many cores you assigned to a service package
double shares=fractionOfSp*常量::JobObjectCpuCyclesNumber;
股份=股份*(numCoresAllocated/max(numAvailableCores,systemCpuCores));
rg.CpuShares=静态铸造(股份);
//fractionOfSp->服务包的分数
//-服务包代表保留核心容量的100%(如比萨饼)
//-每个代码包将有一个或多个部分(比萨饼的一片)
//常量::JobObjectCpuCyclesNumber->是10000个周期的常量
//numCoresAllocated->有多少个cor