Sentinel在docker中获取CPU利用率的一个BUG

Sentinel简介

微服务治理中限流、熔断、降级是一块非常重要的内容。目前市面上开源的组件也不是很多,简单场景可以使用Guava,复杂场景可以选用Hystrix、Sentinel。今天要说的就是Sentinel,Sentinel是一款阿里开源的产品,只需要做较少的定制开发即可大规模线上使用。从使用感受上来说,它有以下几个优点:

  • 轻量级,对性能损耗几乎可以忽略不计,只有在单机上万QPS才稍有体现;
  • 开箱即用的控制台,可以动态灵活地配置各种限流降级规则,持久化规则需要定制插件;
  • 支持单机、集群限流,支持无侵入接入多种框架,如dubbo、grpc、springMVC,几种reactive的网关框架、甚至最新版本支持的Envoy限流等;
  • 丰富的限流规则,可按qps、线程数、热点参数限流、系统自适应限流;熔断规则同样丰富,可按响应时间,异常数,异常比例等。

docker中获取cpu利用率的BUG

经典的使用场景是服务消费方在调用提供方时,如果提供方是弱依赖,则可设置一个异常比例的降级规则;对于服务提供方提供的接口可设置一个qps或者线程数的限流规则,并再设置一个“保命”的系统自适应限流。系统自适应限流是系统根据自身的情况,如入口qps,总线程数,cpu load,cpu利用率等系统级指标来限制访问量,可谓是最后的保命神器。

image

Sentinel在docker中获取cpu利用率是有问题的。先看一下获取cpu利用率的代码:
image

这里获取cpu load和cpu利用率是通过MXBean的方式获取,从Java文档上能看出getSystemLoadAverage和getSystemCpuLoad方法获取的分别是系统的平均load和“归一化”后的cpu利用率。
如果是在物理机或者虚拟机上运行,这些代码可以获取到我们想要的数据,但是在docker里面就不一定了,docker中获取到的是宿主机的cpu load与cpu利用率。于是去Sentinel下提了个issue(这也是使用开源产品的好处)。没多久回复说用JDK10,但是生产环境中想升级个JDK也并不是那么简单。
过了很久之后终于有人通过代码解决了这个问题。
image

理解系统负荷

初次看到这段代码是蒙圈的,主要是对cpu利用率与cpu load的定义不熟悉,查阅了一些资料得知cpu利用率是指程序的cpu占用时间除以程序的运行时间,比如单核情况下,一个java程序运行了10秒,其中占用了cpu 1秒,那么cpu利用率为10%,注意这个百分比并不一定小于100%,因为有多核的并行能力存在,比如一个4核的机器运行了一个java程序10秒,占用了每个核5秒的cpu时间,那么总的cpu占用时间是20秒,cpu利用率就是200%。但是在OperatingSystemMXBean的文档中指出将其归一化了,也就是cpu利用率再除以cpu核数。cpu load在阮一峰的文章《理解linux系统负荷》中能很好地解释清楚了,概括一下cpu load就是运行中的进程数加上等待运行的进程数。
为什么有了cpu利用率还需要cpu load这个指标呢?因为在系统满负荷的情况下,同样是100%的cpu利用率,谁的负荷更高?就需要cpu load来比较了,cpu load不仅表示了当前的cpu利用率,也预示了未来的利用率。
理解了cpu利用率与cpu load再结合Java文档就能明白这段代码的意思了,计算出每次JVM的运行时间差值与占用cpu的时间差值,利用cpu占用时间差值除以JVM运行时间差值,再除以cpu的核数,计算出归一化后的cpu利用率,每次都计算差值是Sentinel为了取到比较精确的“瞬时”cpu利用率,而不是一个历史平均值。
这段代码有三个缺陷,一是准确获取docker分配的cpu核数是从JDK8u131版本开始,之前版本调用OperatingSystemMXBean.getAvailableProcessors 和 Runtime.getRuntime().availableProcessors() 都会返回宿主机的核数,幸好目前使用的版本都大于此版本;二是这段代码只能统计单一进程的cpu占用率,如果容器中运行了两个java程序,那么每个进程只能统计自己占用的cpu而不知道整个系统处于何种状态,从生产环境来看这种情况出现的概率不大,docker容器中运行的一般是单一进程;三是最终算出的cpu利用率取了宿主机cpu利用率和当前进程算出的cpu利用率的较大值,在docker的cpu被限制或者被绑定时,即cpu资源被隔离时,这两个值可能会相差很大,这时也并不太需要关注宿主机的cpu利用率。


欢迎关注我的公众号“捉虫大师”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容