Memo

共 6 条灌水 · 4

修正 ZFS 主机的 Node Exporter 内存告警

Node Exporter 只导出 /proc/meminfo,不计算内存使用率。Grafana 和 Prometheus 通常使用:

100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)

Linux 计算 MemAvailable 时不会把 ZFS ARC 计入可回收页缓存。AMD GTT 使用系统内存,但进程 RSS 和 Pod working set 不会完整反映这部分分配。因此,topkubectl top 不能直接核对上述结果。

现场数据:ZFS ARC 43.2 GiB,AMD GTT 27.9 GiB,kubectl top node 42.3 GiB;原公式得到 94.2%。

检查相关数据:

free -h
grep -E '^(size|c_min) ' /proc/spl/kstat/zfs/arcstats
grep -H . /sys/class/drm/card*/device/mem_info_gtt_used
grep -H . /proc/pressure/memory

告警将高于 c_min 的 ARC 计为可回收内存。没有 ZFS 指标时,or ... * 0 回退到原公式:

(
  node_memory_MemAvailable_bytes
  + (
    clamp_min(node_zfs_arc_size - node_zfs_arc_c_min, 0)
    or node_memory_MemTotal_bytes * 0
  )
) / node_memory_MemTotal_bytes < 0.10

面板分别展示 effective used、ZFS ARC、Linux page cache、GPU GTT 和 swap used。amd_gpu_used_gtt 的单位是 MiB,与 Node Exporter 的字节指标合并时需乘 1024 * 1024

该口径用于减少 ARC 引起的误报。实际内存压力仍需检查 swap-out 和 memory PSI。

启用 Java GC 日志轮转

java -jar ./gclog-1.0-SNAPSHOT.jar \
  -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10K \
  -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/gc-%t.log \
  -XX:+UseG1GC -XX:MaxGCPauseMillis=200

允许 perf 采集内核回溯

出现以下报错时:

Perf-based stall detector creation failed (EACCESS), try setting /proc/sys/kernel/perf_event_paranoid to 1 or less to enable kernel backtraces: falling back to posix timer.

perf_event_paranoid 设为 1:

sudo sh -c 'echo 1 > /proc/sys/kernel/perf_event_paranoid'

理解 Nginx 499 与客户端超时

若 Nginx 的 upstream 超时为 60 秒,而客户端请求超时为 15 秒,处理超过 15 秒的请求会先被客户端断开。Nginx 尚未达到 504 的判定阈值,因此记录为 499。

排查时应同时核对客户端、代理和 upstream 的超时配置。

使用 Docker Compose 运行 node-exporter

services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node-exporter
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'