容器性能调试: CPU Bottleneck

最近遇到一个有趣的问题:假如一个 container CPU usage 达到了 CPU limit(比方说都 50%),该怎么办?

一个简单的思路就是把 CPU cap 调高一点。而 CPU cap 又由 CFS quota 来实现。我们知道,如果 CPU 不是 throttled 在 cgroup cap,增大 cpu.cfs_quota_us 并不会给予 container 更多的 CPU 资源。

在没有了解问题的根源之前,做任何决定是不妥的。Debug 中一个常用的方法,就是首先猜测可能结果,然后反推中间过程,再去追寻根源迹象。

对于开头问题,有以下几种可能:

  1. Throttled by CPU cap.
  2. Throttled by cpu.share/cpuset.
  3. Throttled by physical CPU resources.

Throttled by CPU cap

这种情况下是 cgroup 做 throttling。我们需要在 cgroup 里面读 cpu.stat 的 throttled_time 就可知 cgroup 是否做了 throttling。

目前 docker 并没有 expose 这个 metrics 出来。只能在 cgroup 里面找。

首先找出 cgroup cpu mount:

# cat /proc/mounts | grep cgroup
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup ...

然后找出 container pid:

# docker inspect $container_id | grep -i pid
       "Pid": 2163

然后去找到对应的 cgroup dir (note: /kubepods 是一个 known convention. 不加也行):

# find /sys/fs/cgroup/cpu,cpuacct/kubepods -type f -name "tasks" | xargs grep "$pid"
/sys/fs/cgroup/cpu,cpuacct/kubepods/burstable/podc0798a90-e905-11e7-b5b4-42010a8000b1/7bd54b4c7c57c54f8696e9819f01a50c4eda7012d282ad319831544d60c5fb48/tasks:2163

然后在上面找到的 dir 里面读取 cpu.stat:

# cat /sys/fs/cgroup/...c5fb48/cpu.stat
nr_periods 0
nr_throttled 0
throttled_time 10000

如果观察到 throttled_time 在不断增加,就说明 throttled by cgroup cap。

Throttled by cpu.share/cpuset or physical CPU

这些情况下都是 CFS scheduler 把 task 给 context switch 了。

我们可以通过上一节找的 pid 查 process status:

# cat /proc/2163/status
nonvoluntary_ctxt_switches: 703

如果观察到 nonvoluntary_ctxt_switches 不断增加,就说明 task 被不断地 context switch。但是我们还不能确定 CPU 是否吃满了。因为如果有其他 cgroup tasks 存在并且他们都闲着,这时候 CPU 就没有被吃满。

这时候我们能做的就是检查其他 tasks 的 cpu usage。一般就 docker stat 或 top 检查下。如果其他 tasks cpu usage 都很高,说明 throttled by physical CPU;可以考虑把容器迁移到其他空闲机器上去。如果其他 tasks 有 idle 的,说明有空闲资源,可以调整调整相关配置,把 cpu resource 应用得更饱满。

总结

我常常听人教诲:遇到一个问题,先要仔细思考,切忌妄下定论。上面这个例子就是最好的佐证。通过深入学习,还可以发掘更多的知识,比如上面检查 CPU 是否被吃满还可以用来做调度优化的基础。

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

推荐阅读更多精彩内容

  • yarn默认只管理内存资源,虽然也可以申请cpu资源,但是在没有cpu资源隔离的情况下效果并不是太好.在集群规模大...
    哪天改改阅读 11,083评论 5 9
  • muahao阅读 2,069评论 0 3
  • 一直想活成这样子,奈何……
    糖果_bf9b阅读 155评论 0 0
  • 1 我小时候记忆最深的人物之一就是解老师,我的英语老师。 她可以帮我答疑解难,可以帮我讲任...
    哈喇橘子阅读 259评论 1 1
  • 越来越多的故事不再真实 你是谁 我又是谁 我喝醉了酒 听着醉了酒的你在讲故事 哄着你睡着 我又拿起笔继续虚伪 年轻...
    楴迩阅读 134评论 0 0