在迁移FTX实时消费程序到Flink时,遇到消费性能问题,QPS一直上不去,如下图所示:
说明:
接下来借着这个案例,我们从性能分析的四个方面(CPU、内存、Disk IO和网络)来说说跟容器有关的那些事。
容器 = Namespace + Cgroups
Namespace帮助容器来实现各种计算资源的隔离,Cgroups主要限制的是容器能够使用的某种资源量。
Namespace的类型如下图所示:
几种常见的Cgroup子系统:
在宿主机上执行 top
命令:
请注意上面圈出来的地方跟软中断相关!!!
在容器里执行 top
命令:
说明:top
命令是通过读取 /proc/stat
文件来得到CPU使用了多少ticks,这里的ticks是指操作系统里的一个时间单位,具体分类见下图:
单个容器CPU使用率计算公式如下:
单个容器CPU使用率 = (进程的ticks / 单个CPU总ticks) * 100.0
= ((utime_2 – utime_1) + (stime_2 – stime_1)) * 100.0 / (HZ * et * 1 )
说明:
我们可以从 cpuacct.stat
文件中获取控制组里所有进程用户态和内核态的ticks,如下图所示:
代入公式中,整个容器的CPU使用率=((77606 - 77564) + (15676 - 15666)) * 100.0 / (100+1+1) = 50
上面发现软中断有异常,接下来具体看看软中断的情况,执行 watch -d cat /proc/softirqs
,如下图所示:
说明:
[ksoftirqd/11]
free命令和top命令都不能直接在容器中执行,即便是能够执行,也不能反映容器的情况。
如上图所示,可以查看容器中memory Cgroup下面的 memory.stat
文件,这里面有控制组内存信息。
一般我们会选择禁止透明大页,避免发生Compaction,如下图所示:
禁止透明大页的命令如下:
# 临时生效
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 保证重启生效
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
使用 iostat
命令查看宿主机IO情况:
Linux两种文件IO模式:Direct IO 和 Buffered IO
注意:
使用 sar
命令查看宿主机网络情况:
一般地,网络接口有两类:一类是veth,另一类是macvlan/ipvlan。其中,veth用的比较多。
说明:
在生产环境使用 tcpdump
抓包的话,可能瞬间就会有几个GB的数据,这种情况下比较推荐的是使用 netstat
命令来查看协议栈中的丢包和重传情况。
在宿主机上使用 lsns
命令查看系统里已有的 Network Namespace:
使用 nsenter 命令进入指定的Namespace:
使用perf采样:
下载FlameGraph:
git clone https://github.com/brendangregg/FlameGraph
将perf采样数据生成火焰图:
打开svg文件,找出影响性能的“平顶”:
说明: