K8S pod内存告警分析

简介: K8S pod内存告警分析

**背景:**

目前prometheus 给pod的内存告警阀值设置的80%,由于JVM 设置最高申请内存为pod limit 的75%,通过arthas查看到堆内存和元空间占用内存之和跟prometheus告警值不同。

**一、排查步骤:**

**1、prometheus 告警使用参数****

使用container_memory_rss值进行告警


   ```html

- alert: Pod内存使用率

       expr: |

          sum(container_memory_rss{image!=""}) by(pod, namespace) /

          sum(container_spec_memory_limit_bytes{image!=""}) by(pod, namespace) * 100 != +inf > 80

       for: 5m

       labels:

         severity: warning

       annotations:

         summary: "命名空间: {{ $labels.namespace }} | Pod名称: {{ $labels.pod }} 内存使用大于80% (当前值: {{ $value }})"

```

**2、找到pod运行node节点**

```html

[root@pro-k8s-master ~]# kubectl -n msApp

```

**3、通过Docker state 查看容器资源**

```html

[root@k8s-node1 ~]# docker ps |grep mayi-center-64ddfdd6-5crl6

[root@pro-node1 ~]# docker ps |grep mayi-center-64ddfdd6-2dzpt

b6b3733024c2   192.168.0.45/middleground-business-center/pro_mayi-center            "sh -c 'JAVA $JAVA_O…"   7 days ago          Up 7 days                               k8s_mayi-center_mayi-center-9d5d588c5-d7sgd_msapp_eac4e708-bd0a-483c-b5d4-734f95c9f1c7_0

5770fe14e7aa   registry.cn-shanghai.aliyuncs.com/google_containers/pause:3.1                 "/pause"                 7 days ago          Up 7 days                               k8s_POD_mayi-center-9d5d588c5-d7sgd_msapp_eac4e708-bd0a-483c-b5d4-734f95c9f1c7_0

[root@k8s-node1 ~]#docker state b6b3733024c2

CONTAINER ID        NAME                                                                                                         CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS

b6b3733024c2        k8s_mayi-center_mayi-center-9d5d588c5-d7sgd_msapp_eac4e708-bd0a-483c-b5d4-734f95c9f1c7_0   4.31%               1.788GiB / 2GiB     89.40%              0B / 0B             1.52MB / 137MB      132

```

**4、通过top -p 查看容器内存情况**

```html

[root@pro-k8s-node1 ~]# top -p 794890

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                      

794890 root      20   0 7483084   1.8g  15448 S   6.7  2.9 392:48.42 java

```

**5、通过ps查看**

```html

[root@pro-k8s-node1 ~]# ps -ef|grep mayi

root     277280 257311  0 10:33 pts/0    00:00:00 grep --color=auto mayi

root     794890 794871  3 Sep08 ?        06:32:39 java -XX:+UseContainerSupport .....mayi-center ..... -jar /app.jar

[root@pro-k8s-node1 ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep 794890

279183 grep            grep --color=auto 794890     0.0   960 112712 10:35 root         0

794890 java            java -XX:+UseContainerSuppo  3.8 1883224 7483084 Sep08 root      0

```

**6、查看jvm内存**

通过arthas-boot 查看堆内存和非堆内存

**二、查看结果**

1、通过top查看到容器内对应java进程占用内存为1.7G,跟prometheus几乎一致

2、通过ps 查看到容器内对应java进程占用内存为1.7G+,跟prometheus几乎一致

3、通过docker state 查看到容器内存查看内存内存为1.7G+,跟prometheus几乎一致

4、通过arthas-boot查看到jvm堆内存和非堆内存之和为1.6G+。

**三、结论**

由于通过prometheus pod内存告警和实际jvm查看到的内存不同带来的疑问,初步怀疑是jvm本身占用了部分内存。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
22小时前
|
Kubernetes 应用服务中间件 nginx
Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解
Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解
|
23小时前
|
运维 Kubernetes Linux
Kubernetes详解(九)——资源配置清单创建Pod实战
Kubernetes详解(九)——资源配置清单创建Pod实战
9 2
|
3天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes详解(六)——Pod对象部署和应用
在Kubernetes系列中,本文聚焦Pod对象的部署和管理。首先,通过`kubectl run`命令创建Pod,如`kubectl run pod-test --image=nginx:1.12 --port=80 --replicas=1`。接着,使用`kubectl get deployment`或`kubectl get pods`查看Pod信息,添加`-o wide`参数获取详细详情。然后,利用Pod的IP地址进行访问。最后,用`kubectl delete pods [Pod名]`删除Pod,但因Controller控制器,删除后Pod可能自动重建。了解更多细节,请参阅原文链接。
11 5
|
6天前
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
12 0
|
9天前
|
缓存 Linux
linux性能分析之内存分析(free,vmstat,top,ps,pmap等工具使用介绍)
这些工具可以帮助你监视系统的内存使用情况、识别内存泄漏、找到高内存消耗的进程等。根据具体的问题和需求,你可以选择使用其中一个或多个工具来进行内存性能分析。注意,内存分析通常需要综合考虑多个指标和工具的输出,以便更好地理解系统的行为并采取相应的优化措施。
28 6
|
12天前
|
机器学习/深度学习 分布式计算 数据处理
Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
【5月更文挑战第2天】Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
23 3
|
13天前
|
Kubernetes Perl 容器
在 Kubernetes 中重启 pod 的 3 种方法
【4月更文挑战第25天】
33 1
在 Kubernetes 中重启 pod 的 3 种方法
|
13天前
|
监控 算法 测试技术
【Go语言专栏】Go语言的性能优化与内存分析
【4月更文挑战第30天】本文探讨了Go语言的性能优化策略和内存分析方法。性能优化原则包括基准测试、分析瓶颈、避免过早优化和持续监控。优化策略涉及减少内存分配、避免内存逃逸、利用并发、优化算法和数据结构以及减少系统调用。内存分析借助于Go的`pprof`工具、内存分配跟踪和第三方工具,以发现内存泄漏和管理问题。通过这些方法,开发者能提升Go程序效率和资源利用率。
|
15天前
|
Kubernetes 网络协议 调度
kubernetes最小调度单元pod详解(二)
kubernetes最小调度单元pod详解(二)
|
15天前
|
Kubernetes 应用服务中间件 调度
kubernetes最小调度单元pod详解(一)
kubernetes最小调度单元pod详解(一)