5.12. 对高内存使用量进行故障排除

以下情况可能会导致内存用量:

  • pmproxy 进程忙于处理新的 PCP 归档,且没有处理 Redis 请求和响应的备用 CPU 周期。
  • Redis 节点或集群已过载,且无法在时间处理传入的请求。

pmproxy 服务守护进程使用 Redis 流并支持配置参数,这些参数是 PCP 调优参数,并影响 Redis 内存用量和密钥保留。/etc/pcp/pmproxy/pmproxy.conf 文件列出了 pmproxy 和关联的 API 的可用选项。

以下流程描述了如何对高内存使用率问题进行故障排除。

先决条件

  1. 安装 pcp-pmda-redis 软件包:

    # dnf install pcp-pmda-redis
  2. 安装 redis PMDA:

    # cd /var/lib/pcp/pmdas/redis && ./Install

步骤

  • 要排除高内存用量的问题,请执行以下命令并观察 inflight 列:

    $ pmrep :pmproxy
             backlog  inflight  reqs/s  resp/s   wait req err  resp err  changed  throttled
              byte     count   count/s  count/s  s/s  count/s   count/s  count/s   count/s
    14:59:08   0         0       N/A       N/A   N/A    N/A      N/A      N/A        N/A
    14:59:09   0         0    2268.9    2268.9    28     0        0       2.0        4.0
    14:59:10   0         0       0.0       0.0     0     0        0       0.0        0.0
    14:59:11   0         0       0.0       0.0     0     0        0       0.0        0.0

    此列显示有多少 Redis 请求是 in-flight,这意味着它们被排队或发送,目前还没有收到回复。

    数字表示以下条件之一:

    • pmproxy 进程忙于处理新的 PCP 归档,且没有处理 Redis 请求和响应的备用 CPU 周期。
    • Redis 节点或集群已过载,且无法在时间处理传入的请求。
  • 要对高内存使用问题进行故障排除,请减少此场的 pmlogger 进程数量,再添加另一个 pmlogger 场。使用联邦 - 多个 pmlogger farm 设置。

    如果 Redis 节点使用 100% 的 CPU 延长的时间,请将其移到具有更好的性能的主机,或使用集群的 Redis 设置。

  • 要查看 pmproxy.redis.* 指标,请使用以下命令:

    $ pminfo -ftd pmproxy.redis
    pmproxy.redis.responses.wait [wait time for responses]
        Data Type: 64-bit unsigned int  InDom: PM_INDOM_NULL 0xffffffff
        Semantics: counter  Units: microsec
        value 546028367374
    pmproxy.redis.responses.error [number of error responses]
        Data Type: 64-bit unsigned int  InDom: PM_INDOM_NULL 0xffffffff
        Semantics: counter  Units: count
        value 1164
    [...]
    pmproxy.redis.requests.inflight.bytes [bytes allocated for inflight requests]
        Data Type: 64-bit int  InDom: PM_INDOM_NULL 0xffffffff
        Semantics: discrete  Units: byte
        value 0
    
    pmproxy.redis.requests.inflight.total [inflight requests]
        Data Type: 64-bit unsigned int  InDom: PM_INDOM_NULL 0xffffffff
        Semantics: discrete  Units: count
        value 0
    [...]

    要查看有多少 Redis 请求在flight 中,请参阅 pmproxy.redis.requests.inflight.total 指标和 pmproxy.redis.requests.inflight.bytes 指标来查看所有当前在flight Redis 请求中消耗的字节数。

    通常,redis 请求队列为零,但可以根据大型 pmlogger 场的使用而构建,这限制了可扩展性,并可能导致 pmproxy 客户端的高延迟。

  • 使用 pminfo 命令查看有关性能指标的信息。例如,要查看 redis.* 指标,请使用以下命令:

    $ pminfo -ftd redis
    redis.redis_build_id [Build ID]
        Data Type: string  InDom: 24.0 0x6000000
        Semantics: discrete  Units: count
        inst [0 or "localhost:6379"] value "87e335e57cffa755"
    redis.total_commands_processed [Total number of commands processed by the server]
        Data Type: 64-bit unsigned int  InDom: 24.0 0x6000000
        Semantics: counter  Units: count
        inst [0 or "localhost:6379"] value 595627069
    [...]
    
    redis.used_memory_peak [Peak memory consumed by Redis (in bytes)]
        Data Type: 32-bit unsigned int  InDom: 24.0 0x6000000
        Semantics: instant  Units: count
        inst [0 or "localhost:6379"] value 572234920
    [...]

    要查看峰值内存用量,请参阅 redis.used_memory_peak 指标。

其他资源