zoukankan      html  css  js  c++  java
  • CUP计算资源争抢通过IIS启用处理器关联解决

    由于业务的复杂性,我们在客户环境部署的时候,采用的是预装好在一台机器然后再把机器安装到客户环境,所以为了简单方便,我们把所有的服务都安装到一台机器上面了.

    在正常的使用过程中是没有任何问题的.但是当有一些复杂的计算资源的时候,就会造成计算资源争抢

    我们的诉求很明显,就是所有服务可以正常运行,这个时候我们就需要限制那些高计算资源占用的服务.

    此处对于造成我们CPU计算资源的两个应用服务分别叫A和B和数据库服务D

    A和B都是托管于IIS中,D是sql server 2014服务

    A是计算资源争抢的元凶,所以我们需要对A服务限制其CPU计算资源的使用

    方案一:限制A服务的最大计算资源使用百分比

    在我们的IIS的应用程序高级池的高级设置中,有CPU设置相关参数如下图

     我们将限制设置成70%,然后将限制的操作(LimitAction)设置成Throttle

    具体参数什么意思可参考下图,图片文档链接

     设置完成上图参数后我们还需要设置一下监视间隔,发现最小1min,也就是说如果发生超出指定比例的资源争抢,操作系统也可能需要1min之后才能发现并释放资源.

    显然这个时间间隔对于线上环境是无法忍受的

    测试后发现基本和预期一样,1min太长了,直接导致B服务无法响应用户需求

    方案一宣布失败

    方案二:指定应用使用的CPU核心

    同样在IIS对应的应用的程序池的高级设置中的CPU配置卡片中进行相关操作

    我们主要是需要用到ProcessorAffinity这个参数,去启用处理器关联掩码

    1.将Processor Affinity Enabled设置成 ture

    2.设置关联的CPU核心.

    第2步设计比较繁琐,我们需要设置每个CPU核心的掩码

    根据微软官方文档介绍,我们需要转成16进制进行设置,官方文档如下截图

      其大致意思是CPU的掩码是从右往左开始数的,以二进制掩码进行标识.第一位是标识符第二位如果是1则使用第一个核心,某一位是0则不启用对应位置的cpu核心,

    将得到的二进制换算成16进制填入参数就行

      我们当前机器的CPU是16核心的,如果所有的核心都允许该应用使用的话则二进制标识就是 0b 1111111111111111,其中0b标识的该数字是二进制.

      我们当前的核心中前5个核心留给其他应用,只给A应用使用后面的11个核心,则我们的二进制标识则是  0b 1111111111100000,

    将0b 1111111111100000换成16进制就是  0xffe0,其中是0x是16进制的标识.

      我们将生成的参数0x1ffc0填入Processor Affinity Mask和Processor Affinity Mask(64)两处,效果如下图

    至此方案二配置完成.我们发现基本上实现我们的预期.应用A只是使用自己指定的核心.

    但是此处又暴力出了另外一个问题.在个别情况下剩余的核心会被D服务消耗完,依然不能给到B.

    方案二补充方案:设置sql server的CPU核心使用数量

    设置sql server就简单很多了

    右击sql server连接服务=>Properties=>Processors

    去除 Automatically set processor affinity mask for all processors的勾选

    然后点击下方的all,选择指定的核心就行,我们选择前两个,如下图所示

    至此我们整个过程配置完成,经测试计算资源抢占导致的B服务失去响应问题完美解决

  • 相关阅读:
    【Python】协程
    【设计模式】单例模式
    【Python】闭包和装饰器
    【面试题】Python
    10、Go语言基础之指针
    9、Go语言基础之函数
    8、Go语言基础之map
    15、Python Scrapy Web爬虫框架【3】
    14、Python Scrapy Web爬虫框架【2】
    Redis遇到的坑
  • 原文地址:https://www.cnblogs.com/albertay/p/11650053.html
Copyright © 2011-2022 走看看