Used memory hits the high watermark(0.800000) of total system memory

部署方式:单机
内核版本: 3.6
安装包:rpm
是否为线上版本:Y

具体部署内容
Dockerfile

FROM centos:7

# 下载 NebulaGraph
RUN yum install -y wget
RUN wget https://oss-cdn.nebula-graph.com.cn/package/3.6.0/nebula-graph-3.6.0.el7.x86_64.rpm

# 安装 RPM 包
RUN rpm -ivh nebula-graph-3.6.0.el7.x86_64.rpm

nebula-deployment.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nebula-graph
spec:
  serviceName: nebula-service
  replicas: 1
  selector:
    matchLabels:
      app: nebula-graph
  template:
    metadata:
      labels:
        app: nebula-graph
    spec:
      containers:
        - name: nebula-graph
          imagePullPolicy: Always
          image: qiuchen123/nebula-graph:3.6.0
          ports:
            - name: graphd-thrift
              containerPort: 9669
              protocol: TCP
          command: [ "/bin/sh", "-c", "/usr/local/nebula/scripts/nebula.service start all && tail -f /dev/null" ]
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /status
              port: 19669
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 5
          resources:
            limits:
              cpu: "2"
              memory: 2Gi
            requests:
              cpu: 500m
              memory: 500Mi
          volumeMounts:
            - mountPath: /usr/local/nebula/data
              name: nebula-data
            - mountPath: /usr/local/nebula/logs
              name: nebula-logs
  volumeClaimTemplates:
    - metadata:
        name: nebula-data
      spec:
        storageClassName: standard-nfs-storage
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 2Gi
    - metadata:
        name: nebula-logs
      spec:
        storageClassName: standard-nfs-storage
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 2Gi
---

apiVersion: v1
kind: Service
metadata:
  name: nebula-service
spec:
  selector:
    app: nebula-graph
  ports:
    - name: graphd-thrift
      port: 9669
      protocol: TCP
      targetPort: 9669
      nodePort: 31669
  type: NodePort 

问题现象
所有涉及查询nebula的接口都会报类似的错误

对应的内存使用如下:


在04:00的时间,做了pod重启,nebula才恢复可用

涉及的查询:
MATCH (v:ad_scene_tag) WHERE NOT ()-[:IS_PARENT_OF]->(v) RETURN v;
MATCH (p:ad_scene_tag)-[:IS_PARENT_OF]->(c:ad_scene_tag) WHERE id(p) IN $parentIds RETURN id(p) as parentId, c as child;
MATCH (p:ad_scene_tag)-[:IS_PARENT_OF]->(c:ad_scene_tag) WHERE id(p) IN $parentIds RETURN id(p) as parentId, c as child;

从监控的数据上看,进程并没有达到设置的 memory limits 的 0.8 倍,理论上不应该触发内存的限制。如果下次再出现上面的情况,可以看看对应 POD 中这个文件中列的下面几个指标:

如果是 cgroup v1:

  • /sys/fs/cgroup/memory/memory.limit_in_bytes
  • /sys/fs/cgroup/memory/memory.usage_in_bytes

如果是 cgroup v2:

  • /sys/fs/cgroup/memory.max
  • /sys/fs/cgroup/memory.current

用第二个值除以第一个值就得到内存水位了,看看是不是超过了 0.8。目前看下来实际的报错跟监控的数据不太一致。

另外,可以提供一下线上环境的内核版本吗?

1 个赞

内核版本信息如下:

cat /proc/version
Linux version 3.10.0-1160.99.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Wed Sep 13 14:19:20 UTC 2023

我现在猜测其中的原因为,你们自己打的 docker image 中,没有在 entrypoint 里面指定 containerized,具体的指令参看下面的文件:https://github.com/vesoft-inc/nebula/blob/master/docker/Dockerfile.graphd#L24

这个 flag 会影响是读取宿主机的内存状态还是 container 中的 cgroup 的内存状态。所以虽然 nebula 的进程位于容器内,但是并没有被 cgroup 限制住,就出现了刚开始的监控跟预期行为不一致的地方了。

如果不是特殊的原因,建议可以直接使用社区构建好的 docker image: vesoft/neubla-graphd:latest

1 个赞

这种问题今天又发生了。刚好记录了下当时的指标数据:

cat /sys/fs/cgroup/memory/memory.limit_in_bytes
2147483648

cat /sys/fs/cgroup/memory/memory.usage_in_bytes
293806080

从数据上看,也是远远没有不到0.8

同时宿主机的指标数据也拿到了:

free -h
              total        used        free      shared  buff/cache   available
Mem:           187G        152G         18G        3.2G         16G         30G
Swap:            0B          0B          0B

从结果上来看,应该是监控到了宿主机指标

如果真如这样的话,单纯的重启pod应该是不会起作用的

索性修改system_memory_high_watermark_ratio参数,最终的Dockfile内容如下:

FROM centos:7

# 下载 NebulaGraph
RUN yum install -y wget
RUN wget https://oss-cdn.nebula-graph.com.cn/package/3.6.0/nebula-graph-3.6.0.el7.x86_64.rpm

# 安装 RPM 包
RUN rpm -ivh nebula-graph-3.6.0.el7.x86_64.rpm

# 修改 nebula-graphd.conf 文件
RUN sed -i 's/--system_memory_high_watermark_ratio.*/--system_memory_high_watermark_ratio=0.9999/' /usr/local/nebula/etc/nebula-graphd.conf

目前来看正常了

上面的方法就相当于不再限制内存了,不清楚你们 dockerfile 怎么实现和容器又是怎么启动的,看上面的 Dockerfile 的内容,只有安装的命令,并没有 run or entrypoint 的命令。你可以检查其中的启动进程的地方,--containerized=true 这个 flag 是一定要作为启动进程的命令参数的。

我们的运行模式有点奇怪,是接着k8s的外壳,运行的单机模式

我是参考了单机部署中的安装方式后,做了改动
Dockerfile负责下载、安装所需要的安装包(里面包含了运行nebula所需要的组件graphd、storaged、metad)
yaml文件中会将nebula服务启动起来

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。