本文是跟安信证券容器云技术团队共同进行问题排查的最佳实践。
问题背景
我们发现客户的Kubernetes集群环境中所有的worker节点的Kubelet进程的CPU使用率长时间占用过高,通过pidstat可以看到CPU使用率高达100%。本文记录下了本次问题排查的过程。
集群环境
排查过程
使用strace工具对kubelet进程进行跟踪
1、由于Kubelet进程CPU使用率异常,可以使用strace工具对kubelet进程动态跟踪进程的调用情况,首先使用strace -cp 命令统计kubelet进程在某段时间内的每个系统调用的时间、调用和错误情况。
从上图可以看到,执行系统调用过程中,futex抛出了五千多个errors,这并不是一个正常的数量,而且该函数占用的时间达到了99%,所以需要进一步查看kubelet进程相关的调用。
2、由于strace -cp命令只能查看进程的整体调用情况,所以我们可以通过strace -tt -p 命令打印每个系统调用的时间戳,如下:
从strace输出的结果来看,在执行futex相关的系统调用时,有大量的Connect timed out,并返回了-1和ETIMEDOUT的error,所以才会在strace -cp中看到了那么多的error。
futex是一种用户态和内核态混合的同步机制,当futex变量告诉进程有竞争发生时,会执行系统调用去完成相应的处理,例如wait或者wake up,从官方的文档了解到,futex有这么几个参数:
futex(uint32_t *uaddr, int futex_op, uint32_t val,
const struct timespec *timeout, /* or: uint32_t val2 */
uint32_t *uaddr2, uint32_t val3);
官方文档给出ETIMEDOUT的解释:
ETIMEDOUT
The operation in futex_op employed the timeout specified in
timeout, and the timeout expired before the operation
completed.
意思就是在指定的timeout时间中,未能完成相应的操作,其中futex_op