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 요청 수가 표시됩니다. 즉, 대기하거나 전송되며 지금까지 응답이 수신되지 않았습니다.

    숫자가 높으면 다음 조건 중 하나를 나타냅니다.

    • pmproxy 프로세스는 새 PCP 아카이브를 처리하는 데 사용 중이며 Redis 요청 및 응답을 처리하는 데 필요한 CPU 사이클은 없습니다.
    • Redis 노드 또는 클러스터가 과부하되어 제 시간에 들어오는 요청을 처리할 수 없습니다.
  • 메모리 사용량이 많은 문제를 해결하려면 이 팜의 pmlogger 프로세스 수를 줄이고 다른 pmloggerarm을 추가합니다. 페더레이션 - 여러 pmloggerarms 설정을 사용합니다.

    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 요청 수를 보려면 pmproxy.redis.requests.inflight.total 지표 및 pmproxy.redis.requests.inflight.bytes 지표를 참조하여 현재의 모든 inflight Redis 요청에 의해 사용되는 바이트 수를 확인합니다.

    일반적으로 redis 요청 대기열은 0이지만 대규모 pmloggerarms를 사용하여 빌드할 수 있으므로 확장성은 제한되고 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 지표를 참조하십시오.

추가 리소스