(k8s中)docker netty OOM问题记录

1、首先查看docker的内存占用情况:

docker top 容器名 -u 查看内存cpu占用率(容器名来自kubectl describe pod xxx或者docker ps)

可以看出内存一直增长,作为IO代理这是不正常的。

2、修改启动参数和配置文件

需要注意的是为了安全考虑,docker默认是不能使用一些调试手段的,需要修改启动参数和yaml

docker file中增加启动参数(yaml中应该也可以):

c 复制代码
ENTRYPOINT ["java", "-jar", "/usr/local/bin/access-1.0-SNAPSHOT.jar", "-XX:NativeMemoryTracking=detail"]

yaml增加:

c 复制代码
apiVersion: apps/v1
kind: Deployment
.......
spec:
  ........
  template:
    ........
    spec:      
      containers:
        - name: access
          .........          
          securityContext:
              capabilities:
                add: ["SYS_PTRACE"]

3、查看具体内存占用

各类内存增长情况:

c 复制代码
#建立内存基线
jcmd 1 VM.native_memory baseline
#与基线对比
jcmd 1 VM.native_memory summary.diff

其中1是pid,可以通过jps查看

查看当前内存具体申请源:

c 复制代码
jcmd 1 VM.native_memory detail scale=MB  

查看结果是Other的内存增长比较明显:

c 复制代码
[0x00007f76b2143b77] Unsafe_AllocateMemory0+0x87
[0x00007f769577c4ba]
                             (malloc=732MB type=Other #228)

Unsafe_AllocateMemory0一般是ByteBuf申请的内存,jvm不管理,也就是不会gc,需要自己关注申请和释放

4、自己申请的ByteBuf

自己申请的ByteBuf要么往下传递(通过ctx write或者fire read)由后面的pipe节点释放,要么自己通过release释放。

如果是写入服务器response中的content,通过ctx.writeAndFlush往下传递,由netty去管就行了。

5、在pipe的handle中收到的msg

比如服务器上收到的request,如果不是最后一个节点,则必须显式传递:ctx.fireChannelRead(msg);

如果是最后一个节点则自己手动释放,可以content.release也可以ReferenceCountUtil.release(msg);

也可以继承SimpleChannelInboundHandler,SimpleChannelInboundHandler中会释放,不用自己释放了。

如果是服务器处理一个请求回复一个响应,一般是作为最后一个节点,可以继承SimpleChannelInboundHandler。

相关推荐
张忠琳9 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
Elastic 中国社区官方博客10 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
风曦Kisaki13 小时前
#企业级docker私有仓库构建:harbor仓库与阿里云镜像仓库
阿里云·docker·容器
期待着201313 小时前
docker 安装 ,在centos7.9
运维·docker·容器
骑上单车去旅行15 小时前
Docker Compose 命令完全指南:从构建到运维
docker·容器·eureka
前端Baymax16 小时前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc17 小时前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
java_logo17 小时前
Docker Compose 部署 Apache Superset:轻松搭建开源 BI 平台
docker·开源·apache·superset·轩辕镜像·superset部署方案·docker superset
zy happy17 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
阿标在干嘛1 天前
从物理机到K8s:政策快报平台的容器化部署实践
云原生·容器·kubernetes