시스템 상태 및 성능 모니터링 및 관리


Red Hat Enterprise Linux 10

시스템 처리량, 대기 시간 및 전력 소비 최적화

초록

성능 최적화에 TuneD, 하드웨어 및 소프트웨어 이벤트 모니터링을 위한 perf, 시스템 성능 분석을 위한 Performance Co- Cryostat(PCP)를 사용하여 RHEL 시스템의 성능을 모니터링, 분석 및 개선합니다. 성능 지표를 수집하고 특정 워크로드에 맞게 시스템을 구성하여 시스템 활동을 검토하고 성능 데이터를 기록하고 성능 데이터를 시각화하고 주요 설정(예: 디스크 스케줄러 및 전원 사용)을 조정합니다. 실시간 CPU 프로파일링 기술을 적용하고, 메모리 할당을 분석하고, 성능 병목 현상을 식별하고, 전력 소비를 효과적으로 관리하고, 잘못된 공유와 같은 문제를 탐지하여 시스템 효율성을 개선합니다.

Red Hat 문서에 관한 피드백 제공

당사는 고품질 문서를 제공하기 위해 노력하고 있으며 여러분의 피드백을 소중하게 생각합니다. 문서 개선을 돕기 위해 Red Hat Jira 추적 시스템을 통해 제안 사항을 제출하거나 오류를 보고할 수 있습니다.

프로세스

  1. Jira 웹 사이트에 로그인합니다.

    계정이 없는 경우 옵션을 선택하여 계정을 생성합니다.

  2. 상단 탐색 메뉴에서 생성 을 클릭합니다.
  3. 요약 필드에 설명 제목을 입력합니다.
  4. 설명 필드에 개선을 위한 제안을 입력합니다. 문서의 관련 부분에 대한 링크를 포함합니다.
  5. 창 하단에서 생성 을 클릭합니다.

1장. 성능 모니터링 옵션 개요

Red Hat Enterprise Linux 시스템의 성능을 모니터링하고 최적화하려면 특정 툴을 사용해야 합니다.

  • Performance Co- Cryostat(pcp)는 시스템 수준 성능 측정을 모니터링, 시각화, 저장 및 분석하기 위한 툴 모음입니다. 실시간 데이터의 모니터링 및 관리와 기록 데이터의 로깅 및 검색을 지원합니다.
  • RHEL은 네트워킹 5 외부에서 시스템을 모니터링할 수 있는 여러 명령줄 툴을 제공합니다. 다음은 기본 제공 명령줄 툴입니다.

    • procps-ng 패키지는 다음 유틸리티를 제공합니다.

      • top 유틸리티는 실행 중인 시스템의 프로세스 동적 보기를 제공합니다. 시스템 요약 및 Linux 커널에서 현재 관리 중인 작업 목록을 포함하여 다양한 정보를 표시합니다.
      • ps 유틸리티는 선택한 활성 프로세스 그룹의 스냅샷을 캡처합니다. 기본적으로 검사된 그룹은 현재 사용자가 소유하고 ps 명령이 실행되는 명령줄과 연결된 프로세스로 제한됩니다.
      • 가상 메모리 통계(vmstat) 유틸리티는 시스템의 프로세스, 메모리, 페이징, 블록 입력/출력, 인터럽트 및 CPU 활동에 대한 즉각적인 보고서를 제공합니다.
    • Cryo stat 패키지는 현재 날짜의 시스템 활동에 대한 정보를 수집하고 보고하는 시스템 활동 보고자(sar) 유틸리티를 제공합니다.
  • perf 는 하드웨어 성능 카운터 및 커널 추적 지점을 사용하여 시스템에서 다른 명령 및 애플리케이션의 영향을 추적합니다.
  • BCC -tools 는 BPF(Berkeley Packet Filter) Compiler Collection(BCC)을 기반으로 구축된 성능 분석 유틸리티 세트입니다. 커널 활동을 모니터링하는 100개 이상의 확장 BPF(eBPF) 스크립트를 제공합니다. 이러한 툴 각각에 대한 자세한 내용은 사용 방법 및 수행하는 기능에 대해 설명하는 도움말 페이지를 참조하십시오.
  • kernel-tools 패키지는 Intel 64 프로세서의 프로세서 토폴로지, 빈도, 유휴 전원 상태 통계, 온도 및 전원 사용량을 보고하는 turbostat 유틸리티를 제공합니다.
  • Cryo stat 패키지는 시스템 I/O 장치 로드를 모니터링하고 보고하는 iostat 유틸리티를 제공하여 관리자가 물리 디스크 간에 I/O 로드의 균형을 조정하는 방법을 결정할 수 있도록 지원합니다.
  • irqbalance 유틸리티는 하드웨어 인터럽트를 프로세서에 분배하여 시스템 성능을 향상시킵니다.
  • numactl 패키지는 numastat 유틸리티를 제공합니다. 기본적으로 numastat 는 노드별 NUMA(Non-Uniform Memory Access) 히트를 표시하고 커널 메모리 al Cryostat에서 시스템 통계를 누락합니다. 높은 numa_hit 값과 낮은 numa_miss 값은 최적의 성능을 나타냅니다.
  • numad 는 자동 NUMA 선호도 관리 데몬입니다. NUMA 리소스 할당, 관리 및 시스템 성능을 동적으로 개선하는 시스템 내에서 NUMA 토폴로지 및 리소스 사용량을 모니터링합니다.
  • SystemTap 은 커널 및 사용자 공간을 위한 프로그래밍 가능한 추적/디버깅 시스템이며 많은 간단한 스크립트가 포함되어 있습니다.
  • Valgrind 는 Supervision에서 복구되지 않은 사용자 공간 프로그램을 실행하여 메모리 오류, 할당 통계, 동시성 위반을 찾습니다.
  • intel-cmt-cat 패키지는 pqos 유틸리티를 제공하여 최신 Intel 프로세서에서 CPU 캐시 및 메모리 대역폭을 모니터링하고 제어할 수 있습니다.

2장. TuneD를 사용하여 시스템 성능 최적화

tuned는 사전 정의된 또는 사용자 지정 프로필을 사용하여 시스템 성능 및 전력 소비를 최적화하도록 설계된 시스템 튜닝 서비스입니다. 처리량, 짧은 대기 시간, 절전 등의 다양한 워크로드에 적합한 사전 정의된 프로필이 포함되어 있습니다.

2.1. RHEL로 배포된 tuned 프로필

설치 중에 TuneD는 시스템 유형에 따라 가장 적합한 프로필을 자동으로 선택합니다. 예를 들어, throughput-performance는 컴퓨팅 노드, 가상 머신용 virtual-guest, 일반 시스템에 대해 균형을 이루는 데 사용됩니다. 이를 통해 환경을 위한 최적의 성능을 보장합니다.

프로필은 주로 두 가지 범주로 나뉩니다.

  • 성능에 미치는 영향을 최소화하여 전력 소비를 줄이는 전력 활용 프로필, 그리고
  • 속도 및 응답성을 개선하기 위해 시스템 리소스를 최적화하는 performance-boosting 프로필입니다.

다음은 시스템 로드에 따라 선택할 수 있는 RHEL과 함께 배포되는 주목할 만한 프로필 목록입니다.

balanced
이는 기본 전원 연결 프로필이며 성능과 전력 소비 사이에서 타협하기 위한 것입니다. 가능한 경우 자동 확장 및 자동 튜닝을 사용합니다.
powersave

최대 절전 성능을 위한 프로필이며 성능을 제한하여 실제 전력 소비를 최소화할 수 있습니다. SATA 호스트 어댑터에 대해 USB 자동 일시 중지, Wi-Fi 절전 및 ALPM(Aggressive Link Power Management) 절전을 활성화합니다. 또한 대기율이 낮은 시스템에 대한 멀티 코어 전원 절감을 예약하고 온디맨드 관리자를 활성화합니다. AC97 오디오 절전을 활성화하거나 시스템에 따라 10초의 시간 초과로HDA-Intel 전력 절감을 가능하게 합니다. 시스템에 지원되는 Radeon 그래픽 카드가 활성화된 KMS가 포함된 경우 프로파일에서 자동 절전으로 구성합니다. energy_performance_preference 특성을 powersave 또는 power energy 설정으로 변경합니다. 또한 scaling_governor 정책 속성을 온디맨드 또는 powersave CPU governor로 변경합니다.

참고

경우에 따라 balanced 프로파일이 powersave보다 효율적입니다. 비디오 트랜스코딩과 같은 작업의 경우 전체 전원으로 실행하면 작업이 더 빨리 완료됩니다. 또한 시스템이 유휴 상태로 전환하여 더 빨리 전원을 공급하는 모드로 전환할 수 있습니다. 시스템을 제한하면 작업 중 전원이 줄어들지만 기간이 연장되어 전반적인 에너지 사용량이 증가할 수 있습니다. 따라서 균형 잡힌 프로파일은 종종 더 나은 선택이 될 수 있습니다.

throughput-performance
전력 절감 메커니즘을 비활성화하는 처리량에 최적화된 서버 프로필입니다. 또한 sysctl 설정으로 디스크 및 네트워크 IO의 처리량 성능을 향상시킬 수 있습니다.
accelerator-performance
throughput-performance 프로필과 동일한 튜닝이 포함된 프로필입니다. 또한 CPU를 낮은 C 상태로 잠그므로 대기 시간이 100us보다 적습니다. 이렇게 하면 GPU와 같은 특정 가속기의 성능이 향상됩니다.
latency-performance
짧은 대기 시간에 최적화된 서버 프로파일은 전력 절약 메커니즘을 비활성화하고 sysctl 설정을 활성화하여 대기 시간을 단축할 수 있습니다. CPU governor는 performance로 설정되고 CPU는 낮은 C 상태(PM QoS)에 잠겨 있습니다.
network-latency
대기 시간이 짧은 네트워크 튜닝을 위한 프로필입니다. latency-performance 프로필을 기반으로 합니다. 또한 투명한 대규모 페이지 및 NUMA 밸런싱을 비활성화하고 다른 여러 네트워크 관련 sysctl 매개변수를 조정합니다.
hpc-compute
고성능 컴퓨팅에 최적화된 프로필입니다. latency-performance 프로필을 기반으로 합니다.
network-throughput
처리량 네트워크 튜닝을 위한 프로필입니다. throughput-performance 프로필을 기반으로 합니다. 커널 네트워크 버퍼도 늘어납니다.
virtual-guest
throughput-performance 프로필을 기반으로 하는 Red Hat Enterprise Linux 가상 머신 및 VMWare 게스트용으로 설계된 프로필입니다. 다른 작업 중에는 가상 메모리 스왑성을 줄이고 디스크 readahead 값을 늘립니다. 디스크 장애를 비활성화하지 않습니다.
virtual-host
throughput-performance 프로필을 기반으로 하는 가상 호스트에 대해 설계된 프로필입니다. 다른 작업 중에는 가상 메모리 스왑성을 줄이고, 디스크 readahead 값을 증가시키며, 더 공격적인 페이지 나중 쓰기 값을 활성화합니다.
Oracle
Oracle 데이터베이스 로드에 최적화된 프로필은 throughput-performance 프로필을 기반으로 합니다. 또한 투명한 대규모 페이지를 비활성화하고 기타 성능 관련 커널 매개변수를 수정합니다. 이 프로필은 tuned-profiles-oracle 패키지에서 제공합니다.
데스크탑
분산 프로필을 기반으로 하는 데스크탑에 최적화된 프로필입니다. 또한 대화형 애플리케이션의 더 나은 응답을 위해 스케줄러 자동 그룹을 사용할 수 있습니다.
optimize-serial-console

printk 값을 줄여 직렬 콘솔로 I/O 활동을 조정하는 프로필입니다. 이렇게 하면 직렬 콘솔의 응답성이 향상됩니다. 이 프로필은 다른 프로필의 오버레이로 사용하기 위한 것입니다. 예를 들면 다음과 같습니다.

# tuned-adm profile throughput-performance optimize-serial-console
mssql
Microsoft SQL Server에 대해 제공되는 프로필입니다. throughput-performance 프로필을 기반으로 합니다.
intel-sst

사용자 정의 Intel 속도 선택 기술 구성이 있는 시스템에 최적화된 프로필입니다. 이 프로필은 다른 프로필의 오버레이로 사용하기 위한 것입니다. 예를 들면 다음과 같습니다.

# tuned-adm profile cpu-partitioning intel-sst
aws

AWS EC2 인스턴스에 최적화된 프로필입니다. throughput-performance 프로필을 기반으로 합니다.

이러한 프로필에 대한 자세한 내용은 시스템의 tuned-profiles 도움말 페이지를 참조하십시오.

2.2. RHEL과 함께 배포된 실시간 TuneD 프로필

RHEL은 실시간 커널을 실행하는 시스템을 위해 특별히 일부 프로필을 제공합니다. 특수 커널 빌드가 없으면 시스템을 실시간으로 구성하지 않습니다. RHEL에서 프로필은 추가 리포지토리와 함께 사용할 수 있습니다.

realtime
베어 메탈 실시간 시스템에서 사용합니다. 이는 RT 또는 NFV 리포지토리에서 사용할 수 있는 tuned-profiles-realtime 패키지에서 제공합니다.
realtime-virtual-host
실시간용으로 구성된 가상화 호스트에서 를 사용합니다. 이는 NFV 리포지토리에서 사용할 수 있는 tuned-profiles-nfv-host 패키지에서 제공합니다.
realtime-virtual-guest
실시간용으로 구성된 가상화 게스트에서 사용합니다. 이는 NFV 리포지토리에서 사용할 수 있는 tuned-profiles-nfv-guest 패키지에서 제공합니다.

2.3. TuneD 설치 및 활성화

시스템 관리자는 TuneD 를 사용하여 다양한 사용 사례에 맞게 성능 프로필을 최적화합니다. TuneD를 설치하고 활성화해야 합니다.

설치 후 /usr/lib/tuned/profiles 디렉터리는 배포별 프로필을 저장합니다. 각 프로필은 자체 하위 디렉터리에 저장됩니다. 프로필에는 tuned.conf 라는 프로필 구성 파일 및 도우미 스크립트와 같은 기타 파일이 포함됩니다. 또한 프로필을 사용자 지정하려면 프로필 디렉터리를 사용자 지정 프로필과 관련된 파일을 저장하는 /etc/tuned/profiles 에 복사합니다. 이름이 동일한 프로필이 있는 경우 /etc/tuned/profiles 에 있는 사용자 지정 프로필이 우선합니다.

사전 요구 사항

  • 관리 권한이 있습니다.

프로세스

  1. TuneD 패키지를 설치합니다.

    # dnf install tuned
  2. TuneD 서비스를 활성화하고 시작합니다.

    # systemctl enable --now tuned
  3. 선택 사항: 실시간 시스템의 TuneD 프로필을 설치합니다.

    실시간 시스템의 TuneD 프로필의 경우 rhel-10 리포지토리를 활성화합니다.

    # subscription-manager repos --enable=rhel-10-for-x86_64-nfv-beta-rpms
    # dnf install tuned-profiles-realtime tuned-profiles-nfv

검증

  • 프로필의 활성화 상태를 확인합니다.

    $ tuned-adm active
    Current active profile: throughput-performance
  • 프로필이 활성화되어 적용되었는지 확인합니다.

    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.

2.4. TuneD 프로필 관리

사용 가능한 프로필 나열, 특정 프로필 설정, 필요한 경우 TuneD 비활성화 등 Red Hat Enterprise Linux에서 TuneD 프로필을 관리할 수 있습니다. 프로필을 올바르게 관리하면 대기 시간이 짧은 애플리케이션에 cpu-partitioning 프로필을 사용하는 등 특정 워크로드에 대한 시스템 성능이 최적화됩니다.

사전 요구 사항

  • TuneD를 설치하고 활성화했습니다.
  • 관리 권한이 있습니다.

프로세스

  1. 사전 정의된 모든 TuneD 프로필을 나열합니다.

    $ tuned-adm list
  2. 선택 사항: TuneD가 시스템에 가장 적합한 프로필을 권장하도록 하려면 다음 명령을 사용합니다.

    # tuned-adm recommend
    throughput-performance
  3. 프로필을 활성화합니다.

    # tuned-adm profile selected-profile

    또는 여러 프로필의 조합을 활성화할 수 있습니다.

    # tuned-adm profile selected-profile1 selected-profile2
  4. 시스템에서 현재 활성화된 TuneD 프로필을 확인합니다.

    # tuned-adm active
    Current active profile: selected-profile
  5. 일시적으로 모든 튜닝을 비활성화합니다.

    # tuned-adm off
    The tunings are applied again after the TuneD service restarts.
  6. 선택사항: TuneD 서비스를 영구적으로 중지하고 비활성화합니다.

    # systemctl disable --now tuned

2.5. 프로필 사용자 정의를 위한 프로필 상속 및 변수

tuned는 프로필 상속, 변수 사용 및 기본 제공 함수를 지원하여 기존 프로필을 효율적으로 생성하거나 수정할 수 있습니다.

사전 설치 및 사용자 지정 프로필은 다음 디렉터리에서 사용할 수 있습니다.

  • 사전 설치된 프로필: /usr/lib/tuned/profiles/에 위치합니다.
  • 사용자 지정 프로필: /etc/tuned/profiles/에 생성됨

    프로필 상속

    tuned 프로필은 [main] 섹션의 include 옵션을 사용하여 다른 프로필의 설정을 상속할 수 있습니다. 프로필 상속은 하위 프로필이 상위 설정을 상속하지만 사용자 지정 요구 사항에 대한 매개변수를 재정의하거나 추가할 수 있음을 의미합니다. 예를 들어 ALPM을 medium_power 대신 min_power 로 추가로 설정하는 balanced 프로필을 기반으로 프로필을 생성하려면 다음을 사용합니다.

    [main]
    include=balanced
    
    [scsi_host]
    alpm=min_power
    프로필을 사용자 정의하는 동안 변수 사용

    프로필을 사용자 지정하는 동안 변수를 정의할 수 있습니다. 변수는 반복적인 정의를 줄임으로써 구성을 단순화하는 데 도움이 됩니다. 프로필의 [variables] 섹션을 생성하고 다음을 사용하여 고유한 변수를 정의합니다.

    [variables]
    variable_name=value

    프로필의 변수 값을 확장하려면 다음을 사용합니다.

    ${variable_name}

    변수를 다른 파일에 저장하고 변수 파일에 filepath를 추가하여 프로필을 사용자 지정하는 동안 이러한 변수를 사용합니다. 예를 들어 별도의 파일에서 변수를 고려하려면 구성 파일에 다음 행을 추가합니다.

    tuned.conf:
    [variables]
    include=/etc/tuned/my-variables.conf
    
    [bootloader]
    cmdline=isolcpus=${isolated_cores}

    여기서 isolated_cores=1,2 는 다음과 같이 my-variable.conf 파일에 추가됩니다.

    my-variable.conf:
    isolated_cores=1,2

2.6. 프로필 사용자 지정을 위한 기본 제공 기능

TuneD 프로필에서 기본 제공 함수를 사용하여 프로필이 활성화될 때 런타임에 동적으로 확장할 수 있습니다. TuneD 변수와 함께 기본 제공 함수를 사용하여 프로필 내에서 동적으로 값을 수정하고 처리합니다.

사용자 지정 Python 함수를 플러그인으로 생성하고 통합하여 사용자 지정 함수로 TuneD를 확장할 수 있습니다.

기본 제공 함수를 시작하는 구문
${f:function_name:argument_1:argument_2}

프로필 및 tuned.conf 파일이 있는 디렉터리 경로를 검색하려면 PROFILE_DIR 변수를 사용합니다. 다음 구문을 사용합니다.

${i:PROFILE_DIR}
기본 제공 함수를 사용하여 CPU 코어 분리의 예
[variables]
non_isolated_cores=0,3-5

[bootloader]
cmdline=isolcpus=${f:cpulist_invert:${non_isolated_cores}}

이 예에서 ${non_isolated_cores} 변수는 0,3-5 로 확장됩니다. cpulist_invert 함수는 CPU 목록을 반전합니다. CPU가 6개인 시스템에서 0,3-5 인verts to 1,2 에서는 isolcpus=1,2 옵션으로 커널이 부팅됩니다.

Expand
표 2.1. 사용 가능한 내장 함수:
함수 이름설명

어설션

두 인수를 비교합니다. 일치하지 않으면 함수에서 첫 번째 인수의 텍스트를 기록하고 프로필 로드를 취소합니다.

assertion_non_equal

두 인수를 비교합니다. 함수가 일치하면 함수는 첫 번째 인수에서 텍스트를 기록하고 프로파일 로드를 취소합니다.

calc_isolated_cores

분리된 코어를 계산하고 반환합니다. 인수는 하우스키핑을 위해 예약할 소켓당 코어 수를 지정합니다. 지정하지 않으면 소켓당 하나의 코어가 하우스키핑용으로 예약되고 나머지 코어는 격리됩니다.

check_net_queue_count

사용자가 net 장치에 대한 대기열 수를 지정했는지 확인합니다. 그렇지 않은 경우 하우스키핑 CPU 수를 반환합니다.

cpuinfo_check

/proc/cpuinfo에 대한 정규식을 확인합니다. REGEX1, STR1, REGEX2, STR2, …​[, STR_FALLBACK] 형식의 인수를 허용합니다. REGEX1이 /proc/cpuinfo의 항목과 일치하는 경우 REGEX2가 일치하는 경우 STR2로 확장됩니다. 첫 번째 일치에서 중지됩니다. 정규 표현식이 일치하지 않으면 STR_FALLBACK 또는 폴백이 제공되지 않는 경우 빈 문자열로 확장됩니다.

cpulist2devs

CPU 목록을 장치 문자열로 변환합니다.

cpulist2hex

CPU 목록을 16진수 CPU 마스크로 변환합니다.

cpulist2hex_invert

CPU 목록을 16진수 CPU 마스크로 변환하고 이를 반전합니다.

cpulist_invert

이를 보완하기 위해 CPU 목록을 반전합니다. 예를 들어 CPU가 4개인 시스템에서 0,2,3 목록의 전환은 1입니다.

cpulist_online

목록의 CPU가 온라인 상태인지 확인합니다. 온라인 CPU만 포함하는 목록을 반환합니다.

cpulist_pack

1,2,3,5 ~ 1-3,5 형식의 CPU 목록을 패키징합니다.

cpulist_present

목록의 CPU가 있는지 확인합니다. 현재 CPU만 포함하는 목록을 반환합니다.

cpulist_unpack

3 ~ 1,2,3,4 형식의 CPU 목록의 압축을 풉니다.

exec

프로세스를 실행하고 출력을 반환합니다.

hex2cpulist

16진수 CPU 마스크를 CPU 목록으로 변환합니다.

intel_recommended_pstate

프로세서 코드 이름을 확인하고 권장 intel_pstate CPUFreq 드라이버 모드를 반환합니다. PROCESSOR_NAME 목록에 없는 최신 생성 프로세서의 경우 "active"가 반환됩니다.

iscpu_check

iscpu 의 출력에 대해 정규식을 확인합니다. REGEX1, STR1, REGEX2, STR2, …​[, STR_FALLBACK] 형식의 인수를 허용합니다. REGEX1이 출력의 항목과 일치하는 경우 REGEX2가 일치하는 경우 STR2로 확장됩니다. 첫 번째 일치에서 중지됩니다. 정규 표현식이 일치하지 않으면 STR_FALLBACK 또는 폴백이 제공되지 않는 경우 빈 문자열로 확장됩니다.

package2cpus

패키지의 CPU 장치 목록을 제공합니다(소켓).

package2uncores

패키지의 uncore 장치 목록을 제공합니다(소켓).

regex_search_ternary

Ternary 정규식 연산자입니다. STR1, REGEX, STR2, STR3 형식의 인수를 사용합니다. REGEX가 STR1과 일치하는 경우(re.search 가 사용됨) STR2가 반환됩니다. 그렇지 않으면 STR3이 반환됩니다.

log

인수 연결로 확장되고 디버깅에 유용한 결과를 기록합니다.

kb2s

KB를 디스크 섹터로 변환합니다.

s2kb

디스크 섹터를 KB로 변환합니다.

strip

전달된 모든 인수에서 문자열을 만들고 선행 공백과 후행 공백을 모두 삭제합니다.

virt_check

TuneD가 VM(가상 머신) 내에서 실행 중인지 또는 베어 메탈에서 실행 중인지 확인합니다. VM 내에서 함수는 첫 번째 인수를 반환합니다. 베어 메탈에서 이 함수는 오류가 발생한 경우에도 두 번째 인수를 반환합니다.

2.7. tuned 플러그인

tuned 프로필은 플러그인을 사용하여 시스템에서 다른 장치를 모니터링하거나 최적화합니다.

tuned는 다음 두 가지 유형의 플러그인을 사용합니다.

플러그인 모니터링
CPU 로드, 디스크 I/O 및 네트워크 트래픽과 같은 시스템 데이터를 수집하는 데 사용됩니다. 동적 튜닝을 위해 플러그인을 튜닝하면 모니터링 플러그인의 출력을 사용할 수 있습니다. 모니터링 플러그인은 활성화된 튜닝 플러그인에서 메트릭이 필요할 때마다 자동으로 인스턴스화됩니다. 사용 가능한 모니터링 플러그인은 다음과 같습니다.
disk
장치 및 측정 간격당 디스크 로드(IO 작업 수)를 가져옵니다.
net
네트워크 카드 및 측정 간격당 네트워크 로드(전송된 패킷 수)를 가져옵니다.
load
CPU 및 측정 간격당 CPU 부하를 가져옵니다.
플러그인 조정
각 튜닝 플러그인은 개별 하위 시스템을 튜닝하고 TuneD 프로필에서 채워진 여러 매개변수를 사용합니다. 각 하위 시스템에는 튜닝 플러그인의 개별 인스턴스에서 처리하는 여러 CPU 또는 네트워크 카드와 같은 여러 장치가 있을 수 있습니다. 개별 장치에 대한 특정 설정도 지원됩니다. 사용 가능한 튜닝 플러그인은 다음과 같습니다.
acpi
ACPI 드라이버를 구성합니다. platform_profile 옵션을 사용하여 ACPI 플랫폼 프로필 sysfs 속성을 설정합니다. 다른 드라이버에 대한 일반적인 전원/성능 기본 API입니다. |.으로 구분된 여러 프로필을 지정할 수 있습니다. 사용 가능한 첫 번째 프로필이 선택됩니다.
audio
오디오 코드의 자동 종료 타임아웃을 timeout 옵션에 의해 지정된 값으로 설정합니다. 현재 snd_hda_intelsnd_ac97_codec codecs가 지원됩니다. 값 0은 autosuspend가 비활성화되어 있음을 의미합니다. 부울 옵션 reset_controller를 true 로 설정하여 컨트롤러 재설정을 적용할 수도 있습니다.
bootloader
커널 명령줄에 옵션을 추가합니다. 이 플러그인은 GRUB 부트 로더만 지원합니다. GRUB 설정 파일의 표준이 아닌 사용자 지정 위치는 grub2_cfg_file 옵션으로 지정할 수 있습니다. 커널 옵션은 현재 GRUB 설정 및 해당 템플릿에 추가됩니다. 커널 옵션을 적용하려면 시스템을 재부팅해야 합니다.
cpu
CPU governor 를 governor 옵션에 지정된 값으로 설정하여 CPU governor 및 전원 설정을 관리합니다. CPU 로드에 따라 PM(Power Management Quality of Service) CPU Direct Memory Access(DMA) 대기 시간을 동적으로 변경합니다.
disk
apm,scheduler_quantum, readahead ,readahead _multiply 와 같은 디스크 설정을 관리합니다.
eeepc_she
CPU 로드에 따라 프런트 측 버스(FSB) 속도를 동적으로 설정합니다.
irq
개별 인터럽트 요청(IRQ)을 장치로 처리하고 여러 플러그인 인스턴스를 정의할 수 있으며 각각 다른 장치 또는 irq를 처리할 수 있습니다. 플러그인에서 사용하는 장치 이름은 irq<n >입니다. 여기서 < n >은 IRQ 번호입니다. 특수 장치 DEFAULT/proc/irq/default_smp_affinity 에 작성된 값을 제어하며, 이는 모든 비활성 IRQ에 적용됩니다.
irqbalance
irqbalance 의 설정을 관리합니다. 플러그인은 /etc/sysconfig/irqbalance 에서 IRQ를 재조정할 때 건너뛰어야 하는 CPU를 구성합니다. 그런 다음 이전에 실행 중인 경우에만 irqbalance를 다시 시작합니다.
modules
사용자 지정 커널 모듈 옵션을 적용합니다. 매개 변수를 커널 모듈로 설정하고 /etc/modprobe.d/tuned.conf 파일을 생성할 수 있습니다. 구문은 module=option1=value1 option2=value2…​ 입니다. 여기서 module 은 모듈 이름이고 optionx=valuex 는 존재할 수 있는 모듈 옵션입니다.
mounts
마운트된 파일 시스템의 장애를 활성화하거나 비활성화합니다.
net
ethtool 유틸리티와 동일한 구문을 사용하여 Wake-on-LAN 및 인터페이스 속도를 구성합니다. 또한 인터페이스 사용률에 따라 인터페이스 속도를 동적으로 변경합니다.
rtentsk
정적 키를 활성화하거나 비활성화하여 프로세서 간 중단을 방지합니다. 옵션이 없습니다. 포함되면 TuneD 는 타임스탬프가 활성화된 열린 소켓을 유지하여 정적 키를 활성화합니다.
selinux
SELinux 옵션을 조정합니다. 액세스 허용 또는 거부와 같은 SELinux 결정은 캐시됩니다. 이 캐시는 AVC(Access Vector Cache)라고 합니다. 이러한 캐시된 결정을 사용하는 경우 SELinux 정책 규칙을 더 적게 확인하여 성능이 향상됩니다. avc_cache_threshold 옵션은 최대 AVC 항목 수를 조정합니다.
systemd
systemd 옵션을 조정합니다. cpu_affinity 옵션은 /etc/systemd/system.conf 에 CPU 선호도를 설정합니다. 이렇게 하면 서비스 관리자의 CPU 선호도와 모든 프로세스의 기본 CPU 선호도가 구성됩니다. -기호( - )로 지정된 선택적 CPU 범위를 사용하여 쉼표로 구분된 CPU 목록을 추가합니다.
scsi_host
SCSI 호스트 설정(예: ALPM)을 조정합니다.
scheduler
스케줄링 우선 순위, CPU 코어 격리 및 프로세스, 스레드 및 IRQ 작업의 조정에 대한 다양한 옵션을 제공합니다.
script
프로필을 로드하거나 언로드할 때 외부 스크립트 또는 바이너리를 실행합니다.
서비스
플러그인 옵션으로 지정된 다양한 sysvinit, sysv-rc, openrc 및 systemd 서비스를 처리합니다. 지원되는 서비스 처리 명령은 start, stop, enable, disable입니다.
sysctl
커널 매개 변수를 수정합니다. TuneD에서 사용할 수 있는 다른 플러그인에서 다루지 않는 시스템 설정을 변경하려면 이 플러그인을 사용하십시오. 구문은 name=value 입니다. 여기서 namesysctl 유틸리티에서 제공하는 이름과 동일합니다.
sysfs
플러그인 옵션으로 지정된 다양한 sysfs 설정을 설정합니다. 구문은 name=value 입니다. 여기서 name 은 사용할 sysfs 경로입니다.
usb
USB 자동 일시 중지 타임아웃을 조정합니다. 값 0 은 autosuspend가 비활성화되어 있음을 의미합니다.
uncore
최대 및 최소 uncore 빈도를 제한합니다. max_freq_khz 옵션은 Intel uncore frequency 드라이버에서 노출한 sysfs 파일에 해당합니다. 해당 값은 Cryostat 또는 구성 가능한 범위의 백분율로 지정할 수 있습니다.
video
비디오 카드에 다양한 powersave 수준을 설정합니다. 현재 Radeon 카드만 지원됩니다. powersave 수준은 radeon_powersave 옵션을 사용하여 지정할 수 있습니다. 지원되는 값은 default, auto, low, mid, high, dynpm, dpm-extensiontery, dpm-balanced, dpm-perfomance입니다.
vm
투명한 대규모 페이지를 활성화하거나 비활성화합니다. transparent_hugepages 옵션에 유효한 값은 always, never, madvise 입니다.

2.8. 새 TuneD 프로필 생성

새 TuneD 프로필을 생성하여 성능 최적화 요구 사항을 사용자 지정할 수 있습니다.

사전 요구 사항

프로세스

  1. /etc/tuned/profiles 디렉터리에 생성하려는 프로필과 동일한 새 디렉터리를 만듭니다.

    # mkdir /etc/tuned/profiles/my-profile
  2. 새 디렉터리에서 tuned.conf 라는 파일을 생성합니다.
  3. 파일을 편집하고 요구 사항에 따라 [main] 섹션을 추가하고 정의를 연결합니다. 예를 들어 balanced 프로필의 구성을 참조하십시오.

    [main]
    summary=General non-specialized TuneD profile
    
    [cpu]
    governor=conservative
    energy_perf_bias=normal
    
    [audio]
    timeout=10
    
    [video]
    radeon_powersave=dpm-balanced, auto
    
    [scsi_host]
    alpm=medium_power
  4. 프로필을 활성화합니다.

    # tuned-adm profile my-profile

검증

  • 프로필이 활성화되어 적용되었는지 확인합니다.

    $ tuned-adm active
    Current active profile: my-profile
    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.

2.9. 기존 TuneD 프로필 수정

기존 프로필의 매개변수를 사용자 지정 요구 사항에 맞게 수정할 수 있습니다. 수정된 하위 프로필은 기존 TuneD 프로필을 기반으로 생성할 수 있습니다.

사전 요구 사항

프로세스

  1. /etc/tuned/profiles 디렉터리에 생성하려는 프로필과 동일한 새 디렉터리를 만듭니다.

    # mkdir /etc/tuned/profiles/modified-profile
  2. 새 디렉터리에서 tuned.conf 라는 파일을 생성하고 다음과 같이 [main] 섹션을 설정합니다.

    [main]
    include=parent-profile

    parent-profile 을 수정 중인 프로필의 이름으로 교체합니다(예: throughput-performance).

  3. 프로필 수정 사항을 포함합니다. 예를 들어 throughput-performance 프로필의 swappiness를 낮추려면 기본값 10 대신 vm.swappiness 값을 5 로 변경합니다.

    [main]
    include=throughput-performance
    
    [sysctl]
    vm.swappiness=5
  4. 프로필을 활성화합니다.

    # tuned-adm profile modified-profile

검증

  • 프로필이 활성화되어 적용되었는지 확인합니다.

    $ tuned-adm active
    Current active profile: modified-profile
    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.

2.10. TuneD no-daemon 모드 활성화

상주 메모리가 필요하지 않은 no-daemon 모드에서 TuneD를 실행할 수 있습니다. 이 모드에서 TuneD는 설정을 적용한 다음 종료합니다. 그러나 이 모드에서는 D-Bus 및 핫플러그 지원을 비롯한 특정 기능과 설정에 대한 롤백 기능을 비활성화합니다.

사전 요구 사항

  • 시스템 구성을 수정할 수 있는 루트 권한 또는 적절한 권한이 있습니다.

프로세스

  1. 다음 변경 사항을 사용하여 /etc/tuned/tuned-main.conf 파일을 편집합니다.

    sudo vi /etc/tuned/tuned-main.conf
    daemon = 0
  2. 파일을 저장하고 닫습니다.
  3. tuned 서비스를 다시 시작하거나 프로필을 다시 적용하거나 전환합니다.

    # systemctl restart tuned
    # tuned-adm profile <tuned_profile>
  4. tuned 상태를 확인합니다.

    # tuned-adm active
    It seems that tuned daemon is not running, preset profile is not activated.
    Preset profile: <tuned_profile>

3장. 디스크 스케줄러 설정

디스크 스케줄러는 스토리지 장치에 제출된 I/O 요청을 순서를 지정합니다. 다음과 같은 다양한 방법으로 스케줄러를 구성할 수 있습니다.

  • TuneD를 사용하여 스케줄러를 설정합니다.
  • udev 를 사용하여 스케줄러를 설정합니다.
  • 실행 중인 시스템에서 스케줄러를 일시적으로 변경합니다.
참고

Red Hat Enterprise Linux에서 블록 장치는 다중 대기열 스케줄링만 지원합니다. 이를 통해 솔리드 스테이트 드라이브(SSD) 및 멀티 코어 시스템으로 블록 계층 성능을 확장할 수 있습니다.

3.1. 사용 가능한 디스크 스케줄러

적절한 디스크 스케줄러를 선택하면 시스템 성능, 응답성 및 I/O 작업의 효율성에 큰 영향을 미칩니다. 각 스케줄러의 특성을 평가하여 특정 워크로드 및 하드웨어에 가장 적합한 옵션을 선택합니다.

Red Hat Enterprise Linux에서 다음과 같은 멀티 큐 디스크 스케줄러가 지원됩니다.

none
FIFO(First-in first-out) 스케줄링 알고리즘을 구현합니다. 간단한 last-hit 캐시를 통해 일반 블록 계층의 요청을 병합합니다.
mq-deadline

요청이 스케줄러에 도달하는 시점의 요청에 대해 보장된 대기 시간을 제공하려고 합니다. mq-deadline 스케줄러는 대기 중인 I/O 요청을 읽기 또는 쓰기 배치로 정렬합니다. 나중에 늘어나는 논리 블록 주소 지정(LBA) 순서로 예약합니다. 기본적으로 애플리케이션에서 읽기 I/O 작업을 차단하므로 읽기 배치가 쓰기 배치보다 우선합니다. 배치를 처리한 후 mq-deadline 에서 쓰기 별지를 확인합니다. 그런 다음 다음 읽기 또는 쓰기 배치를 적절하게 예약합니다.

이 스케줄러는 대부분의 사용 사례에 적합하지만 특히 쓰기 작업이 대부분 비동기적으로 사용되는 경우입니다.

bfq

데스크탑 시스템 및 대화형 작업을 대상으로 합니다. bfq 스케줄러는 단일 애플리케이션이 모든 대역폭을 사용하지 않도록 합니다. 실제로 스토리지 장치는 유휴 상태인 것처럼 항상 응답성이 높습니다. 기본 구성에서 bfq 는 최대 처리량을 달성하는 대신 가장 짧은 대기 시간을 제공하는 데 중점을 둡니다.

BFQcfq 코드를 기반으로 합니다. 스케줄러는 고정된 디스크 액세스 슬라이스를 부여하는 대신 각 프로세스에 섹터 예산을 할당합니다. 이 스케줄러는 대용량 파일을 복사해도 시스템이 응답하지 않도록 할 때 적합합니다.

kyber
스케줄러는 블록 I/O 계층의 모든 요청의 대기 시간을 계산하여 대기 시간 목표를 달성합니다. cache-misses 및 동기 쓰기 요청의 경우 read에 대한 대상 대기 시간을 구성할 수 있습니다. 이 스케줄러는 NVMe, SSD 또는 기타 짧은 대기 시간 장치와 같은 빠른 장치에 적합합니다.
기본 디스크 스케줄러
다른 스케줄러를 지정하지 않는 한 블록 장치는 기본 디스크 스케줄러를 사용합니다.
참고

특히 NVMe(Non-volatile Memory Express) 블록 장치의 경우 기본 스케줄러는 none이며 Red Hat은 이를 변경하지 않는 것이 좋습니다.

커널은 장치 유형에 따라 기본 디스크 스케줄러를 선택합니다. 자동 선택된 스케줄러는 일반적으로 최적의 설정입니다. 다른 스케줄러가 필요한 경우 udev 규칙 또는 TuneD 애플리케이션을 사용하여 구성합니다. 선택한 장치를 일치시키고 해당 장치에 대해서만 스케줄러를 전환합니다.

3.2. 다양한 사용 사례에 대한 다양한 디스크 스케줄러

분석 및 튜닝을 수행하기 전에 이러한 디스크 스케줄러를 시작점으로 사용하십시오.

Expand
표 3.1. 사용 사례별 디스크 스케줄러 권장 사항
사용 사례디스크 스케줄러

SCSI 인터페이스가 있는 기존 HDD

mq-deadline 또는 bfq 를 사용합니다.

고성능 SSD 또는 빠른 스토리지가 있는 CPU 바인딩 시스템

특히 엔터프라이즈 애플리케이션을 실행할 때는 none 을 사용합니다. 또는 kyber 를 사용합니다.

데스크탑 또는 대화형 작업

bfq 를 사용합니다.

가상 게스트

mq-deadline 을 사용합니다. 다중 큐가 가능한 호스트 버스 어댑터(HBA) 드라이버를 사용하면 아무 것도 사용하지 않습니다.

3.3. 활성 디스크 스케줄러 확인

지정된 블록 장치에서 현재 활성 상태인 디스크 스케줄러를 볼 수 있습니다.

프로세스

  • /sys/block/device/queue/scheduler 파일의 내용을 읽습니다.

    # cat /sys/block/device/queue/scheduler
    [mq-deadline] kyber bfq none

    파일 이름에서 장치를 블록 장치 이름(예: sdc )으로 바꿉니다. 활성 스케줄러는 대괄호([ ])로 나열됩니다.

3.4. TuneD를 사용하여 디스크 스케줄러 설정

선택한 블록 장치에 대해 지정된 디스크 스케줄러를 설정하는 TuneD 프로필을 생성하고 활성화할 수 있습니다. 시스템이 재부팅되면 설정이 유지됩니다. 다음 명령 및 구성에서 다음을 교체합니다.

  • 블록 장치 의 이름이 있는 장치(예: sdf 및)
  • 장치에 설정할 디스크 스케줄러가 있는 selected-scheduler (예: bfq )

사전 요구 사항

프로세스

  1. 선택 사항: 프로필을 기반으로 하는 기존 TuneD 프로필을 선택합니다. 사용 가능한 프로필 목록은 RHEL로 배포된 TuneD 프로필을 참조하십시오.
  2. 현재 활성화되어 있는 프로필을 확인하려면 다음을 사용합니다.

    # tuned-adm active
  3. TuneD 프로필을 저장할 새 디렉터리를 생성합니다.

    # mkdir /etc/tuned/<new-profile>
  4. 선택한 블록 장치의 시스템 고유 식별자를 찾습니다.

    # udevadm info --query=property --name=/dev/device | grep -E '(WWN|SERIAL)'
    ID_WWN=0x5002538d00000000_
    ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    ID_SERIAL_SHORT=20120501030900000
    참고

    이 명령은 WWN(World Wide Name) 또는 지정된 블록 장치와 연결된 일련 번호로 식별된 모든 값을 반환합니다. WWN을 사용하는 것이 좋지만 모든 장치에서 항상 사용할 수있는 것은 아닙니다. 이러한 경우 example 명령에서 반환된 값을 장치 시스템의 고유 ID로 사용할 수 있습니다.

  5. /etc/tuned/my-profile/tuned.conf 구성 파일을 만듭니다. 파일에서 다음 옵션을 설정합니다.

    1. 선택 사항: 기존 프로필을 포함합니다.

      [main]
      include=<existing-profile>
    2. WWN 식별자와 일치하는 장치에 대해 선택한 디스크 스케줄러를 설정합니다.

      [disk]
      devices_udev_regex=IDNAME=device system unique id
      elevator=selected-scheduler

      여기:

      • IDNAME 을 사용 중인 식별자의 이름으로 바꿉니다(예: ID_WWN).
      • 장치 시스템 고유 ID를 선택한 식별자의 값으로 바꿉니다(예: 0x5002538d00000000). devices_udev_regex 옵션의 여러 장치를 일치시키려면 식별자가 괄호로 묶고 세로 막대로 구분합니다.

        devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
  6. 프로필을 활성화합니다.

    # tuned-adm profile <new-profile>

검증

  1. TuneD 프로필이 활성화되어 적용되었는지 확인합니다.

    $ tuned-adm active
    Current active profile: <profile>
    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile.
    See TuneD log file ('/var/log/tuned/tuned.log') for details.
  2. /sys/block/device/queue/scheduler 파일의 내용을 읽습니다.

    $ cat /sys/block/device/queue/scheduler
    [mq-deadline] kyber bfq none

    파일 이름에서 장치를 블록 장치 이름(예: sdc )으로 바꿉니다. 활성 스케줄러는 대괄호([])로 나열됩니다.

3.5. udev 규칙을 사용하여 디스크 스케줄러 설정

udev 규칙을 사용하여 특정 블록 장치에 대해 지정된 디스크 스케줄러를 설정할 수 있습니다. 시스템이 재부팅되면 설정이 유지됩니다. 다음 명령 및 구성에서 다음을 교체합니다.

  • 블록 장치 의 이름이 있는 장치(예: sdf 및)
  • 장치에 설정할 디스크 스케줄러가 있는 selected-scheduler (예: bfq )

프로세스

  1. 블록 장치의 시스템 고유 식별자를 찾습니다.

    # $ udevadm info --name=/dev/device | grep -E '(WWN|SERIAL)'
    E: ID_WWN=0x5002538d00000000
    E: ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    E: ID_SERIAL_SHORT=20120501030900000
    참고

    이 명령은 WWN(World Wide Name) 또는 지정된 블록 장치와 연결된 일련 번호로 식별된 모든 값을 반환합니다. WWN을 사용하는 것이 좋지만 모든 장치에서 항상 사용할 수있는 것은 아닙니다. 이러한 경우 example 명령에서 반환된 값을 장치 시스템의 고유 ID로 사용할 수 있습니다.

  2. udev 규칙을 구성하려면 다음 콘텐츠를 사용하여 /etc/udev/rules.d/99-scheduler.rules 파일을 생성합니다.

    ACTION=="add|change", SUBSYSTEM=="block", ENV{IDNAME}=="device system unique id", ATTR{queue/scheduler}="selected-scheduler"

    여기:

    • IDNAME 을 사용 중인 식별자의 이름으로 바꿉니다(예: ID_WWN).
    • 장치 시스템 고유 ID를 선택한 식별자의 값으로 바꿉니다(예: 0x5002538d00000000).
  3. udev 규칙을 다시 로드합니다.

    # udevadm control --reload-rules
  4. 스케줄러 구성을 적용합니다.

    # udevadm trigger --type=devices --action=change

검증

  • 활성 스케줄러를 확인합니다.

    # cat /sys/block/device/queue/scheduler

3.6. 특정 디스크에 대한 스케줄러 임시 설정

특정 블록 장치에 대해 지정된 디스크 스케줄러를 설정할 수 있습니다. 시스템이 재부팅되면 설정이 유지되지 않습니다.

프로세스

  • 선택한 스케줄러의 이름을 /sys/block/device/queue/scheduler 파일에 작성합니다.

    # echo selected-scheduler > /sys/block/device/queue/scheduler

    파일 이름에서 장치를 블록 장치 이름(예: sdc)으로 바꿉니다.

검증

  • 스케줄러가 장치에서 활성 상태인지 확인합니다.

    # cat /sys/block/device/queue/scheduler

4장. PCP 설정

PCP(Performance Co- Cryostat)는 시스템 수준 성능을 관리하고 측정하기 위한 툴, 서비스 및 라이브러리 제품군입니다. Python, Perl, C++ 및 C 인터페이스를 사용하여 성능 지표를 추가합니다. 분석 툴은 Python, C++ 및 C 클라이언트 API를 직접 사용합니다. 웹 애플리케이션은 JSON 인터페이스를 통해 성능 데이터에 액세스할 수 있습니다. 데이터 패턴을 분석하려면 보관된 데이터와 실시간 결과를 비교합니다.

PCP의 기능
  • 복잡한 시스템의 중앙 집중식 분석 중에 유용한 경량 분산 아키텍처입니다.
  • 실시간 데이터를 모니터링하고 관리하는 기능
  • 기록 데이터를 기록하고 검색하는 기능.
PCP에는 다음과 같은 구성 요소가 있습니다.
  • pmcd(Performance Metric Collector Daemon)는 설치된 PMDA(Performance Metric Domain Agent)에서 성능 데이터를 수집합니다. PMDAs는 시스템에서 개별적으로 로드되거나 언로드될 수 있으며 동일한 호스트에서 PMCD에 의해 제어됩니다.
  • pminfo 또는 pmstat 와 같은 다양한 클라이언트 툴은 동일한 호스트 또는 네트워크를 통해 이 데이터를 검색, 표시, 아카이브, 처리할 수 있습니다.
  • pcppcp-system-tools 패키지는 명령줄 툴 및 핵심 기능을 제공합니다.
  • pcp-gui 패키지는 그래픽 애플리케이션 pmchart를 제공합니다.
  • grafana-pcp 패키지는 Grafana를 사용하여 강력한 웹 기반 시각화 및 경고를 제공합니다.

4.1. PCP 설치 및 활성화

필요한 패키지를 설치하고 PCP 모니터링 서비스를 활성화하여 사용을 시작합니다. pcp-zeroconf 패키지를 사용하여 PCP 설치를 자동화할 수도 있습니다. pcp-zeroconf 를 사용하여 PCP를 설치하는 방법에 대한 자세한 내용은 pcp-zeroconf를 사용하여 PCP 설정을 참조하십시오.

프로세스

  1. pcp 패키지를 설치합니다.

    # dnf install pcp
  2. 호스트 시스템에서 pmcd 서비스를 활성화하고 시작합니다.

    # systemctl enable pmcd
    # systemctl start pmcd

검증

  • PMCD 프로세스가 호스트에서 실행 중인지 확인합니다.

    # pcp
    Performance Co-Pilot configuration on arm10.local:
    
     platform: Linux arm10.local 6.12.0-55.13.1.el10_0.aarch64 #1 SMP PREEMPT_DYNAMIC Mon May 19 07:29:57 UTC 2025 aarch64
     hardware: 4 cpus, 1 disk, 1 node, 3579MB RAM
     timezone: JST-9
     services: pmcd
         pmcd: Version 6.3.7-1, 12 agents, 6 clients
         pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2
               dm openmetrics

4.2. 최소 PCP 구성 배포

최소 PCP 구성은 Red Hat Enterprise Linux에서 성능 통계를 수집합니다. 구성은 추가 분석을 위해 데이터를 수집하는 데 필요한 프로덕션 시스템에 최소 패키지 수를 추가해야 합니다.

다양한 PCP 툴을 사용하여 결과 tar.gz 파일과 pmlogger 출력의 아카이브를 분석합니다. 그런 다음 다른 성능 데이터 소스와 비교할 수 있습니다.

사전 요구 사항

프로세스

  1. pmlogger 설정을 업데이트합니다.

    # pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
  2. pmcd 및 pmlogger 서비스를 시작합니다.

    # systemctl start pmcd.service
    # systemctl start pmlogger.service
  3. 성능 데이터를 기록하는 데 필요한 작업을 실행합니다.
  4. 출력을 저장하고 호스트 이름과 현재 날짜와 시간에 따라 이름이 지정된 tar.gz 파일에 저장합니다.

    # cd /var/log/pcp/pmlogger/
    # tar -czf $(hostname).$(date +%F-%Hh%M).pcp.tar.gz $(hostname)
  5. 이 파일을 추출하고 PCP 툴을 사용하여 데이터를 분석합니다.

4.3. PCP와 함께 배포된 시스템 서비스 및 도구

기본 패키지 pcp 에는 시스템 서비스 및 기본 툴이 포함되어 있습니다. pcp-system-tools,pcp-guipcp-devel 패키지와 함께 제공되는 추가 툴을 설치할 수 있습니다.

PCP와 함께 배포된 시스템 서비스의 역할

pmcd
성능 지표 수집기 데몬.
pmie
성능 지표 유추 엔진.
pmlogger
성능 지표 로거입니다.
pmproxy
실시간 및 과거 성능 지표 프록시, 시계열 쿼리 및 REST API 서비스입니다.

기본 PCP 패키지로 배포되는 툴

pcp
Performance Co- Cryostat 설치의 현재 상태를 표시합니다.
pcp-check
pmcd,pmlogger,pmproxy, PMDAs와 같은 코어 및 선택적 구성 요소를 활성화하거나 비활성화합니다.
pcp-vmstat
5초마다 고급 시스템 성능 개요를 제공합니다. 프로세스, 메모리, 페이징, 블록 IO, 트랩 및 CPU 활동에 대한 정보를 표시합니다.
pmconfig
구성 매개 변수의 값을 표시합니다.
pmdiff
시간 창 내에 있는 두 아카이브의 평균 메트릭 값을 비교하여 잠재적인 성능 회귀를 식별합니다.
pmdumplog
Performance Co- Cryostat 아카이브 파일의 제어, 메타데이터, 인덱스 및 상태 정보를 표시합니다.
pmfind
네트워크에서 PCP 서비스를 찾습니다.
pmie
연산, 논리 및 규칙 식 집합을 주기적으로 평가하는 추론 엔진입니다. 메트릭은 라이브 시스템 또는 Performance Co- Cryostat 아카이브 파일에서 수집됩니다.
pmieconf
구성 가능한 pmie 변수를 표시하거나 설정합니다.
pmiectl
pmie의 기본이 아닌 인스턴스를 관리합니다.
pminfo
성능 지표에 대한 정보를 표시합니다. 메트릭은 라이브 시스템 또는 Performance Co- Cryostat 아카이브 파일에서 수집됩니다.
pmlc
활성 pmlogger 인스턴스를 대화식으로 설정합니다.
pmlogcheck
Performance Co- Cryostat 아카이브 파일에서 잘못된 데이터를 식별합니다.
pmlogconf
pmlogger 구성 파일을 생성하고 수정합니다.
pmlogctl
pmlogger의 기본적이지 않은 인스턴스를 관리합니다.
pmloglabel
Performance Co- Cryostat 아카이브 파일의 레이블을 확인, 수정 또는 복구합니다.
pmlogsummary
Performance Co- Cryostat 아카이브 파일에 저장된 성능 지표에 대한 통계 정보를 계산합니다.
pmprobe
성능 지표의 가용성을 결정합니다.
pmsocks
방화벽을 통해 호스팅되는 Performance Co- Cryostat에 대한 액세스를 제공합니다.
pmstat
정기적으로 시스템 성능에 대한 간략한 요약을 표시합니다.
pmstore
성능 지표 값을 수정합니다.
PMseries
PCP 기능과 Valkey 와 같은 분산 키-값 데이터 저장소를 사용하여 빠르고 확장 가능한 시계열 쿼리.
pmtrace
추적 PMDA에 명령줄 인터페이스를 제공합니다.
pmval
성능 지표의 현재 값의 업데이트 표시입니다.

별도로 설치된 pcp-system-tools 패키지와 함께 배포되는 툴

pcp-atop
성능 관점에서 가장 중요한 하드웨어 리소스의 시스템 수준 작업(CPU, 메모리, 디스크 및 네트워크)을 표시합니다.
pcp-atopsar
다양한 시스템 리소스 사용률에 대한 시스템 수준 활동 보고서를 생성합니다. 이 보고서는 pmlogger 또는 pcp-atop의 -w 옵션을 사용하여 이전에 기록된 원시 로그 파일에서 생성됩니다.
pcp-dmcache
구성된 장치 매퍼 캐시 대상에 대한 정보를 표시합니다. 메트릭에는 각 캐시 장치에 대한 장치 IOPS, 사용률, 읽기/쓰기 적중/허용율이 포함됩니다.
pcp-dstat
한 번에 하나의 시스템 메트릭을 표시합니다. 여러 시스템의 지표를 표시하려면 --host 옵션을 사용합니다.
pcp-free
시스템에서 사용 가능한 메모리 및 사용 가능한 메모리에 대한 보고서입니다.
pcp-htop
명령줄에서 인수와 함께 시스템에서 실행되는 모든 프로세스를 나열합니다. 수직 및 수평 스크롤 및 마우스 상호 작용을 사용하는 top 명령과 유사합니다.
pcp-ipcs
호출 프로세스에서 읽기 액세스 권한이 있는 프로세스 간 통신(IPC) 기능에 대한 정보를 표시합니다.
pcp-mpstat
CPU 및 인터럽트 관련 통계를 보고합니다.
pcp-numastat
커널 메모리 al Cryostat의 NUMA 할당 통계를 표시합니다.
pcp-pidstat
시스템에서 실행 중인 개별 작업 또는 프로세스에 대한 정보를 표시합니다. 여기에는 CPU 백분율, 메모리 및 스택 사용량, 스케줄링 및 우선 순위가 포함됩니다. 기본적으로 로컬 호스트의 실시간 데이터를 보고합니다.
pcp-shping
pmdashping Performance Metrics Domain Agent(PMDA)에서 내보낸 쉘-핑 서비스 메트릭을 샘플 및 보고합니다.
pcp-ss
pmdasockets PMDA에서 수집한 소켓 통계를 표시합니다.
pcp-tapestat
ExternalIP 장치에 대한 I/O 통계를 보고합니다.
pcp-uptime
현재 사용자에게 로그인한 시스템 가동 시간, 지난 1, 5 및 15 분의 시스템 부하 평균을 표시합니다.
pcp-verify
Performance Co- Cryostat 수집기 구성의 다양한 측면을 검사하고 특정 작업에 최적화되었는지 확인합니다.
pcp-iostat
SCSI 장치(기본적으로) 또는 장치 매퍼 장치에 대한 I/O 통계를 보고합니다(-x device-mapper 옵션 사용).
pmrep
선택한, 쉽게 사용자 지정할 수 있는 성능 지표 값에 대한 보고서입니다.

별도로 설치된 pcp-gui 패키지로 배포되는 툴

pmchart
PCP 기능을 통해 사용 가능한 성능 지표 값을 표시합니다.
pmdumptext
라이브 또는 PCP 아카이브에서 수집한 성능 지표 값을 출력합니다.

별도로 설치된 pcp-devel 패키지와 함께 배포되는 툴

pmclient
PMAPI(Performance Metrics Application Programming Interface)를 사용하여 고급 시스템 성능 지표를 표시합니다.
pmdbg
사용 가능한 Performance Co- Cryostat 디버그 제어 플래그와 해당 값을 표시합니다.
pmerr
사용 가능한 Performance Co- Cryostat 오류 코드 및 해당 오류 메시지를 표시합니다.
pcp-xsos
시스템에서 PCP 아카이브 또는 실시간 메트릭에서 가져온 단일 샘플을 사용하여 시스템에 대한 요약 보고서를 제공합니다.

별도의 패키지로 배포되는 기타 툴

pcp-geolocate
수집기 시스템 지역 레이블을 검색합니다.
pcp2openmetrics
PCP에서 Open Metrics 형식으로 사용자 지정할 수 있는 성능 지표 내보내기 툴입니다. 명령줄 인수 또는 구성 파일을 사용하여 내보내기를 위해 라이브 또는 아카이브 PCP 메트릭을 선택할 수 있습니다.

4.4. PCP 배포 아키텍처

PCP는 PCP 배포의 규모에 따라 여러 배포 아키텍처를 지원하며 고급 구성을 수행하기 위한 다양한 옵션을 제공합니다.

크기 조정 요인 및 구성 옵션에 따라 결정되는 확장 배포 구성 변형에는 다음이 포함됩니다.

localhost
각 서비스는 모니터링되는 시스템에서 로컬로 실행됩니다. 구성을 변경하지 않고 서비스를 시작하면 localhost에 기본 독립 실행형 배포가 수행됩니다. 이 구성은 단일 노드 이외의 확장을 지원하지 않습니다. 그러나 Valkey는 여러 호스트에서 데이터를 공유하는 고가용성 및 확장 가능한 클러스터형 모드에서도 실행할 수 있습니다. 클라우드에 Valkey 클러스터를 배포하거나 클라우드 공급자의 관리형 Valkey 클러스터를 사용할 수도 있습니다.
분산됨
localhost와 분산된 구성의 유일한 차이점은 중앙 집중식 Valkey 서비스입니다. 이 모델에서 호스트는 모니터링되는 각 호스트에서 pmlogger 서비스를 실행하고 로컬 pmcd 인스턴스에서 지표를 검색합니다. 그런 다음 로컬 pmproxy 서비스는 성능 지표를 중앙 Valkey 인스턴스로 내보냅니다.

그림 4.1. 분산 로깅

분산 로깅
중앙 집중식 로깅 - pmlogger션
리소스가 제한적인 호스트의 경우 pmlogger 개미를 사용합니다. 이 배포는 중앙 집중식 로깅이라고도 합니다. 단일 로거 호스트는 pmlogger 프로세스를 실행하여 여러 원격 호스트에서 지표를 수집합니다. 중앙 집중식 로거 호스트는 pmproxy 서비스를 실행하여 결과 PCP 아카이브를 검색하고 지표 데이터를 Valkey 인스턴스에 로드합니다.

그림 4.2. 중앙 집중식 로깅 - pmlogger션

중앙 집중식 로깅 - pmlogger션
페더레이션 - pmlogger개미 여러 개
대규모 배포의 경우 페더레이션 방식으로 pmlogger 플랜트를 여러 개 배포하십시오. 예를 들어 랙 또는 데이터 센터당 하나의 pmlogger개미가 있습니다. 각 pmlogger는 메트릭을 중앙 Valkey 인스턴스로 로드합니다.

그림 4.3. 페더레이션 - pmlogger개미 여러 개

페더레이션 - pmlogger개미 여러 개
참고

기본적으로 Valkey의 배포 구성은 독립 실행형 localhost입니다. 그러나 Valkey는 여러 호스트에서 데이터를 공유하는 고가용성 및 확장성이 뛰어난 클러스터형 방식으로 선택적으로 수행할 수 있습니다. 또 다른 옵션은 클라우드에 Valkey 클러스터를 배포하거나 클라우드 공급자의 관리형 Valkey 클러스터를 사용하는 것입니다.

4.5. PCP 로깅의 스케일링에 영향을 미치는 요소

PCP(Performance Co- Cryostat) 로깅에 영향을 미치는 주요 요소는 하드웨어 리소스, 로깅 지표, 로깅 간격 및 업그레이드 후 아카이브 관리입니다.

원격 시스템 크기
CPU, 디스크, 네트워크 인터페이스와 같은 원격 하드웨어는 pmlogger 인스턴스에서 수집한 데이터의 볼륨을 결정합니다.
로깅된 메트릭
기록된 지표의 수와 유형은 스토리지 요구 사항에 크게 영향을 미칩니다. 특히 프로세스별 proc.* 메트릭에는 많은 양의 디스크 공간이 필요합니다. 예를 들어 10초 간격으로 표준 pcp-zeroconf 로깅은 11MB를 사용합니다. proc 메트릭을 활성화하면 이 값이 155MB로 증가합니다. 또한 CPU, 블록 장치 및 네트워크 인터페이스의 수는 스토리지 용량 요구 사항에 영향을 미칩니다.
로깅 간격
지표 로깅의 빈도는 스토리지 사용량을 결정합니다. pmlogger 인스턴스의 예상 일일 PCP 아카이브 파일 크기는 pmlogger.log 파일에 기록됩니다. PCP 아카이브는 일반적으로 10:1로 압축됩니다. 압축되지 않은 데이터에 대한 장기 디스크 공간 요구 사항을 추정하려면 이 비율을 사용합니다.
pmlogrewrite로 아카이브 업데이트 관리
PCP를 업그레이드한 후 pmlogrewrite 는 버전 간 지표 메타데이터에서 변경 사항이 탐지되면 기존 아카이브를 업데이트합니다. 이 프로세스에 필요한 시간은 저장된 아카이브 수에 따라 선형적으로 확장됩니다.

5장. pmda-openmetrics 구성

PCP(Performance Co- Cryostat)는 시스템 성능을 모니터링하고 관리하는 시스템입니다. 여기에는 PMDAs(Performance Metric Domain Agent)라는 여러 기본 제공 에이전트가 포함되어 있습니다. 이러한 에이전트는 PostgreSQL, Apache HTTPD 및 KVM 가상 머신과 같은 애플리케이션 및 서비스에서 지표를 수집합니다.

5.1. pmda-openmetrics 개요

Red Hat 리포지토리에 즉시 사용 가능한 PMDA가 없는 사용자 지정 또는 덜 일반적인 애플리케이션을 실행할 수 있습니다. 이러한 시나리오에서 pmda-openmetrics 에이전트는 이러한 격차를 해소하는 데 도움이 됩니다. pmda-openmetrics PMDA는 OpenMetrics 형식의 텍스트 파일을 PCP 호환 지표로 변환하여 임의의 애플리케이션의 성능 지표를 노출합니다. OpenMetrics는 Prometheus 및 기타 모니터링 툴에서 사용하는 널리 사용되는 형식이므로 통합을 더 쉽게 수행할 수 있습니다.

pmda-openmetrics 를 실행하여 다음 작업을 수행할 수 있습니다.

  • 기존 PMDAs에서 다루지 않는 사용자 지정 애플리케이션을 모니터링합니다.
  • 기존 OpenMetrics 또는 Prometheus 내보내기 지표를 PCP 프레임워크에 통합합니다.
  • 진단 또는 설명을 위한 빠른 모델 또는 테스트 메트릭을 생성합니다.

5.2. pmda-openmetrics 설치 및 구성

사용하기 전에 pmda-openmetrics 를 설치하고 구성해야 합니다. 다음 예제에서는 pmda-openmetrics 를 사용하여 텍스트 파일의 단일 숫자 값을 PCP 지표로 노출하는 방법을 보여줍니다.

사전 요구 사항

프로세스

  1. pmda-openmetrics PMDA를 설치합니다.

    # dnf -y install pcp-pmda-openmetrics
    # cd /var/lib/pcp/pmdas/openmetrics/
    # ./Install
  2. 샘플 OpenMetrics 파일을 만듭니다.

    # echo 'var1 {var2="var3"} 42' > /tmp/example.txt

    예제.txt를 사용하려는 파일 이름으로 바꿉니다.

  3. 파일이 올바르게 생성되었는지 확인합니다.

    # cat /tmp/example.txt
  4. OpenMetrics 에이전트에 지표 파일 경로를 등록합니다.

    # echo "file:///tmp/example.txt" > /etc/pcp/openmetrics/example.url
  5. 구성이 올바르게 생성되었는지 확인합니다.

    # cat /etc/pcp/openmetrics/example.url
  6. 필요한 심볼릭 링크를 생성하도록 systemd-tmpfiles 를 구성합니다.

    # echo 'L+ /var/lib/pcp/pmdas/openmetrics/config.d/example.url - - - - ../../../../../../etc/pcp/openmetrics/example.url' \ > /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf
  7. 심볼릭 링크가 올바르게 구성되었는지 확인합니다.

    # cat /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf
  8. tmpfiles 구성을 적용하여 심볼릭 링크를 만듭니다.

    # systemd-tmpfiles --create --remove /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf
  9. 심볼릭 링크가 올바르게 생성되었는지 확인합니다.

    # ls -al /var/lib/pcp/pmdas/openmetrics/config.d/
  10. 메트릭이 올바르게 보고되었는지 확인합니다.

    # pminfo -f openmetrics.example.var1
    inst [0 or "0 var2:var3"] value 42

검증

  • pcp 를 실행하고 openmetrics 가 나열되어 있는지 확인합니다.
  • systemd-analyze cat-config tmpfiles.d 를 실행하고 예제.url 이 출력에 표시되는지 확인합니다.
  • pminfo 를 사용하여 지표의 존재 및 값을 확인합니다.

6장. pmlogger를 사용하여 성능 데이터 로깅

PCP 도구를 사용하면 성능 지표 값을 기록하고 나중에 재생할 수 있습니다. 이 데이터를 사용하여 retrospective 성능 분석을 수행할 수 있습니다. pmlogger 툴을 사용하면 다음을 수행할 수 있습니다.

  • 시스템에서 선택한 지표의 보관된 로그를 생성합니다.
  • 시스템에 기록되는 메트릭과 빈도를 지정합니다.

6.1. pmlogconf를 사용하여 pmlogger 설정 파일 수정

pmlogger 서비스가 실행 중이면 PCP는 호스트의 기본 메트릭 세트를 기록합니다. pmlogconf 유틸리티를 사용하여 기본 구성을 확인합니다. pmlogger 구성 파일이 없으면 pmlogconf 에서 기본 지표 값으로 생성합니다.

사전 요구 사항

프로세스

  1. pmlogger 설정 파일을 생성하거나 수정합니다.

    # pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
  2. pmlogconf 프롬프트에 따라 관련 성능 지표 그룹을 활성화하거나 비활성화하고 각 활성화된 그룹의 로깅 간격을 제어합니다. 예를 들면 다음과 같습니다.

    # pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
    Group: per logical block device activity
    Log this group? [y]
    Logging interval? [default]

6.2. pmlogger 수동 구성

pmlogger 구성 파일을 수동으로 편집하여 특정 메트릭과 지정된 간격으로 맞춤형 로깅 구성을 생성할 수 있습니다. 기본 pmlogger 구성 파일은 /var/lib/pcp/config/pmlogger/config.default 입니다. 구성 파일은 기본 로깅 인스턴스에서 로깅하는 메트릭을 지정합니다.

수동 구성에서는 다음을 수행할 수 있습니다.

  • 자동 구성에 나열되지 않은 메트릭을 기록합니다.
  • 사용자 지정 로깅 빈도를 선택합니다.
  • 애플리케이션 메트릭을 사용하여 PMDA 를 추가합니다.

사전 요구 사항

프로세스

  • /var/lib/pcp/config/pmlogger/config.default 파일을 열고 편집하여 특정 메트릭을 추가합니다.

    # It is safe to make additions from here on ...
    #
    log mandatory on every 5 seconds {
        xfs.write
        xfs.write_bytes
        xfs.read
        xfs.read_bytes
    }
    log mandatory on every 10 seconds {
        xfs.allocs
        xfs.block_map
        xfs.transactions
        xfs.log
    }
    [access]
    disallow * : all;
    allow localhost : enquire;

6.3. pmlogger 서비스 활성화

로컬 시스템에 지표 값을 기록하려면 pmlogger 서비스를 시작하고 활성화해야 합니다.

사전 요구 사항

프로세스

  • pmlogger 서비스를 시작하고 활성화합니다.

    # systemctl start pmlogger
    # systemctl enable pmlogger

검증

  • pmlogger 서비스가 활성화되었는지 확인합니다.

    # pcp
     platform: Linux arm10.local 6.12.0-55.13.1.el10_0.aarch64 #1 SMP PREEMPT_DYNAMIC Mon May 19 07:29:57 UTC 2025 aarch64
     hardware: 4 cpus, 1 disk, 1 node, 3579MB RAM
     timezone: JST-9
     services: pmcd
         pmcd: Version 6.3.7-1, 12 agents, 6 clients
         pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2
               dm openmetrics
     pmlogger: primary logger: /var/log/pcp/pmlogger/arm10.local/20250529.15.49
         pmie: primary engine: /var/log/pcp/pmie/arm10.local/pmie.log

    자세한 내용은 /var/lib/pcp/config/pmlogger/config.default 파일을 참조하십시오.

6.4. 메트릭 수집에 대한 클라이언트 시스템 설정

중앙 서버가 PCP를 실행하는 클라이언트에서 성능 지표를 수집할 수 있도록 클라이언트 시스템을 구성할 수 있습니다.

사전 요구 사항

프로세스

  1. pcp-system-tools 패키지를 설치합니다.

    # dnf install pcp-system-tools
  2. pmcd의 IP 주소를 구성합니다.

    # echo "-i 192.168.4.62" >>/etc/pcp/pmcd/pmcd.options

    192.168.4.62 를 IP 주소로 교체합니다. 클라이언트가 수신 대기해야 합니다. 기본적으로 pmcd 는 localhost에서 수신 대기합니다.

  3. 공용 영역을 영구적으로 추가하도록 방화벽을 구성합니다.

    # firewall-cmd --permanent --zone=public --add-port=44321/tcp
    success
    # firewall-cmd --reload
    success
  4. SELinux 부울을 설정합니다.

    # setsebool -P pcp_bind_all_unreserved_ports on
  5. pmcdpmlogger 서비스를 활성화합니다.

    # systemctl enable pmcd pmlogger
    # systemctl restart pmcd pmlogger

검증

  • pmcd 가 구성된 IP 주소에서 올바르게 수신 대기 중인지 확인합니다.

    # ss -tlp | grep 44321
    LISTEN   0   5     127.0.0.1:44321   0.0.0.0:*   users:(("pmcd",pid=151595,fd=6))
    LISTEN   0   5  192.168.4.62:44321   0.0.0.0:*   users:(("pmcd",pid=151595,fd=0))
    LISTEN   0   5         [::1]:44321      [::]:*   users:(("pmcd",pid=151595,fd=7))

6.5. 데이터 수집을 위한 중앙 서버 설정

중앙 서버를 생성하여 PCP를 실행하는 클라이언트에서 지표를 수집할 수 있습니다.

사전 요구 사항

프로세스

  1. pcp-system-tools 패키지를 설치합니다.

    # dnf install pcp-system-tools
  2. 다음 콘텐츠를 사용하여 /etc/pcp/pmlogger/control.d/remote 파일을 만듭니다.

    # DO NOT REMOVE OR EDIT THE FOLLOWING LINE
    $version=1.1
    192.168.4.13 n n PCP_ARCHIVE_DIR/rhel7u4a -r -T24h10m -c config.rhel7u4a
    192.168.4.14 n n PCP_ARCHIVE_DIR/rhel6u10a -r -T24h10m -c config.rhel6u10a
    192.168.4.62 n n PCP_ARCHIVE_DIR/rhel8u1a -r -T24h10m -c config.rhel8u1a

    192.168.4.13,192.168.4.14192.168.4.62 를 클라이언트 IP 주소로 교체합니다.

  3. pmcd 및 pmlogger 서비스를 활성화합니다.

    # systemctl enable pmcd pmlogger
    # systemctl restart pmcd pmlogger

검증

  • 각 디렉터리에서 최신 아카이브 파일에 액세스할 수 있는지 확인합니다.

    # for i in /var/log/pcp/pmlogger/rhel*/*.0; do pmdumplog -L $i; done
    Log Label (Log Format Version 2)
    Performance metrics from host rhel6u10a.local
      commencing Mon Nov 25 21:55:04.851 2019
      ending     Mon Nov 25 22:06:04.874 2019
    Archive timezone: JST-9
    PID for pmlogger: 24002
    Log Label (Log Format Version 2)
    Performance metrics from host rhel7u4a
      commencing Tue Nov 26 06:49:24.954 2019
      ending     Tue Nov 26 07:06:24.979 2019
    Archive timezone: CET-1
    PID for pmlogger: 10941
    [..]

    /var/log/pcp/pmlogger/ 디렉토리의 아카이브 파일은 추가 분석 및 그래프 작성에 사용할 수 있습니다.

6.6. systemd 단위 및 pmlogger

pmlogger 배포(로컬 또는 원격 리전)에는 몇 가지 관련 systemd 서비스 및 타이머 장치가 포함되어 있습니다. 이 단위는 pmlogger 인스턴스를 모니터링하고, 실패한 프로세스를 다시 시작하며 파일 압축과 같은 작업을 통해 아카이브를 관리합니다.

pmlogger에서 일반적으로 배포한 검사 및 하우스키핑 서비스는 다음과 같습니다.

pmlogger_daily.service
기본적으로 자정 직후에 매일 실행되어 하나 이상의 PCP 아카이브 세트를 집계, 압축 및 순환합니다. 또한 culls는 제한보다 오래된 아카이브(기본적으로 2주)입니다. pmlogger_daily.timer 유닛에 의해 트리거되었으며 pmlogger.service 장치에서 필요합니다.
pmlogger_check
반 시간 동안은 pmlogger 인스턴스가 실행 중인지 확인합니다. 누락된 인스턴스를 재시작하고 필요한 압축 작업을 수행합니다. pmlogger_check.timer 유닛에 의해 트리거되었으며 pmlogger.service 유닛에 필요합니다.
pmlogger_farm_check
구성된 모든 pmlogger 인스턴스의 상태를 확인합니다. 누락된 인스턴스를 다시 시작합니다. 기본이 아닌 모든 인스턴스를 pmlogger_farm 서비스로 마이그레이션합니다. pmlogger_farm_check.timer 에서는 pmlogger_farm.service 장치에서 자체적으로 필요한 pmlogger _farm.service 유닛에 의해 트리거됩니다.

이러한 서비스는 일련의 긍정적인 종속 항목을 통해 관리되므로 기본 pmlogger 인스턴스를 활성화할 때 모두 활성화됩니다. pmlogger_daily.service 는 기본적으로 비활성화되어 있지만 pmlogger_daily.timerpmlogger.service 와의 종속성을 통해 활성화됩니다.

pmlogger_daily 는 병합하기 전에 자동으로 아카이브 다시 쓰기를 위해 pmlogrewrite 와 통합되어 있습니다. 이를 통해 변경 프로덕션 환경 및 PMDAs의 메타데이터 일관성을 유지할 수 있습니다. 예를 들어, 로깅 중에 pmcd 를 업데이트하면 메트릭 의미 체계를 변경하여 이전에 기록된 데이터와 호환되지 않는 새 아카이브를 생성할 수 있습니다. 자세한 내용은 시스템의 pmlogrewrite(1) 매뉴얼 페이지를 참조하십시오.

6.7. pmlogger에서 트리거한 systemd 서비스 관리

제어 파일을 사용하여 pmlogger 인스턴스에서 수집한 데이터에 대한 자동화된 사용자 지정 아카이브 관리 시스템을 생성할 수 있습니다.

참고

기본 pmlogger 인스턴스는 연결된 pmcd 와 동일한 호스트에서 실행되어야 합니다. 기본 인스턴스를 구성할 필요가 없습니다. 중앙 호스트가 원격 호스트에서 실행 중인 pmcd 인스턴스에 연결된 여러 pmlogger 인스턴스에서 데이터를 수집하는 경우 기본 인스턴스가 필요하지 않을 수 있습니다.

프로세스

  • 다음 중 하나를 수행합니다.

    • 기본 pmlogger 인스턴스의 경우 /etc/pcp/pmlogger/control.d/local을 사용합니다.
    • 원격 호스트의 경우 /etc/pcp/pmlogger/control.d/remote를 사용합니다.

      remote 를 사용하려는 파일 이름으로 교체합니다.

      파일에는 로깅할 각 호스트에 대해 하나의 행이 포함되어야 합니다. 자동으로 생성되는 기본 로거 인스턴스의 기본 형식은 다음과 유사합니다.

      # === LOGGER CONTROL SPECIFICATIONS ===
      #
      #Host   	 P?  S?    directory   		 args
      # local primary logger
      LOCALHOSTNAME    y   n    PCP_ARCHIVE_DIR/LOCALHOSTNAME    -r -T24h10m -c config.default -v 100Mb

      필드는 다음과 같습니다.

      호스트
      로깅할 호스트의 이름입니다.
      P?
      은 "Primary?"입니다. 이 필드는 호스트가 기본 로거 인스턴스인지 y, n 인지 여부를 나타냅니다. 하나의 기본 로거만 허용됩니다. 연결된 pmcd 인스턴스와 동일한 호스트에서 실행해야 합니다.
      S?
      은 "스크"입니다. 이 필드는 이 로거 인스턴스에서 방화벽, y 또는 not, n 을 통해 pmcd 에 연결하는 데 Cryostat 프로토콜을 사용해야 하는지 여부를 나타냅니다.
      디렉터리
      이 행과 연결된 모든 아카이브는 이 디렉터리에 생성됩니다.
      args
      인수는 pmlogger 에 전달됩니다. args 필드의 기본값은 다음과 같습니다.
      -r
      아카이브 크기 및 증가 속도를 보고합니다.
      T24h10m
      매일 로깅을 종료할 시기를 지정합니다. 일반적으로 pmlogger_daily.service 가 실행되는 시간입니다. 기본값 24h10m 은 로깅이 시작된 후 24 시간 및 10 분 후에 종료되어야 함을 나타냅니다.
      -c config.default
      사용할 구성 파일을 지정합니다. 이는 기록할 메트릭을 정의합니다.
      -v 100Mb
      한 데이터 볼륨이 채워지고 다른 데이터 볼륨이 생성되는 크기를 지정합니다. 새 아카이브로 전환하면 이전에 기록된 파일이 pmlogger_daily 또는 pmlogger_check 에 의해 압축됩니다.

6.8. pmrep를 사용하여 PCP 로그 아카이브 재생

메트릭 데이터를 기록한 후 PCP 로그 아카이브를 재생할 수 있습니다. 로그를 텍스트 파일로 내보내려면 pcp2csv,pcp2xml,pmrep 또는 pmlogsummary 와 같은 PCP 유틸리티를 사용합니다. pmrep 툴을 사용하면 다음을 수행할 수 있습니다.

  • 로그 파일을 확인합니다.
  • 선택한 PCP 로그 아카이브를 구문 분석하고 해당 값을 ASCII 테이블로 내보냅니다.
  • 명령줄에서 개별 메트릭을 지정하여 전체 아카이브 로그를 추출하거나 로그에서 메트릭 값만 선택합니다.

사전 요구 사항

프로세스

  • 메트릭의 데이터를 표시합니다.

    $ pmrep --start @3:00am --archive 20211128 --interval 5seconds --samples 10 --output csv disk.dev.write
    Time,"disk.dev.write-sda","disk.dev.write-sdb"
    2021-11-28 03:00:00,,
    2021-11-28 03:00:05,4.000,5.200
    2021-11-28 03:00:10,1.600,7.600
    2021-11-28 03:00:15,0.800,7.100
    2021-11-28 03:00:20,16.600,8.400
    2021-11-28 03:00:25,21.400,7.200
    2021-11-28 03:00:30,21.200,6.800
    2021-11-28 03:00:35,21.000,27.600
    2021-11-28 03:00:40,12.400,33.800
    2021-11-28 03:00:45,9.800,20.600

    이 예제에서는 아카이브에 수집된 disk.dev.write 지표의 데이터를 쉼표로 구분된-값 형식으로 5초 간격으로 표시합니다. 이 예에서 20211128 을 데이터를 표시할 pmlogger 아카이브가 포함된 파일 이름으로 교체합니다.

7장. Performance Co- Cryostat를 사용하여 성능 모니터링

PCP(Performance Co- Cryostat)는 시스템 수준 성능 측정을 모니터링, 시각화, 저장 및 분석하기 위한 툴, 서비스 및 라이브러리 제품군입니다. 시스템 관리자는 Red Hat Enterprise Linux에서 PCP를 사용하여 시스템의 성능을 모니터링할 수 있습니다.

7.1. pmda- Cryostat를 사용하여 postfix 모니터링

pmda- Cryostat를 사용하여 postfix 메일 서버의 성능 지표를 모니터링할 수 있습니다. 초당 수신되는 이메일 수를 확인하는 데 도움이 됩니다.

사전 요구 사항

프로세스

  1. 다음 패키지를 설치합니다.

    1. pcp-system-tools 를 설치합니다.

      # dnf install pcp-system-tools
    2. pmda- Cryostat 패키지를 설치하여 postfix 를 모니터링합니다.

      # dnf install pcp-pmda-postfix postfix
    3. 로깅 데몬을 설치합니다.

      # dnf install rsyslog
    4. 테스트할 메일 클라이언트를 설치합니다.

      # dnf install mutt
  2. postfixrsyslog 서비스를 활성화합니다.

    # systemctl enable postfix rsyslog
    # systemctl restart postfix rsyslog
  3. pmda- Cryostat가 필요한 로그 파일에 액세스할 수 있도록 SELinux 부울을 활성화합니다.

    # setsebool -P pcp_read_generic_logs=on
  4. PMDA를 설치합니다.

    # cd /var/lib/pcp/pmdas/postfix/
    # ./Install
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD ...
    Waiting for pmcd to terminate ...
    Starting pmcd ...
    Check postfix metrics have appeared ... 7 metrics and 58 values

검증

  • pmda- Cryostat 작업을 확인합니다.

    echo testmail | mutt root
  • 사용 가능한 메트릭을 확인합니다.

    # pminfo postfix
    postfix.received
    postfix.sent
    postfix.queues.incoming
    postfix.queues.maildrop
    postfix.queues.hold
    postfix.queues.deferred
    postfix.queues.active

지표 데이터를 기록한 후 PCP 로그 아카이브를 그래프로 재생합니다. 메트릭은 하나 이상의 라이브 호스트에서 소싱됩니다. PCP 로그 아카이브의 메트릭 데이터를 기록 데이터 소스로 사용할 수도 있습니다.

PCP 차트 애플리케이션의 인터페이스를 사용자 지정하여 성능 지표 데이터를 표시하려면 선 플롯, 막대 그래프 또는 사용률 그래프를 사용합니다.

PCP 차트 애플리케이션을 사용하면 다음을 수행할 수 있습니다.

  • PCP 차트 애플리케이션에서 데이터를 재생하고 그래프를 사용하여 시스템의 실시간 데이터와 함께 세부적 데이터를 시각화합니다.
  • 성능 지표 값을 그래프로 플롯합니다.
  • 여러 차트를 동시에 표시합니다.

사전 요구 사항

프로세스

  1. 명령줄에서 PCP 차트 애플리케이션을 시작합니다.

    # pmchart

    pmtime 서버 설정은 하단에 있습니다. 시작일시 중지 버튼을 사용하면 다음을 제어할 수 있습니다.

    • PCP가 메트릭 데이터를 폴링하는 간격
    • 기록 데이터 메트릭의 날짜 및 시간
  2. 파일새 차트 를 클릭한 다음 새 차트를 클릭하여 호스트 이름 또는 주소를 지정하여 로컬 시스템 및 원격 시스템에서 지표를 선택합니다. 고급 구성 옵션에는 차트의 축 값을 수동으로 설정하고 플롯의 색상을 수동으로 선택하는 기능이 포함됩니다.
  3. PCP Charts 애플리케이션에서 생성된 뷰를 기록합니다.

    다음은 이미지를 사용하거나 PCP 차트 애플리케이션에서 생성된 뷰를 기록하는 옵션입니다.

    • 파일내보내기 를 클릭하여 현재 뷰의 이미지를 저장합니다.
    • 기록 을 클릭한 다음 시작을 클릭하여 레코딩을 시작합니다.
    • 기록 을 클릭한 다음 중지 를 클릭하여 레코딩을 중지합니다. 기록을 중지한 후에는 기록된 메트릭을 나중에 볼 수 있도록 보관합니다.
  4. 선택 사항: PCP 차트 애플리케이션에서 뷰라는 기본 구성 파일은 하나 이상의 차트와 연결된 메타데이터를 저장합니다. 이 메타데이터는 사용된 메트릭과 차트 열을 포함하여 모든 차트 측면을 설명합니다.
  5. 선택 사항: 파일을 클릭한 다음 뷰를 저장하고 나중에 보기 구성을 로드하여 사용자 지정 보기 구성을 저장합니다.

    PCP 차트 애플리케이션 뷰 구성 파일의 다음 예제에서는 지정된 XFS 파일 시스템 loop1 에 읽고 쓰는 총 바이트 수를 보여주는 스택 차트 그래프를 설명합니다.

    # pmchart
    version 1
    chart title "Filesystem Throughput /loop1" style stacking antialiasing off
        plot legend Read rate   metric xfs.read_bytes   instance  loop1
        plot legend Write rate  metric xfs.write_bytes  instance  loop1

7.3. PCP를 사용하여 SQL 서버에서 데이터 수집

데이터베이스 성능 문제를 모니터링하고 분석하려면 PCP(Performance Co- Cryostat)에서 SQL Server 에이전트를 사용합니다. 시스템에서 PCP를 사용하여 Microsoft SQL Server에 대한 데이터를 수집할 수 있습니다.

사전 요구 사항

  • Red Hat Enterprise Linux용 Microsoft SQL Server를 설치하고 SQL 서버에 대한 신뢰할 수 있는 연결을 설정했습니다.
  • Red Hat Enterprise Linux용 SQL Server용 Microsoft ODBC 드라이버를 설치했습니다.

프로세스

  1. Install PCP:

    # dnf install pcp-zeroconf
  2. pyodbc 드라이버에 필요한 패키지를 설치합니다.

    # dnf install gcc-c++ python3-devel unixODBC-devel
    # dnf install python3-pyodbc
  3. mssql 에이전트를 설치합니다.

    1. PCP용 Microsoft SQL Server 도메인 에이전트를 설치합니다.

      # dnf install pcp-pmda-mssql
    2. /etc/pcp/mssql/mssql.conf 파일을 편집하여 mssql 에이전트의 SQL 서버 계정 사용자 이름과 암호를 구성합니다. 구성하는 계정에 성능 데이터에 대한 액세스 권한이 있는지 확인합니다.

      username: user_name
      password: user_password

      user_name 을 SQL Server 계정 사용자 이름 및 user_password 로 이 계정의 SQL Server 사용자 암호로 바꿉니다.

  4. 에이전트를 설치합니다.

    # cd /var/lib/pcp/pmdas/mssql
    # ./Install
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD ...
    Check mssql metrics have appeared ... 168 metrics and 598 values
    [...]

검증

  • pcp 명령을 사용하여 SQL Server PMDA(mssql)가 로드되어 실행 중인지 확인합니다.

    $ pcp
    Performance Co-Pilot configuration on rhel.local:
    platform: Linux rhel.local 4.18.0-167.el8.x86_64 #1 SMP Sun Dec 15 01:24:23 UTC 2019 x86_64
     hardware: 2 cpus, 1 disk, 1 node, 2770MB RAM
     timezone: PDT+7
     services: pmcd pmproxy
         pmcd: Version 5.0.2-1, 12 agents, 4 clients
         pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm mssql
               jbd2 dm
     pmlogger: primary logger: /var/log/pcp/pmlogger/rhel.local/20200326.16.31
        pmie: primary engine: /var/log/pcp/pmie/rhel.local/pmie.log
  • PCP가 SQL Server에서 수집할 수 있는 전체 메트릭 목록을 확인합니다.

    # pminfo mssql
  • 메트릭 목록을 확인한 후 트랜잭션 속도를 보고할 수 있습니다. 예를 들어 5초 동안 총 트랜잭션 수를 초당 보고하려면 다음을 수행합니다.

    # pmval -t 1 -T 5 mssql.databases.transactions
  • pmchart 명령을 사용하여 시스템에서 이러한 지표의 그래픽 차트를 확인합니다. 자세한 내용은 시스템의 PCP 차트 애플리케이션 및 pcp(1), pminfo(1), pmval(1), pmchart(1)pmdamssql(1) 도움말 페이지를 사용하여 PCP 로그 아카이브 시각화를 참조하십시오.

8장. PCP 메트릭의 그래픽 표현 설정

Performance Co-pilot(pcp), grafana,valkey,pcp bftracepcp 벡터 를 결합하여 라이브 또는 기록된 PCP 데이터의 그래픽 표현을 제공합니다.

8.1. pcp-zeroconf를 사용하여 PCP 설정

pcp-zeroconf 패키지를 사용하여 시스템에서 PCP를 구성할 수 있습니다. pcp-zeroconf 패키지가 설치되면 시스템은 기본 메트릭 세트를 보관된 파일에 기록합니다.

프로세스

  • pcp-zeroconf 패키지를 설치합니다.

    # dnf install pcp-zeroconf

검증

  • pmlogger 서비스가 활성화되어 있는지 확인하고 메트릭 보관을 시작합니다.

    # pcp | grep pmlogger
    pmlogger: primary logger: /var/log/pcp/pmlogger/localhost.localdomain/20200401.00.12

8.2. grafana-server 설정

Grafana는 브라우저에서 액세스할 수 있는 그래프를 생성합니다. grafana-server 는 Grafana 대시보드의 백엔드 서버입니다. 기본적으로 모든 인터페이스에서 수신 대기하고 웹 브라우저를 통해 액세스하는 웹 서비스를 제공합니다. grafana-pcp 플러그인은 백엔드의 pmproxy 데몬과 상호 작용합니다.

사전 요구 사항

프로세스

  1. 다음 패키지를 설치합니다.

    # dnf install grafana grafana-pcp
  2. grafana-server 를 다시 시작하고 활성화합니다.

    # systemctl restart grafana-server
    # systemctl enable grafana-server
  3. Grafana 서비스에 대한 네트워크 트래픽에 대한 서버의 방화벽을 엽니다.

    # firewall-cmd --permanent --add-service=grafana
    success
    # firewall-cmd --reload
    success

검증

  • grafana-server 가 요청을 수신하고 응답하는지 확인합니다.

    # ss -ntlp | grep 3000
    LISTEN  0  128  :3000 *:  users:(("grafana-server",pid=19522,fd=7))
  • grafana-pcp 플러그인이 설치되어 있는지 확인합니다.

    # grafana-cli plugins ls | grep performancecopilot-pcp-app
    performancecopilot-pcp-app @ 5.2.2

8.3. valkey 구성

valkey 데이터 소스를 사용하여 다음을 수행할 수 있습니다.

  • 데이터 아카이브 보기
  • pmseries 언어를 사용하여 쿼리 시계열
  • 여러 호스트의 데이터 분석

사전 요구 사항

프로세스

  1. valkey 패키지를 설치합니다.

    # dnf install valkey
  2. pmproxyvalkey 서비스를 시작하고 활성화합니다.

    # systemctl start pmproxy valkey
    # systemctl enable pmproxy valkey
  3. grafana-server 다시 시작 :

    # systemctl restart grafana-server

검증

  • pmproxyvalkey 가 작동하는지 확인합니다.

    # pmseries disk.dev.read
    2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df

    valkey 패키지가 설치되지 않은 경우 이 명령은 데이터를 반환하지 않습니다.

    자세한 내용은 시스템의 pmseries(1) 매뉴얼 페이지를 참조하십시오.

8.4. Grafana 웹 UI에 액세스

Grafana 웹 인터페이스에 액세스할 수 있습니다. Grafana 웹 인터페이스를 사용하여 다음을 수행할 수 있습니다.

  • Valkey, PCP bpftrace 및 PCP 벡터 데이터 소스 추가
  • 대시보드 만들기
  • 유용한 메트릭의 개요 보기
  • Valkey에서 경고 생성

사전 요구 사항

프로세스

  1. 클라이언트 시스템에서 브라우저를 열고 http://192.0.2.0:3000 링크를 사용하여 포트 3000에서 grafana-server 에 액세스합니다.

    원격 시스템에서 Grafana 웹 UI에 액세스할 때 192.0.2.0 을 시스템 IP로 교체하거나 웹 UI에 로컬로 액세스할 때 localhost 로 바꿉니다.

  2. 첫 번째 로그인의 경우 Email 또는 usernamePassword 필드에 admin을 입력합니다.
  3. Grafana에서 보안 계정을 생성하기 위해 새 암호를 설정하라는 메시지를 표시합니다. 나중에 설정하려면 Skip 을 클릭합니다.
  4. 왼쪽 상단에 있는 더 많은 옵션 아이콘( goal)에서 Administration > Plugins 를 클릭합니다.
  5. 플러그인 탭에서 이름으로 검색하거나 텍스트 상자에 성능 공동 배치를 입력한 다음 PCP(Performance Co- Cryostat) 플러그인을 클릭합니다.
  6. Plugins / Performance Co- Cryostat 창에서 Enable 을 클릭합니다.
  7. Grafana 아이콘을 클릭합니다. Grafana 홈 페이지가 표시됩니다.

    그림 8.1. 홈 대시보드

    홈 대시보드
    참고

    화면의 맨 위에는 설정 아이콘이 있지만 일반 대시보드 설정을 제어합니다.

  8. Grafana 홈 페이지에서 첫 번째 데이터 소스 추가를 클릭하여 Valkey, PCP bpftrace 및 PCP Vector 데이터 소스를 추가합니다.

  9. 선택 사항: 메뉴에서 admin 프로필 아이콘 위로 마우스를 이동하여 프로필 편집,암호 변경 등 기본 설정을 변경하거나 암호 변경을.

    자세한 내용은 시스템의 grafana-cligrafana-server 도움말 페이지를 참조하십시오.

8.5. Valkey 및 PCP에 대한 보안 연결 구성

PCP(Performance Co- Cryostat), Grafana 및 Valkey 간에 보안 연결을 설정할 수 있습니다. 이러한 구성 요소 간에 보안 연결을 설정하면 권한이 없는 당사자가 수집 및 모니터링 중인 데이터에 액세스하거나 수정하지 못하도록 할 수 있습니다.

사전 요구 사항

  • PCP가 설치되어 있습니다. 자세한 내용은 PCP 설치 및 활성화를 참조하십시오.
  • Grafana 서버가 구성되어 있습니다. 자세한 내용은 grafana-server 설정을 참조하십시오.
  • Valkey가 설치되어 있어야 합니다. 자세한 내용은 Valkey 구성을 참조하십시오.
  • 개인 클라이언트 키는 /etc/valkey/client.key 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계에서 경로를 수정합니다. 개인 키 생성, CSR(인증서 서명 요청) 생성 및 CA(인증 기관)에서 인증서를 요청하는 방법에 대한 자세한 내용은 CA 설명서를 참조하십시오.
  • TLS 클라이언트 인증서는 /etc/valkey/client.crt 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계에서 경로를 수정합니다.
  • TLS 서버 키는 /etc/valkey/valkey.key 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계에서 경로를 수정합니다.
  • TLS 서버 인증서는 /etc/valkey/valkey.crt 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계에서 경로를 수정합니다.
  • CA 인증서는 /etc/valkey/ca.crt 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계에서 경로를 수정합니다.
  • pmproxy 데몬의 경우 개인 서버 키는 /etc/pcp/tls/server.key 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계에서 경로를 수정합니다.

프로세스

  1. root 사용자로 /etc/valkey/valkey.conf 파일을 열고 다음 속성을 반영하도록 TLS/SSL 옵션을 조정합니다.

    port 0
    tls-port 6379
    tls-cert-file /etc/valkey/valkey.crt
    tls-key-file /etc/valkey/valkey.key
    tls-client-key-file /etc/valkey/client.key
    tls-client-cert-file /etc/valkey/client.crt
    tls-ca-cert-file /etc/valkey/ca.crt
  2. valkey가 TLS 인증서에 액세스할 수 있는지 확인합니다.

    # su valkey -s /bin/bash -c \
      'ls -1 /etc/valkey/ca.crt /etc/valkey/valkey.key /etc/valkey/valkey.crt'
    /etc/valkey/ca.crt
    /etc/valkey/valkey.crt
    /etc/valkey/valkey.key
  3. valkey 서버를 다시 시작하여 구성 변경 사항을 적용합니다.

    # systemctl restart valkey

검증

  • TLS 구성이 작동하는지 확인합니다.

    # valkey-cli --tls --cert /etc/valkey/client.crt \
        --key /etc/valkey/client.key \
        --cacert /etc/valkey/ca.crt <<< "PING"
    PONG
    Unsuccessful TLS configuration might result in the following error message:
    Could not negotiate a TLS connection: Invalid CA Certificate File/Directory

8.6. PCP Valkey 데이터 소스에서 패널 및 경고 생성

PCP Valkey 데이터 소스를 추가한 후 유용한 메트릭에 대한 개요를 사용하여 대시보드를 볼 수 있습니다. 로드 그래프를 시각화하는 쿼리를 추가하고 발생한 후 시스템 문제를 확인하는 데 도움이 되는 경고를 생성합니다.

사전 요구 사항

  • Valkey가 구성되어 있습니다. 자세한 내용은 Valkey 구성을 참조하십시오.
  • grafana-server 에 액세스할 수 있습니다. 자세한 내용은 Grafana 웹 UI 액세스를 참조하십시오.

프로세스

  1. Grafana 웹 UI에 로그인합니다.
  2. Grafana 홈 페이지에서 첫 번째 데이터 소스 추가를 클릭합니다.
  3. 데이터 소스 추가 창에서 이름으로 필터링 또는 입력 텍스트 상자에 valkey를 입력한 다음 Valkey를 클릭합니다.
  4. 데이터 소스 / Valkey 창에서 다음을 수행합니다.

    1. URL 필드에 http://localhost:44322 를 추가한 다음 저장 및 테스트를 클릭합니다.
    2. 대시보드 탭 > 가져오기 > Valkey: 호스트 개요 를 클릭하여 유용한 메트릭에 대한 개요가 있는 대시보드를 확인합니다.

      그림 8.2. Valkey: 호스트 개요

      Valkey: 호스트 개요 대시보드
  5. 새 패널을 추가합니다.

    1. 메뉴에서 Create icon > Dashboard > Add new panel icon을 마우스로 이동하여 패널을 추가합니다.
    2. 쿼리 탭의 선택한 기본 옵션 대신 쿼리 목록에서 Valkey 를 선택하고 A 의 텍스트 필드에 metric을 입력합니다(예: kernel.all.load )를 입력하여 커널 로드 그래프를 시각화합니다.
    3. 선택 사항: 패널 제목설명 추가 및 설정에서 다른 옵션을 업데이트합니다.
    4. 저장을 클릭하여 변경 사항을 적용하고 대시보드를 저장합니다. 대시보드 이름 추가.
    5. 적용을 클릭하여 변경 사항을 적용하고 대시보드로 돌아갑니다.

      그림 8.3. Valkey 쿼리 패널

      PCP Valkey 쿼리 패널 구성
  6. 경고 규칙을 생성합니다.

    1. Valkey 쿼리 패널에서 경고를 클릭한 다음 Create Alert 를 클릭합니다.
    2. 규칙에서 Name,Evaluate 쿼리For 필드를 편집하고 경고 조건 을 지정합니다.
    3. 저장을 클릭하여 변경 사항을 적용하고 대시보드를 저장합니다. 적용을 클릭하여 변경 사항을 적용하고 대시보드로 돌아갑니다.

      그림 8.4. Valkey 패널에서 경고 생성

      임계값 구성이 포함된 PCP Valkey 경고 패널
    4. 선택 사항: 동일한 패널에서 아래로 스크롤하고 삭제 아이콘을 클릭하여 생성된 규칙을 삭제합니다.
    5. 선택 사항: 메뉴에서 경고 아이콘을 클릭하여 다양한 경고 상태로 생성된 경고 규칙을 보거나, 경고 규칙을 편집하거나, 경고 규칙 탭에서 기존 규칙을 일시 중지합니다. Grafana에서 경고 알림을 수신하기 위해 생성된 경고 규칙에 대한 알림 채널을 추가하려면 알림 채널 추가를 참조하십시오.

8.7. 경고에 대한 알림 채널 추가

규칙 조건이 충족되고 시스템에 주의가 필요할 때 Grafana에서 경고 알림을 수신하도록 알림 채널을 추가합니다. 지원되는 알림 목록에서 하나의 유형을 선택한 후 이러한 경고를 받을 수 있습니다.

이 분류에는 DingDing, Discord, Email, Google Hangouts say, HipChat, Kafka REST Proxy, LINE, Microsoft Teams, OpsGenie, PagerDuty, Prometheus Alertmanager, Pushover, Sensu, Slack, Telegram, threema Gateway, VictorOps웹 후크 가 포함됩니다.

사전 요구 사항

  • grafana-server 에 액세스할 수 있습니다. 자세한 내용은 Grafana 웹 UI 액세스를 참조하십시오.
  • 경고 규칙이 생성됩니다. 자세한 내용은 PCP valkey 데이터 소스에서 패널 및 경고 생성 을 참조하십시오.
  • SMTP를 구성하고 grafana/grafana.ini 파일에 유효한 보낸 사람의 이메일 주소를 추가했습니다. 예를 들면 다음과 같습니다.

    # vi /etc/grafana/grafana.ini
    [smtp]
    enabled = true
    from_address = abc@gmail.com

    abc@gmail.com 을 유효한 이메일 주소로 바꿉니다.

  • 구성을 변경한 후 grafana-server를 다시 시작합니다.

    # systemctl restart grafana-server.service

프로세스

  1. 메뉴에서 알림 아이콘 위로 마우스를 가져가면 알림 채널 > 채널 추가 를 클릭합니다.
  2. 알림 채널 세부 정보 창에서 다음을 수행합니다.

    1. 이름 텍스트 상자에 이름을 입력합니다.
    2. 통신 유형 (예: 이메일 )을 선택하고 이메일 주소를 입력합니다. 구분 기호를 사용하여 여러 이메일 주소를 추가할 수 있습니다.
    3. 선택 사항: 선택적 이메일 설정 및 알림 설정을 구성합니다.
  3. 저장을 클릭합니다.
  4. 경고 규칙에서 알림 채널을 선택합니다.

    1. 메뉴에서 경고 아이콘 위로 마우스를 누른 다음 경고 규칙을 클릭합니다.
    2. Alert Rules 탭에서 생성된 경고 규칙을 클릭합니다.
    3. 알림 탭의 Send to 옵션에서 알림 채널 이름을 선택한 다음 경고 메시지를 추가합니다.
  5. 적용을 클릭합니다.

8.8. PCP 구성 요소 간 인증 설정

scram-sha-256 인증 메커니즘을 사용하여 인증을 구성할 수 있습니다. SASL(Simple Authentication Security Layer) 프레임워크를 통해 PCP에서 지원합니다.

프로세스

  1. scram-sha-256 인증 메커니즘을 위한 SASL 프레임워크를 설치합니다.

    # dnf install cyrus-sasl-scram cyrus-sasl-lib
  2. pmcd.conf 파일에서 지원되는 인증 메커니즘 및 사용자 데이터베이스 경로를 지정합니다.

    # vi /etc/sasl2/pmcd.conf
    mech_list: scram-sha-256
    sasldb_path: /etc/pcp/passwd.db
  3. 새 사용자를 생성합니다.

    # useradd -r metrics

    메트릭을 사용자 이름으로 교체합니다.

  4. 사용자 데이터베이스에 생성된 사용자를 추가합니다.

    # saslpasswd2 -a pmcd metrics
    Password:
    Again (for verification):

    생성된 사용자를 추가하려면 지표 계정 암호를 입력해야 합니다.

  5. 사용자 데이터베이스의 권한을 설정합니다.

    # chown root:pcp /etc/pcp/passwd.db
    # chmod 640 /etc/pcp/passwd.db
  6. pmcd 서비스를 다시 시작합니다.

    # systemctl restart pmcd

검증

  • SASL 구성을 확인합니다.

    # pminfo -f -h "pcp://127.0.0.1?username=metrics" disk.dev.read
    Password:
    disk.dev.read
    inst [0 or "sda"] value 19540

8.9. PCP bpftrace 설치

PCP bpftrace 에이전트를 설치하여 시스템을 검사하고 커널 및 사용자 공간 추적에서 지표를 수집할 수 있습니다. bpftrace 에이전트는 bpftrace 스크립트를 사용하여 지표를 수집합니다. bpftrace 스크립트는 향상된 Berkeley Packet Filter(eBPF)를 사용합니다.

사전 요구 사항

프로세스

  1. pcp-pmda-bpftrace 패키지를 설치합니다.

    # dnf install pcp-pmda-bpftrace
  2. bpftrace.conf 파일을 편집하고 사용자를 추가합니다.

    # vi /var/lib/pcp/pmdas/bpftrace/bpftrace.conf
    [dynamic_scripts]
    enabled = true
    auth_enabled = true
    allowed_users = root,metrics

    PCP 구성 요소 간 인증 설정에서 메트릭 사용자 이름으로 바꿉니다.

  3. bpftrace PMDA를 설치합니다.

    # cd /var/lib/pcp/pmdas/bpftrace/
    # ./Install
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD …
    Check bpftrace metrics have appeared ... 7 metrics and 6 values

    pmda-bpftrace 가 설치되었으며 사용자를 인증한 후에만 사용할 수 있습니다. 자세한 내용은 PCP bpftrace 시스템 분석 대시보드 보기를 참조하십시오.

8.10. PCP bpftrace 시스템 분석 대시보드 보기

PCP bpftrace 데이터 소스는 표준 pmlogger 인스턴스 또는 아카이브를 통해 사용할 수 없는 실시간 데이터에 액세스합니다. PCP bpftrace 데이터 소스에서 유용한 메트릭에 대한 개요를 사용하여 대시보드를 확인합니다.

사전 요구 사항

프로세스

  1. Grafana 웹 UI 에 로그인합니다.
  2. Grafana 홈 페이지에서 첫 번째 데이터 소스 추가를 클릭합니다.
  3. 데이터 소스 추가 창에서 이름으로 필터링 또는 입력 텍스트 상자에 bpftrace 를 입력한 다음 PCP bpftrace 를 클릭합니다.
  4. 데이터 소스 / PCP bpftrace 창에서 다음을 수행합니다.

    1. URL 필드에 http://localhost:44322 를 추가합니다.
    2. 기본 인증 옵션을 전환하고 UserPassword 필드에 생성된 사용자 인증 정보를 추가합니다.
    3. 저장 및 테스트를 클릭합니다.

      그림 8.5. 데이터 소스에 PCP bpftrace 추가

      BPFtrace 인증 프롬프트
    4. 대시보드 탭 > 가져오기 > PCP bpftrace: 시스템 분석을 클릭하여 유용한 메트릭에 대한 개요가 있는 대시보드를 확인합니다.

      그림 8.6. PCP bpftrace: 시스템 분석

      PCP bpftrace: 시스템 분석 대시보드

8.11. PCP 벡터 설치

사용하기 전에 pcp 벡터를 설치해야 합니다.

사전 요구 사항

프로세스

  • bcc PMDA를 설치합니다.

    # cd /var/lib/pcp/pmdas/bcc
    # ./Install
    [Wed Apr  1 00:27:48] pmdabcc(22341) Info: Initializing, currently in 'notready' state.
    [Wed Apr  1 00:27:48] pmdabcc(22341) Info: Enabled modules:
    [Wed Apr  1 00:27:48] pmdabcc(22341) Info: ['biolatency', 'sysfork',
    [...]
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD …
    Check bcc metrics have appeared ... 1 warnings, 1 metrics and 0 values

8.12. PCP 벡터 체크리스트 보기

PCP 벡터 데이터 소스는 라이브 메트릭을 표시하고 pcp 메트릭을 사용합니다. 개별 호스트에 대한 데이터를 분석합니다. PCP 벡터 데이터 소스를 추가한 후 유용한 메트릭에 대한 개요를 사용하여 대시보드를 확인합니다. 또한 체크리스트에서 관련 문제 해결 또는 참조 링크를 확인하십시오.

사전 요구 사항

  • PCP 벡터가 설치되어 있습니다. 자세한 내용은 PCP 벡터 설치를 참조하십시오.
  • grafana-server 에 액세스할 수 있습니다. 자세한 내용은 Grafana 웹 UI 액세스를 참조하십시오.

프로세스

  1. Grafana 웹 UI 에 로그인합니다.
  2. Grafana 홈 페이지에서 첫 번째 데이터 소스 추가를 클릭합니다.
  3. 데이터 소스 추가 창에서 이름으로 필터링 또는 입력 텍스트 상자에 벡터를 입력한 다음 PCP 벡터 를 클릭합니다.
  4. 데이터 소스 / PCP 벡터 창에서 다음을 수행합니다.

    1. URL 필드에 http://localhost:44322 를 추가한 다음 저장 및 테스트를 클릭합니다.
    2. 대시보드 탭 > 가져오기 * PCP 벡터: 호스트 개요 를 클릭하여 유용한 메트릭에 대한 개요가 있는 대시보드를 확인합니다.

      그림 8.7. PCP 벡터: 호스트 개요

      PCP 벡터: 호스트 개요
  5. 메뉴에서 Performance Co- Cryostat 플러그인을 마우스로 이동한 다음 PCP Vector Checklist를 클릭합니다.

    PCP 체크리스트에서 도움말 또는 경고 아이콘을 클릭하여 관련 문제 해결 또는 참조 링크를 확인합니다.

    그림 8.8. Performance Co- Cryostat / PCP Vector Checklist

    PCP 벡터 검사 목록

8.13. Grafana에서 heatmaps 사용

Grafana의 heatmaps를 사용하여 데이터를 히스토그램으로 보고, 데이터 추세 및 패턴을 식별하고, 시간이 지남에 따라 어떻게 변경되는지 확인합니다. 각 heatmap 열은 히스토그램이며, 셀 색상은 관찰의 밀도를 나타냅니다.

사전 요구 사항

프로세스

  1. 대시보드 탭 위에 커서를 올리고 + 새 대시보드 를 클릭합니다.
  2. 패널 추가 메뉴에서 새 패널 추가를 클릭합니다.
  3. 쿼리 탭에서 다음을 수행합니다.

    1. 선택한 기본 옵션 대신 쿼리 목록에서 Valkey 를 선택합니다.
    2. A 의 텍스트 필드에 지표를 입력합니다 (예: kernel.all.load ) 커널 로드 그래프를 시각화합니다.
  4. 기본적으로 시계열 로 설정된 시각화 드롭다운 메뉴를 클릭한 다음 Heatmap 을 클릭합니다.
  5. 선택 사항: 패널 옵션 드롭다운 메뉴에서 Panel 제목설명을 추가합니다.
  6. Heatmap 드롭다운 메뉴의 데이터 설정에서 예를 클릭합니다.

    그림 8.9. heatmap

    Grafana heatmap
  7. 선택 사항: 색상 드롭다운 메뉴에서 기본 Orange 에서 Scheme 을 변경하고 단계 수(색영)를 선택합니다.
  8. 선택 사항: 툴팁 드롭다운 메뉴에서 히스토그램(Y Cryostat) 설정 아래의 토글을 클릭하여 heatmap의 셀 위에 커서를 올리면 특정 히스토그램 내에 셀의 위치를 표시합니다. 예를 들면 다음과 같습니다.

    Show histogram (Y Axis) cell display

8.14. Managing SELinux booleans for Grafana

grafana-selinux 하위 패키지에는 Grafana의 외부 서비스에 대한 액세스를 제어하는 여러 SELinux 부울이 포함되어 있습니다. 이러한 부울은 기본적으로 꺼져 있습니다. 시스템 요구 사항에 따라 거나 수 있습니다.

사전 요구 사항

  • grafana-selinux 하위 패키지를 설치했습니다.
  • root 권한이 있습니다.

프로세스

  1. 모든 Grafana 관련 SELinux 부울을 표시합니다.

    # semanage boolean -l | grep grafana
  2. SELinux 부울을 활성화합니다.

    # setsebool [-P] <boolean_name> on
    • & lt;boolean_name >을 활성화하려는 SELinux 부울의 이름으로 바꿉니다.
    • -P 옵션을 사용하여 시스템 재부팅 시 영구적으로 변경합니다.
  3. 선택 사항: SELinux 옵션을 끕니다.

    # setsebool [-P] <boolean_name> off

8.15. Grafana 문제 해결

경우에 따라 Grafana와 같은 Grafana 문제(예: 데이터, 검정 대시보드 또는 유사한 문제를 표시하지 않음) 문제를 해결해야 합니다.

프로세스

  • 다음 명령을 실행하여 pmlogger 서비스가 실행 중인지 확인합니다.

    $ systemctl status pmlogger
  • 다음 명령을 실행하여 파일이 생성되었는지 또는 디스크에 대한 수정되었는지 확인합니다.

    $ ls /var/log/pcp/pmlogger/$(hostname)/ -rlt
    total 4024
    -rw-r--r--. 1 pcp pcp   45996 Oct 13  2019 20191013.20.07.meta.xz
    -rw-r--r--. 1 pcp pcp     412 Oct 13  2019 20191013.20.07.index
    -rw-r--r--. 1 pcp pcp   32188 Oct 13  2019 20191013.20.07.0.xz
    -rw-r--r--. 1 pcp pcp   44756 Oct 13  2019 20191013.20.30-00.meta.xz
    [..]
  • 다음 명령을 실행하여 pmproxy 서비스가 실행 중인지 확인합니다.

    $ systemctl status pmproxy
  • /var/log/pcp/ pmproxy /pmproxy.log 파일을 보고 pmproxy가 실행 중이고, valkey에 대한 연결이 설정되었는지 확인합니다. 다음 텍스트가 포함되어 있는지 확인합니다.

    pmproxy(1716) Info: valkey slots, command keys, schema version setup
    Here, 1716 is the PID of pmproxy, which will be different for every invocation of pmproxy.
    Verify if the valkey database contains any keys by executing the following command:
    $ valkey-cli dbsize
    (integer) 34837
  • 다음 명령을 실행하여 PCP 지표가 valkey 데이터베이스에 있고 pmproxy가 액세스할 수 있는지 확인합니다.

    $ pmseries disk.dev.read
    2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    $ pmseries "disk.dev.read[count:10]"
    2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
        [Mon Jul 26 12:21:10.085468000 2021] 117971 70e83e88d4e1857a3a31605c6d1333755f2dd17c
        [Mon Jul 26 12:21:00.087401000 2021] 117758 70e83e88d4e1857a3a31605c6d1333755f2dd17c
        [Mon Jul 26 12:20:50.085738000 2021] 116688 70e83e88d4e1857a3a31605c6d1333755f2dd17c
    [...]
    $ valkey-cli --scan --pattern "*$(pmseries 'disk.dev.read')"
    pcp:metric.name:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:values:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:desc:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:labelvalue:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:instances:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:labelflags:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
  • 다음 명령을 실행하여 Grafana 로그에 오류가 있는지 확인합니다.

    $ journalctl -e -u grafana-server
    -- Logs begin at Mon 2021-07-26 11:55:10 IST, end at Mon 2021-07-26 12:30:15 IST. --
    Jul 26 11:55:17 localhost.localdomain systemd[1]: Starting Grafana instance...
    Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Starting Grafana" logger=server version=7.3.6 c>
    Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Config loaded from" logger=settings file=/usr/s>
    Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Config loaded from" logger=settings file=/etc/g>
    [...]

9장. PowerTOP로 전력 소비 관리

컴퓨터 시스템의 전체 전력 소비를 줄이면 비용을 절감할 수 있습니다. 에너지 소비를 최적화하려면 시스템 작업을 연구하고 해당 특정 작업의 성능 요구 사항에 맞게 각 구성 요소를 구성합니다.

특정 구성 요소 또는 시스템의 전력 소비를 전반적으로 낮추면 열과 성능이 저하됩니다. 다음의 적절한 전원 관리 결과:

  • 서버 및 컴퓨팅 센터의 열 감소.
  • 고정, 공간, 케이블, 생성기 및 무중단 전원 공급 장치(UPS)를 포함한 보조 비용 감소.
  • 랩탑의 배터리 수명이 연장됩니다.
  • 더 낮은 일산화탄소 출력입니다.
  • 녹색 IT와 관련된 정부 규정 또는 법적 요구 사항 충족(예: energy Star).
  • 새로운 시스템에 대한 회사 지침 준수.

9.1. 전원 관리 기본 사항

효과적인 전원 관리는 다음 원칙에 따라 구축됩니다.

유휴 CPU는 필요한 경우에만 작동해야 합니다.
Red Hat Enterprise Linux 6 이후 커널은 틱리스를 실행합니다. 주기적인 타이머 인터럽트를 온 디맨드 인터럽트로 교체했습니다. 따라서 유휴 CPU는 처리를 위해 새 작업이 대기열에 지정될 때까지 유휴 상태를 유지할 수 있습니다. 더 낮은 전원 상태를 입력한 CPU는 이러한 상태를 더 오래 유지할 수 있습니다.

그러나 불필요한 타이머 이벤트를 생성하는 애플리케이션이 있는 경우 이 기능의 이점을 오프셋할 수 있습니다. 볼륨 변경 또는 마우스 이동 확인과 같은 폴링 이벤트는 이러한 이벤트의 예입니다.

사용되지 않는 하드웨어 및 장치는 완전히 비활성화되어야 합니다.
이는 부분을 이동하는 장치(예: 하드 디스크)의 경우 적용됩니다. 또한 일부 애플리케이션은 사용되지 않지만 활성화된 장치 "열기"를 남겨 둘 수 있습니다. 이 경우 커널은 장치가 사용 중인 것으로 가정합니다. 이렇게 하면 장치가 절전 상태가 되는 것을 방지할 수 있습니다.
낮은 활동이 낮은 와트로 변환되어야 합니다.
전원 효율성은 특히 x86 이외의 아키텍처에서 최신 하드웨어 및 적절한 BIOS 또는 UEFI 구성에 따라 다릅니다. 최신 펌웨어를 설치합니다. BIOS 또는 시스템 설정에서 전원 관리 기능을 활성화하여 전원 효율성을 향상시킬 수 있습니다.

찾을 몇 가지 기능은 다음과 같습니다.

  • ARM64에 대한 CPPC(Commerative Processor Performance Controls) 지원
  • IBM Power Systems에 대한 PowerNV 지원
  • Tyy't'Quiet
  • ACPI (C-state)
  • Smart

Red Hat Enterprise Linux는 BIOS에서 지원 및 활성화된 경우 이러한 기능을 자동으로 사용합니다.

다양한 형태의 CPU 상태 및 해당 효과

최신 CPU와 ACSPI(Advanced Configuration and Power Interface)는 서로 다른 전원 상태를 제공합니다. 세 가지 다른 상태는 다음과 같습니다.

  • 수면 (C-states)
  • 빈도 및 변동 (P-상태)
  • heat 출력(T-상태 또는 열 상태)

    가장 낮은 수면 상태에서 실행되는 CPU는 가장 적은 양의 전력을 소비하지만, 필요한 경우 해당 상태에서 작동시키는 데 훨씬 더 많은 시간이 걸립니다. 매우 드문 경우지만, CPU가 잠자기 상태로 전환될 때마다 즉시 작동해야 할 수 있습니다. 이 영구적으로 사용 중인 CPU는 더 효율적인 유휴 상태로 인해 전력 절감을 손실할 수 있습니다.

꺼진 머신은 가장 적은 양의 전원을 사용합니다.
전원을 절감하는 가장 좋은 방법 중 하나는 시스템을 끄는 것입니다. 예를 들어, 기업은 중단되거나 가정할 때 시스템을 끄는 지침 하에서 "녹색 IT"에 중점을 둔 기업 문화를 개발할 수 있습니다. 가상화 기술을 사용하여 여러 물리적 서버를 하나의 큰 서버에 통합하고 가상화를 가상화합니다. 가상화 기술은 Red Hat Enterprise Linux와 함께 제공됩니다.

9.2. 감사 및 분석 개요

단일 시스템의 자세한 수동 감사, 분석 및 튜닝은 드문 경우입니다. 이렇게 하는 데 소요되는 시간과 비용은 일반적으로 이러한 마지막 시스템 튜닝에서 얻을 수 있는 이점을 뛰어납니다.

튜닝은 동일한 설정을 재사용할 수 있는 동일한 시스템의 대규모 그룹에 유용합니다. 예를 들어, 수천 개의 데스크탑 시스템을 배포하거나 시스템이 거의 동일한 HPC 클러스터를 고려하십시오.

감사 및 분석의 또 다른 이유는 비교의 기반이 되는 것입니다. 결과를 사용하여 시스템 동작의 회귀 또는 변경 사항을 식별하고 하드웨어, BIOS 또는 소프트웨어 업데이트가 정기적으로 발생할 때 전력 소비 문제를 방지합니다. 일반적으로 철저하게 감사 및 분석은 특정 시스템에서 실제로 어떤 일이 발생하는지 더 잘 파악할 수 있습니다.

전력 소비와 관련하여 시스템을 감사하고 분석하는 것은 최신 시스템을 사용할 수 있더라도 비교적 어렵습니다. 대부분의 시스템은 소프트웨어를 사용하여 전력 사용을 측정하는 데 필요한 수단을 제공하지 않습니다. 그러나 예외는 다음과 같습니다.

  • Hewlett Packard 서버 시스템의 ILO 관리 콘솔에는 웹을 통해 액세스할 수 있는 전원 관리 모듈이 있습니다.
  • IBM은 BladeCenter 전원 관리 모듈에서 유사한 솔루션을 제공합니다.
  • 일부 Dell 시스템에서 IT Assistant는 전원 모니터링 기능을 제공합니다.

다른 벤더는 서버 플랫폼에 유사한 기능을 제공할 가능성이 높습니다. 그러나 모든 공급업체에서 지원하는 단일 솔루션은 없습니다.

9.3. 감사 툴

Red Hat Enterprise Linux는 시스템 감사 및 분석을 위한 툴을 제공합니다. 이러한 툴을 사용하여 기존 결과를 확인하거나 특정 시스템 구성 요소에 대한 심층적인 정보를 얻을 수 있습니다.

다음과 같은 많은 도구가 성능 튜닝에 사용됩니다.

PowerTOP
PowerTOP는 CPU를 자주 발생시키는 커널 및 사용자 공간 애플리케이션의 특정 구성 요소를 식별합니다. Intel CPU의 Intel Hardware P-State (HWP)는 CPU 빈도 및 등급을 조정하여 전력 효율성과 성능을 조정합니다. powertop 명령을 root로 사용하여 PowerTOP 툴 및 powertop --calibrate 를 시작하여 전원 추정 엔진을 교정할 수 있습니다.
diskdevstatnetdevstat

이러한 SystemTap 툴은 시스템에서 실행되는 모든 애플리케이션의 디스크 및 네트워크 활동에 대한 자세한 정보를 수집합니다. 이러한 통계를 사용하여 몇 개의 I/O 작업이 아닌 많은 소규모 애플리케이션을 수행하는 애플리케이션을 감지합니다. dnf install tuned-utils-systemtap kernel-debuginfo 명령을 사용하여 diskdevstatnetdevstat 툴을 설치합니다. 디스크 및 네트워크 활동에 대한 자세한 정보를 보려면 다음을 사용합니다.

# diskdevstat
PID   UID   DEV   WRITE_CNT   WRITE_MIN   WRITE_MAX   WRITE_AVG   READ_CNT   READ_MIN   READ_MAX   READ_AVG   COMMAND

3575  1000  dm-2   59          0.000      0.365        0.006        5         0.000        0.000      0.000      mozStorage #5
3575  1000  dm-2    7          0.000      0.000        0.000        0         0.000        0.000      0.000      localStorage DB
[...]
# netdevstat
PID   UID   DEV       XMIT_CNT   XMIT_MIN   XMIT_MAX   XMIT_AVG   RECV_CNT   RECV_MIN   RECV_MAX   RECV_AVG   COMMAND
3572  991  enp0s31f6    40       0.000      0.882       0.108        0         0.000       0.000       0.000     openvpn
3575  1000 enp0s31f6    27       0.000      1.363       0.160        0         0.000       0.000       0.000     Socket Thread
[...]

이러한 명령을 사용하면 update_interval,total_durationdisplay_histogram 매개변수를 지정할 수 있습니다.

TuneD
프로필 기반 시스템 튜닝 툴입니다. udev 장치 관리자를 사용하여 연결된 장치를 모니터링하고 시스템 설정을 정적 및 동적 튜닝할 수 있습니다. tuned-adm recommend 명령을 사용하여 Red Hat이 특정 제품에 가장 적합한 프로필을 결정합니다.
가상 메모리 통계(vmstat)

procps-ng 패키지에서 제공하는 툴입니다. 프로세스, 메모리, 페이징, 블록 I/O, 트랩 및 CPU 활동에 대한 자세한 정보를 제공합니다. vmstat 명령을 사용하여 다음 정보를 확인합니다.

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b  swpd  free    buff   cache   si   so  bi   bo   in  cs  us  sy id  wa  st
1  0   0   5805576 380856 4852848   0    0  119  73  814  640  2   2 96   0   0

vmstat -a 명령을 사용하여 활성 및 비활성 메모리를 확인합니다.

iostat

Cryo stat 패키지에서 제공하는 이 툴은 vmstat 와 유사하지만 블록 장치에서 I/O 모니터링을 위해서만 제공됩니다. 더 자세한 출력 및 통계를 제공합니다. 다음 명령을 사용하여 시스템 I/O를 모니터링할 수 있습니다.

$ iostat
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.05    0.46    1.55    0.26    0.00   95.67

Device     tps     kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
nvme0n1    53.54     899.48     616.99      3445229     2363196
dm-0       42.84     753.72     238.71      2886921      914296
dm-1        0.03       0.60       0.00         2292           0
dm-2       24.15     143.12     379.80       548193     1454712
blktrace

I/O 하위 시스템에서 시간을 보내는 방법에 대한 자세한 정보를 제공합니다. 이 정보를 사람이 읽을 수 있는 형식으로 보려면 다음 명령을 사용합니다.

# blktrace -d /dev/dm-0 -o - | blkparse -i -
253,0   1    1   0.000000000  17694  Q   W 76423384 + 8 [kworker/u16:1]
253,0   2    1   0.001926913     0   C   W 76423384 + 8 [0]
[...]
  • 첫 번째 열인 253,0 은 장치 메이저 및 마이너 튜플입니다.
  • 두 번째 열에는 이벤트의 시퀀스 번호가 표시됩니다.
  • 세 번째 열에는 이벤트 발생을 위한 CPU ID가 표시됩니다.
  • 타임스탬프의 네 번째 열입니다.
  • I/O 발행 프로세스의 PID의 다섯 번째 열입니다.
  • 여섯 번째 열에는 이벤트 유형이 표시됩니다. Q: 대기 중인 프로세스의 경우, 완료된 프로세스의 경우 C입니다.
  • 7번째 열인 쓰기 작업의 W 입니다.
  • 8번째 열인 76423384 는 블록 번호입니다.
  • ninth 열 + 8 은 I/O 작업에서 바이트 수로 요청된 블록 수입니다.
  • 마지막 필드인 [kworker/u16:1] 은 프로세스 이름입니다. 기본적으로 blktrace 명령은 프로세스가 명시적으로 종료될 때까지 영구적으로 실행됩니다. 런타임 기간을 지정하려면 -w 옵션을 사용합니다.
turbostat

kernel-tools 패키지에서 제공합니다. x86-64 프로세서의 프로세서 토폴로지, 빈도, 유휴 전원 상태 통계, 온도 및 전원 사용량에 대해 보고합니다. 요약을 보려면 다음 명령을 사용합니다.

# turbostat
CPUID(0): GenuineIntel 0x16 CPUID levels; 0x80000008 xlevels; family:model:stepping 0x6:8e:a (6:142:10)
CPUID(1): SSE3 MONITOR SMX EIST TM2 TSC MSR ACPI-TM HT TM
CPUID(6): APERF, TURBO, DTS, PTM, HWP, HWPnotify, HWPwindow, HWPepp, No-HWPpkg, EPB
[...]

기본적으로 turbostat 는 전체 화면에 대한 카운터 결과에 대한 요약을 출력하고 5초마다 카운터 결과를 출력합니다. i 옵션을 사용하여 카운터 결과 간에 다른 기간을 지정합니다. 예를 들어 turbostat -i 10 을 사용하여 10 초마다 결과를 출력합니다. Turbostat 은 전원 사용량 또는 유휴 시간 측면에서 비효율적인 서버를 식별하는 데도 유용합니다. 또한 시스템에서 발생하는SMI(시스템 관리 인터럽트)의 속도를 식별하는 데 도움이 됩니다. turbostat 를 사용하여 전원 관리 튜닝의 영향을 확인합니다.

cpupower

cpupower 패키지에는 프로세서의 전원 저장 기능을 검사하고 조정하는 툴 컬렉션이 포함되어 있습니다. frequency-info,frequency-set,idle-info,idle-set,set,info, monitor 옵션과 함께 cpupower 명령을 사용하여 프로세서 관련 값을 표시하고 설정합니다.

예를 들어 사용 가능한 cpufreq governor를 보려면 다음을 사용합니다.

$ cpupower frequency-info --governors
analyzing CPU 0:
  available cpufreq governors: performance powersave
GNOME Power Manager
GNOME 데스크탑 환경의 일부로 설치된 데몬입니다. GNOME Power Manager는 시스템의 전원 상태에 대한 변경 사항을 알려줍니다(예: 배터리에서 AC 전원으로 변경). 또한 배터리 상태를 보고하고 배터리 전원이 낮은 경우 경고합니다.
pmda-denki
PMDA-denki 는 전력 소비를 모니터링합니다. 이는 Performance Co- Cryostat 제품군의 일부이며 시간이 지남에 따라 소비를 모니터링하고 시각화하는 데 도움이 됩니다.

9.4. PowerTOP의 목적

PowerTOP는 전력 소비와 관련된 문제를 진단하고 배터리 수명을 연장하는 방법에 대한 제안을 제공하는 프로그램입니다. PowerTOP는 개별 프로세스, 장치 및 커널 처리기에 대한 총 시스템 전력 사용량 및 소비를 추정합니다.

이 툴은 CPU를 자주 발생시키는 커널 및 사용자 공간 애플리케이션의 특정 구성 요소를 식별할 수도 있습니다. Red Hat Enterprise Linux는 PowerTOP 버전 2.x를 사용합니다.

9.5. PowerTOP 설치

PowerTop을 설치하고 이를 사용하여 전력 소비와 관련된 문제를 진단할 수 있습니다.

프로세스

  • 명령줄을 열고 다음을 입력합니다.

    # dnf install powertop

9.6. PowerTOP 시작

시스템에 설치한 후 PowerTop을 사용하여 시스템 성능을 최적화할 수 있습니다.

사전 요구 사항

  • 노트북을 배터리 전원으로 사용하고 있습니다.

프로세스

  • PowerTOP를 실행하려면 다음을 입력합니다.

    # powertop

9.7. PowerTOP 조정

PowerTOP 적합성 프로세스를 사용하여 랩탑에서 전력 소비 측정의 정확성을 향상시킬 수 있습니다.

프로세스

  • 랩탑에서는 다음 명령을 실행하여 전원 추정 엔진을 교정할 수 있습니다.

    # powertop --calibrate

    프로세스 중 머신과 상호 작용하지 않고 조각화가 완료되도록 합니다. 측정은 프로세스가 다양한 테스트를 수행하고, 밝기 수준 및 스위치 장치를 켜거나 끄는 단계를 통해 주기 때문에 시간이 걸립니다. 조각화 프로세스가 완료되면 PowerTOP가 정상적으로 시작됩니다. 데이터를 수집하기 위해 약 1시간 동안 실행되도록 합니다.

    충분한 데이터가 수집되면 출력 테이블의 첫 번째 열에 전력 추정 수치가 표시됩니다.

9.8. 측정 간격 설정

기본적으로 PowerTOP는 20초 간격으로 측정을 수행합니다. 그러나 요구 사항에 따라 이 측정 빈도를 변경할 수 있습니다.

프로세스

  • 측정 빈도를 변경하려면 --time 옵션을 사용하여 powertop 명령을 실행합니다.

    # powertop --time=<time_in_seconds>

9.9. CPU 빈도 드라이버 및 모드 제어

Intel P-State 드라이버를 사용하는 동안 PowerTOP는 드라이버가 Passive 모드인 경우에만 Frequency Stats 탭에 값을 표시합니다. 그러나 이 경우에도 값은 불완전할 수 있습니다. 전체적으로 Intel P-State 드라이버의 세 가지 모드가 있습니다.

  • HWP(Hardware P-States)를 사용한 활성 모드
  • HWP가 없는 활성 모드
  • Passive 모드

ACPI CPUfreq 드라이버로 전환하면 PowerTOP에서 전체 정보가 표시됩니다. 그러나 기본 설정에서 시스템을 유지하는 것이 좋습니다.

프로세스

  1. 로드된 드라이버와 어떤 모드에서 로드되는 드라이버 보기:

    # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
    • Intel P-State 드라이버가 로드되고 활성 모드에서 intel_pstate 가 반환됩니다.
    • Intel P-State 드라이버가 로드되고 Passive 모드에서 intel_cpufreq 가 반환됩니다.
    • ACPI CPU freq 드라이버가 로드되면 ACPI-cpu freq가 반환됩니다.
  2. Intel P-State 드라이버를 사용하는 동안:

    1. 커널 부팅 명령줄에 다음 인수를 추가하여 드라이버를 Passive 모드에서 강제로 실행합니다.

      intel_pstate=passive
    2. Intel P-State 드라이버를 비활성화하고 ACPI CPUfreq 드라이버를 사용하려면 커널 부팅 명령줄에 다음 인수를 추가합니다.

      intel_pstate=disable

9.10. HTML 출력 생성

명령행의 powertop 출력과 별도로 HTML 보고서를 생성할 수도 있습니다.

프로세스

  • --html 옵션을 사용하여 powertop 명령을 실행합니다.

    # powertop --html=<htmlfile.html>

    &lt ;htmlfile.html& gt; 매개변수를 출력 파일에 필요한 이름으로 바꿉니다.

9.11. 전력 소비 최적화

powertop 서비스 또는 powertop2tuned 유틸리티를 사용하여 전력 소비를 최적화할 수 있습니다.

9.11.1. powertop 서비스를 사용하여 전력 소비 최적화

powertop 서비스를 사용하여 부팅 시 Tunables 탭에서 모든 PowerTOP의 제안을 자동으로 활성화할 수 있습니다.

프로세스

  • powertop 서비스를 활성화합니다.

    # systemctl enable powertop

9.11.2. powertop2tuned 유틸리티

powertop2tuned 유틸리티를 사용하여 PowerTOP 제안에서 사용자 지정 TuneD 프로필을 생성합니다. 기본적으로 powertop2tuned/etc/tuned/ 디렉터리에 프로필을 생성하고 현재 선택한 TuneD 프로필의 사용자 지정 프로필을 기반으로 합니다. 보안상의 이유로 모든 PowerTOP 튜닝은 처음에 새 프로필에서 비활성화됩니다. /etc/tuned/profiles/profile_name/tuned.conf 파일에서 해당 튜닝의 주석을 제거하여 튜닝을 활성화할 수 있습니다.

--enable 또는 -e 옵션을 사용하여 PowerTOP에서 제안하는 대부분의 튜닝을 활성화하는 새 프로필을 생성합니다. USB 자동 중지 와 같은 문제가 발생할 수 있는 특정 튜닝은 기본적으로 비활성화되어 있으며 수동으로 주석을 제거해야 합니다.

9.11.3. powertop2tuned 유틸리티를 사용하여 전력 소비 최적화

powertop2tuned 유틸리티를 사용하여 시스템의 전력 소비를 최적화하는 데 도움이 되는 사용자 정의 TuneD 프로필을 생성할 수 있습니다.

사전 요구 사항

  • powertop2tuned 유틸리티는 시스템에 설치됩니다.

    # dnf install tuned-utils

프로세스

  1. 사용자 지정 프로필을 생성합니다.

    # powertop2tuned <new_profile_name>
  2. 새 프로필을 활성화합니다.

    # tuned-adm profile <new_profile_name>

9.11.4. powertop2tuned 및 powertop.service 사용량 비교

다음과 같은 이유로 powertop2tuned over powertop.service 를 사용하여 전원 소비를 최적화할 수 있습니다.

  • powertop2tuned 유틸리티는 PowerTOP를 TuneD에 통합하므로 두 툴을 모두 활용할 수 있습니다.
  • powertop2tuned 유틸리티는 활성화된 튜닝을 세밀하게 제어할 수 있습니다.
  • powertop2tuned 를 사용하면 잠재적으로 위험한 튜닝이 자동으로 활성화되지 않습니다.
  • powertop2tuned 를 사용하면 재부팅하지 않고 롤백이 가능합니다.

10장. perf 시작하기

시스템 관리자는 perf 툴을 사용하여 시스템의 성능 데이터를 수집하고 분석할 수 있습니다. perf 사용자 공간 툴은 Linux(PCL)용 커널 기반 하위 시스템 성능 Cryostat를 사용하여 인터페이스합니다.

perf 는 PMU(Perf)를 사용하여 다양한 하드웨어 및 소프트웨어 이벤트를 측정, 기록 및 모니터링합니다. perf 는 또한 tracepoints,kprobesuprobes 를 지원합니다.

10.1. perf 설치

perf 사용자 공간 툴을 설치하여 perf 툴을 사용해야 합니다.

프로세스

  • perf 툴을 설치합니다.

    # dnf install perf

10.2. 일반적인 perf 명령

다음과 같이 일반적으로 사용되는 perf 명령을 사용하여 성능 데이터를 수집하고 분석할 수 있습니다.

perf stat
명령 실행 및 사용된 클럭 사이클을 포함하여 일반적인 성능 이벤트에 대한 전체 통계를 제공합니다. 옵션을 사용하면 기본 측정 이벤트 이외의 이벤트를 선택할 수 있습니다.
perf 레코드
perf report 명령을 사용하여 나중에 분석할 수 있는 perf.data 파일에 성능 데이터를 기록합니다.
perf 보고서
perf record 명령으로 생성된 perf.data 파일에서 성능 데이터를 읽고 표시합니다.
perf 목록
특정 머신에서 사용 가능한 이벤트를 나열합니다. 이러한 이벤트는 시스템의 성능 모니터링 하드웨어 및 소프트웨어 구성에 따라 달라집니다.
perf top
top 유틸리티와 유사한 기능을 수행합니다. 성능 카운터 프로필을 실시간으로 생성하고 표시합니다.
perf 추적
strace 툴과 유사한 기능을 수행합니다. 지정된 스레드 또는 프로세스에서 사용하는 시스템 호출과 해당 애플리케이션에서 수신한 모든 신호를 모니터링합니다.
perf 도움말
perf 명령의 전체 목록을 표시합니다.

11장. perf top을 사용하여 실시간으로 CPU 사용량 프로파일링

perf top 명령을 사용하여 다양한 기능의 CPU 사용량을 실시간으로 측정할 수 있습니다.

11.1. perf top의 목적

perf top 명령은 실시간 시스템 프로파일링 및 상위 유틸리티와 유사하게 기능을 수행합니다. top 은 프로세스 CPU 사용량을 모니터링하는 동안 perf top 은 특정 기능에 의한 CPU 시간을 표시합니다. 기본 상태에서 perf top 은 사용자 공간 및 커널 공간 모두에 있는 모든 CPU에서 사용되는 기능에 대해 알려줍니다. perf top 을 사용하려면 root 액세스 권한이 필요합니다.

11.2. perf top로 CPU 사용량 프로파일링

perf top 을 사용하여 실시간 CPU 사용량을 모니터링하고 가장 많은 처리 시간이 걸리는 함수를 확인할 수 있습니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • root 액세스 권한이 있습니다.

프로세스

  • perf top 모니터링 인터페이스를 시작합니다.

    # perf top
    The monitoring interface looks similar to the following:
    Samples: 8K of event 'cycles', 2000 Hz, Event count (approx.): 4579432780 lost: 0/0 drop: 0/0
    Overhead  Shared Object       Symbol
       2.20%  [kernel]            [k] do_syscall_64
       2.17%  [kernel]            [k] module_get_kallsym
       1.49%  [kernel]            [k] copy_user_enhanced_fast_string
       1.37%  libpthread-2.29.so  [.] pthread_mutex_lock 1.31% [unknown] [.] 0000000000000000 1.07% [kernel] [k] psi_task_change 1.04% [kernel] [k] switch_mm_irqs_off 0.94% [kernel] [k] fget
       0.74%  [kernel]            [k] entry_SYSCALL_64
       0.69%  [kernel]            [k] syscall_return_via_sysret
       0.69%  libxul.so           [.] 0x000000000113f9b0
       0.67%  [kernel]            [k] kallsyms_expand_symbol.constprop.0
       0.65%  firefox             [.] moz_xmalloc
       0.65%  libpthread-2.29.so  [.] __pthread_mutex_unlock_usercnt
       0.60%  firefox             [.] free
       0.60%  libxul.so           [.] 0x000000000241d1cd
       0.60%  [kernel]            [k] do_sys_poll
       0.58%  [kernel]            [k] menu_select
       0.56%  [kernel]            [k] _raw_spin_lock_irqsave
       0.55%  perf                [.] 0x00000000002ae0f3

    이 예제에서 커널 함수 do_syscall_64 는 가장 많은 CPU 시간을 사용하고 있습니다.

11.3. perf 출력 및 기호 확인

perf top 모니터링 인터페이스는 CPU 사용량 및 기능 활동에 대한 실시간 보기를 제공합니다. 출력을 이해하면 성능 병목 현상을 식별하고 시스템 동작을 최적화하는 데 도움이 됩니다.

perf top output의 키 열
인터페이스에는 다음과 같은 여러 열이 표시됩니다.
오버헤드
지정된 함수에서 사용하는 CPU 시간의 백분율을 표시합니다. 이렇게 하면 리소스를 가장 많이 사용하는 작업을 정확하게 파악하는 데 도움이 됩니다.
공유 오브젝트
함수가 있는 프로그램 또는 라이브러리의 이름을 나타냅니다.
기호

함수 또는 기호의 이름을 표시합니다.

  • 커널 공간에서 실행되는 기능은 [k]로 표시됩니다.
  • 사용자 공간에서 실행되는 기능은 [.]로 표시됩니다.
perf 출력에서 해결되지 않은 기호의 원인

커널 함수의 경우 perf/proc/kallsyms 파일의 정보를 사용하여 샘플을 해당 함수 이름 또는 기호에 매핑합니다. 그러나 사용자 공간에서 실행되는 함수의 경우 바이너리가 제거되므로 원시 함수 주소가 표시될 수 있습니다.

이 정보는 해당 debuginfo 패키지를 설치하거나 gcc 에서 -g 옵션을 사용하는 등 디버깅이 활성화된 애플리케이션을 컴파일하여 포함할 수 있습니다. 필요한 디버그 정보를 사용할 수 있게 되면 perf 는 보고 중에 샘플 주소를 사람이 읽을 수 있는 함수 이름에 정확하게 매핑할 수 있습니다.

참고

디버그 정보를 사용할 수 있게 되면 perf record 명령을 다시 실행할 필요가 없습니다. perf report 명령을 다시 실행하면 해결된 기호가 반영됩니다.

11.4. 디버그 및 소스 리포지토리 활성화

시스템 구성 요소의 필수 디버깅 데이터에 액세스하려면 디버그 및 소스 리포지토리를 활성화합니다. RHEL은 공간을 절약하기 위해 기본적으로 이를 비활성화합니다. 성능 측정 및 깊은 시스템 문제 해결에 필요한 debuginfo 패키지를 설치할 수 있습니다.

프로세스

  • 소스 및 디버그 정보 패키지 채널을 활성화합니다.

    # subscription-manager repos --enable rhel-10-for-$(uname -m)-baseos-debug-rpms
    # subscription-manager repos --enable rhel-10-for-$(uname -m)-baseos-source-rpms
    # subscription-manager repos --enable rhel-10-for-$(uname -m)-appstream-debug-rpms
    # subscription-manager repos --enable rhel-10-for-$(uname -m)-appstream-source-rpms

    $(uname -m) 부분은 시스템 아키텍처에 일치하는 값으로 자동 교체됩니다.

    Expand
    표 11.1. 아키텍처 이름 매핑
    아키텍처 이름현재의

    64비트 Intel 및 AMD

    x86_64

    64비트 ARM

    aarch64

    IBM POWER

    ppc64le

    64-bit IBM Z

    s390x

문제를 디버그하고 설치된 패키지에 필요한 디버깅 정보가 없으면 GNU Debugger에서 누락된 정보를 감지합니다. 그런 다음 해당 디버그 패키지를 설치하는 명령을 제안합니다.

사전 요구 사항

  • 디버그하려는 애플리케이션 또는 라이브러리가 시스템에 설치되어 있어야 합니다.
  • GDB 및 debuginfo-install 도구가 시스템에 설치되어 있어야 합니다. 자세한 내용은 애플리케이션 디버그 설정을 참조하십시오.
  • debuginfodebugsource 패키지를 제공하는 리포지토리는 시스템에서 구성하고 활성화해야 합니다. 자세한 내용은 디버그 및 소스 리포지토리 활성화를 참조하십시오.

프로세스

  1. 디버그하려는 애플리케이션 또는 라이브러리에 연결된 GDB를 시작합니다. GDB는 누락된 디버깅 정보를 자동으로 인식하고 실행할 명령을 제안합니다.

    $ gdb -q /bin/ls
    Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done.
    (no debugging symbols found)...done.
    Missing separate debuginfos, use: dnf debuginfo-install coreutils-9.5-6.el10.x86_64
    (gdb)
  2. GDB를 종료하려면 q 를 입력하고 Enter 를 사용하여 확인합니다.

    (gdb) q
  3. GDB에서 제안한 명령을 실행하여 필요한 debuginfo 패키지를 설치합니다.

    # dnf debuginfo-install coreutils-9.5-6.el10.x86_64

    dnf 패키지 관리 도구는 변경 사항에 대한 요약을 제공하고 확인을 요청하면 필요한 모든 파일을 확인, 다운로드 및 설치합니다. GDB가 debuginfo 패키지를 제안할 수 없는 경우 애플리케이션 또는 라이브러리의 debuginfo 패키지 가져오기에 설명된 절차를 따르십시오.

12장. perf stat로 프로세스 실행 중 이벤트 수

perf stat 명령을 사용하여 프로세스 실행 중에 하드웨어 및 소프트웨어 이벤트를 계산할 수 있습니다.

12.1. perf stat의 목적

perf stat 명령은 하드웨어 및 소프트웨어 성능 이벤트에 대한 개수를 생성합니다. 이벤트를 지정하지 않으면 perf 통계는 공통 하드웨어 및 소프트웨어 이벤트 세트를 계산합니다.

12.2. perf 통계를 사용하여 이벤트 계산

perf stat 을 사용하여 명령이 실행되는 동안 하드웨어 및 소프트웨어 이벤트 발생을 계산하고 이러한 개수의 통계를 생성할 수 있습니다. 기본적으로 perf stat 은 스레드당 모드에서 작동합니다.

사전 요구 사항

  • perf 사용자 공간 도구는 설치 perf 에 설명된 대로 설치됩니다.
  • 사용자 공간 및 커널 공간 이벤트를 모두 계산할 수 있는 루트 액세스 권한이 있습니다.

프로세스

  • 이벤트를 계산합니다.

    • root 액세스 권한 없이 perf stat 명령을 실행하면 사용자 공간에서 발생하는 이벤트만 계산됩니다.

      $ perf stat ls
      Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
      
       Performance counter stats for 'ls':
      
                    1.28 msec task-clock:u               #    0.165 CPUs utilized
                       0      context-switches:u         #    0.000 M/sec
                       0      cpu-migrations:u           #    0.000 K/sec
                     104      page-faults:u              #    0.081 M/sec
               1,054,302      cycles:u                   #    0.823 GHz
               1,136,989      instructions:u             #    1.08  insn per cycle
                 228,531      branches:u                 #  178.447 M/sec
                  11,331      branch-misses:u            #    4.96% of all branches
      
          0.007754312 seconds time elapsed
          0.000000000 seconds user
      	0.007717000 seconds sys

      이전 예에서 perf stat 은 루트 액세스 없이 실행되며 이벤트 이름 뒤에 :u followed by :u, 이러한 이벤트가 사용자 공간에서만 계산되었음을 나타냅니다.

    • 사용자 공간 및 커널 공간 이벤트를 모두 계산하려면 다음을 입력합니다.

      # perf stat ls
      Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
       Performance counter stats for 'ls':
      
                    3.09 msec task-clock                #    0.119 CPUs utilized
                      18      context-switches          #    0.006 M/sec
                       3      cpu-migrations            #    0.969 K/sec
                     108      page-faults               #    0.035 M/sec
               6,576,004      cycles                    #    2.125 GHz
               5,694,223      instructions              #    0.87  insn per cycle
               1,092,372      branches                  #  352.960 M/sec
                  31,515      branch-misses             #    2.89% of all branches
      
      0.026020043 seconds time elapsed
      0.000000000 seconds user
      0.014061000 seconds sys
  • 기본적으로 perf stat 은 스레드당 모드에서 작동합니다. CPU 전체 이벤트 수로 변경하려면 perf stat-a 옵션을 전달합니다. CPU 전체 이벤트를 계산하려면 root 액세스가 필요합니다.

    # perf stat -a ls

12.3. perf stat 출력 해석

perf stat 은 지정된 명령을 실행하고 명령 실행 중에 이벤트 발생을 계산합니다. 이러한 개수의 통계를 세 열에 표시합니다.

  • 지정된 이벤트에 대해 계산된 발생 수입니다.
  • 계산된 이벤트의 이름입니다.
  • 관련 메트릭을 사용할 수 있는 경우 오른쪽 열에 해시 기호(#) 뒤에 비율 또는 백분율이 표시됩니다. 예를 들어 기본 모드에서 perf 통계는 가장 오른쪽 열에서 주기별 명령을 계산하고 표시하는 명령을 계산합니다. 전체 분기의 백분율로 분기 누락은 기본 수에서 유사한 동작을 표시합니다.

12.4. 실행 중인 프로세스에 perf 통계 연결

실행 중인 프로세스에 perf 통계 를 연결할 수 있습니다. 이는 perf stat 에 명령을 실행하는 동안 지정된 프로세스에서만 이벤트 발생을 계산하도록 지시합니다.

사전 요구 사항

  • perf 사용자 공간 도구는 설치 perf 에 설명된 대로 설치됩니다.

프로세스

  • 실행 중인 프로세스에 perf 통계를 연결합니다.

    $ perf stat -p ID1,ID2 sleep seconds

    이전 예제에서는 sleep 명령을 사용하여 지정된 시간( )에 ID가 ID1ID2 인 프로세스의 이벤트를 계산합니다.

13장. perf를 사용하여 성능 프로필 기록 및 분석

perf 툴을 사용하여 성능 데이터를 기록하고 나중에 분석합니다.

13.1. perf 레코드의 목적

perf record 명령은 성능 데이터를 샘플링하고 perf.data 파일에 저장합니다. 그런 다음 다른 perf 명령을 사용하여 데이터를 읽고 시각화할 수 있습니다. perf.data 는 현재 디렉터리에 생성됩니다. 나중에 다른 시스템에서 액세스할 수 있습니다.

perf 레코드 -a 를 실행하여 전체 시스템을 프로파일링할 수 있습니다. 이렇게 하면 Ctrl+C 누르거나 특정 명령 기간 동안 성능 데이터가 기록됩니다. perf 레코드 ./your_app을 실행하거나 perf 레코드 -p PID 를 사용하여 이미 실행 중인 애플리케이션에 연결하여 단일 애플리케이션/프로세스를 프로파일링할 수 있습니다.

13.2. 성능 프로필 기록

perf 레코드를 사용하여 성능 데이터를 샘플링하고 기록할 수 있습니다. 캡처된 데이터 수준은 액세스 수준에 따라 다릅니다.

  • root 액세스 권한 없음: perf 레코드 는 사용자 공간에서만 데이터를 수집합니다.
  • 루트 액세스 사용: perf 레코드 는 사용자 및 커널 공간 모두에서 데이터를 수집합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • 사용자 및 커널 공간에 대한 데이터를 수집하려는 경우 root 액세스 권한이 있습니다.

프로세스

  • 다음 중 하나를 수행합니다.

    • 사용자 공간의 성능 데이터를 샘플링하고 기록하려면 다음을 수행합니다.

      $ perf record command
    • 커널 공간의 성능 데이터를 샘플링하고 기록하려면(root 또는 sudo 액세스 사용):

      # perf record command

      명령을 프로파일링할 실제 명령으로 바꿉니다. 명령을 지정하지 않으면 perf는 Ctrl+C 를 눌러 수동으로 중지할 때까지 샘플 데이터를 기록합니다.

13.3. CPU별 모드에서 성능 프로필 기록

CPU당 per-f 레코드를 사용하여 모니터링된 CPU의 모든 스레드에서 성능 데이터를 샘플링하고 기록합니다. 사용자 공간과 커널 공간 모두에서 데이터를 동시에 캡처합니다. 기본적으로 CPU당 모드는 모든 온라인 CPU를 모니터링합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  • 성능 데이터를 샘플링하고 기록합니다.

    # perf record -a command

    명령을 샘플 데이터 중 샘플 명령으로 교체합니다. 명령을 지정하지 않으면 perf는 Ctrl+C 를 눌러 수동으로 중지할 때까지 샘플 데이터를 기록합니다.

13.4. perf 레코드를 사용하여 호출 그래프 데이터 캡처

성능 프로필의 다른 함수를 호출하는 함수를 기록하도록 perf 레코드 도구를 구성할 수 있습니다. 여러 프로세스가 동일한 기능을 호출하는 경우 병목 현상을 식별하는 데 도움이 됩니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  • --call-graph 옵션을 사용하여 성능 데이터를 샘플 및 기록합니다.

    $ perf record --call-graph method command
    • 명령을 샘플 데이터 중 샘플 명령으로 교체합니다. 명령을 지정하지 않으면 perf는 Ctrl+C 를 눌러 수동으로 중지할 때까지 샘플 데이터를 기록합니다.
    • 메서드를 다음 줄 바꿈 방법 중 하나로 바꿉니다.Replace method with one of the following unwinding methods:

      fp
      프레임 포인터 메서드를 사용합니다. GCC 옵션으로 구축된 바이너리와 같은 컴파일러 최적화에 따라 --fomit-frame-pointer 에서는 스택을 풀지 못할 수 있습니다.
      dwarf
      DWARF 호출 프레임 정보를 사용하여 스택을 축소합니다.
      lbr
      Intel 프로세서에서 마지막 분기 레코드 하드웨어를 사용합니다.

13.5. perf 보고서를 사용하여 perf.data 분석

perf 보고서를 사용하여 perf.data 파일의 데이터를 표시하고 분석할 수 있습니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • perf.data 파일은 현재 디렉터리에 저장됩니다.
  • perf.data 파일이 루트 액세스 권한을 사용하여 생성된 경우 루트 액세스 권한이 있습니다.

프로세스

  • 추가 분석을 위해 perf.data 파일의 내용을 표시합니다.

    # perf report
    Samples: 2K of event 'cycles', Event count (approx.): 235462960
    Overhead  Command          Shared Object                     Symbol
       2.36%  kswapd0          [kernel.kallsyms]                 [k] page_vma_mapped_walk
       2.13%  sssd_kcm         libc-2.28.so                      [.] memset_avx2_erms 2.13% perf [kernel.kallsyms] [k] smp_call_function_single 1.53% gnome-shell libc-2.28.so [.] strcmp_avx2
       1.17%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_hash_table_lookup
       0.93%  Xorg             libc-2.28.so                      [.] memmove_avx_unaligned_erms 0.89% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_object_unref 0.87% kswapd0 [kernel.kallsyms] [k] page_referenced_one 0.86% gnome-shell libc-2.28.so [.] memmove_avx_unaligned_erms
       0.83%  Xorg             [kernel.kallsyms]                 [k] alloc_vmap_area
       0.63%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_slice_alloc
       0.53%  gnome-shell      libgirepository-1.0.so.1.0.0      [.] g_base_info_unref
       0.53%  gnome-shell      ld-2.28.so                        [.] _dl_find_dso_for_object
       0.49%  kswapd0          [kernel.kallsyms]                 [k] vma_interval_tree_iter_next
    0.48%  gnome-shell      libpthread-2.28.so                [.] pthread_getspecific 0.47% gnome-shell libgirepository-1.0.so.1.0.0 [.] 0x0000000000013b1d 0.45% gnome-shell libglib-2.0.so.0.5600.4 [.] g_slice_free1 0.45% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_type_check_instance_is_fundamentally_a 0.44% gnome-shell libc-2.28.so [.] malloc 0.41% swapper [kernel.kallsyms] [k] apic_timer_interrupt 0.40% gnome-shell ld-2.28.so [.] _dl_lookup_symbol_x 0.39% kswapd0 [kernel.kallsyms] [k] raw_callee_save___pv_queued_spin_unlock

    자세한 내용은 시스템의 perf-record(1) 매뉴얼 페이지를 참조하십시오.

13.6. 실행 중인 프로세스에 perf 레코드 연결

실행 중인 프로세스에 perf 레코드를 연결할 수 있습니다. 이렇게 하면 perf 레코드가 지정된 프로세스의 성능 데이터만 샘플링하고 기록하도록 지시합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  • 실행 중인 프로세스에 perf 레코드를 연결합니다.

    $ perf record -p ID1,ID2 sleep seconds

    이 명령은 sleep 명령을 사용하여 지정된 시간( ) 동안 프로세스 ID의 ID1ID2 를 사용하여 프로세스의 성능 데이터를 샘플링하고 기록합니다. 특정 스레드의 이벤트를 기록하도록 perf 를 구성할 수도 있습니다.

    $ perf record -t ID1,ID2 sleep seconds
    참고

    -t 플래그를 사용하고 스레드 ID를 stipulating 스레드 ID를 사용하는 경우 perf 는 기본적으로 상속을 비활성화합니다. --inherit 옵션을 추가하여 상속을 활성화할 수 있습니다.

13.7. perf 보고서 출력 해석

perf report 명령을 실행하여 표시되는 테이블은 데이터를 다음과 같은 몇 개의 열로 정렬합니다.

오버헤드
해당 특정 함수에서 수집된 전체 샘플의 백분율을 나타냅니다.
명령
샘플이 수집되는 프로세스를 알려줍니다.
공유 오브젝트
샘플이 들어오는 ELF 이미지 이름을 표시합니다(샘플이 커널에서 오면 [kernel.kallsyms] 이름).
기호
함수 이름 또는 기호를 표시합니다. 기본 모드에서 함수는 가장 높은 오버헤드가 있는 항목과 함께 내림차순으로 정렬됩니다.

13.8. 다른 장치에서 읽을 수 있는 perf.data 파일 생성

perf 툴을 사용하여 성능 데이터를 다른 장치에서 분석할 perf.data 파일에 기록할 수 있습니다.

사전 요구 사항

프로세스

  1. 추가 조사에 관심이 있는 성능 데이터를 캡처합니다.

    # perf record -a --call-graph fp sleep <seconds>

    이 예에서는 sleep 명령을 사용하여 지시한 대로 전체 시스템에 perf.data 단위로 생성합니다. 또한 프레임 포인터 방법을 사용하여 호출 그래프 데이터를 캡처합니다.

  2. 기록된 데이터의 디버그 기호가 포함된 아카이브 파일을 생성합니다.

    # perf archive

검증

  • 아카이브 파일이 현재 활성 디렉터리에 생성되었는지 확인합니다.

    # ls perf.data*

    출력에는 perf.data 로 시작하는 현재 디렉토리의 모든 파일이 표시됩니다. 아카이브 파일의 이름은 perf.data.tar.gz 또는 perf.data.tar.bz2 입니다.

13.9. 다른 장치에서 perf.data 파일 분석

perf 툴을 사용하여 다른 장치에서 생성된 perf.data 파일을 분석할 수 있습니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • 다른 장치에 생성된 perf.data 및 관련 아카이브 파일이 있습니다.

프로세스

  1. perf.data 파일과 아카이브 파일을 현재 활성 디렉터리에 모두 복사합니다.
  2. 아카이브 파일을 ~/.debug:에 추출합니다.

    # mkdir -p ~/.debug
    # tar xf perf.data.tar.bz2 -C ~/.debug
    참고

    아카이브 파일의 이름은 perf.data.tar.gz 에서도 사용할 수 있습니다.

  3. 추가 분석을 위해 perf.data 파일을 엽니다.

    # perf report

14장. perf로 사용 중인 CPU 조사

시스템에서 성능 문제를 조사할 때 perf 를 사용하여 가장 버스트 CPU를 식별하고 모니터링합니다. 이는 귀하의 노력을 집중시키는 데 도움이 됩니다.

14.1. perf stat로 계산된 CPU 이벤트 표시

perf stat 을 사용하여 CPU 수 집계를 비활성화하여 계산한 CPU 이벤트를 표시할 수 있습니다. 이 기능을 사용하려면 -a 플래그를 사용하여 시스템 전체 모드에서 이벤트를 계산해야 합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  • CPU 수 집계가 비활성화된 이벤트를 계산합니다.

    # perf stat -a -A sleep seconds

    이 명령은 CPU0부터 각 CPU에 대해 sleep 명령을 사용하여 지정된 대로 시간 주기( )로 기록된 일반적인 하드웨어 및 소프트웨어 이벤트의 기본 집합 수를 표시합니다. 따라서 주기와 같은 이벤트를 지정하는 것이 유용할 수 있습니다.

    # perf stat -a -A -e cycles sleep seconds

14.2. perf 보고서로 가져온 CPU 샘플 표시

perf record 명령은 성능 데이터를 샘플링하고 perf.data 파일에 저장합니다. perf report 명령을 사용하여 이 파일을 읽을 수 있습니다. perf record 명령은 각 샘플이 사용된 CPU도 기록합니다. 이 정보를 보려면 그에 따라 perf report 명령을 구성합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • 현재 디렉터리에 perf 레코드를 사용하여 생성된 perf.data 파일이 있습니다. perf.data 파일이 루트 액세스 권한을 사용하여 생성된 경우 root 액세스 권한으로 perf 보고서를 실행해야 합니다.

프로세스

  • CPU로 정렬하는 동안 추가 분석을 위해 perf.data 파일의 내용을 표시합니다.

    # perf report --sort cpu
    • CPU 및 명령으로 정렬하여 CPU 시간이 소비되는 위치에 대한 자세한 정보를 표시할 수 있습니다.

      # perf report --sort cpu,comm

      이 예에서는 모니터링되는 모든 CPU의 명령을 오버헤드 사용량의 내림차순으로 총 오버헤드로 나열하고 명령이 실행된 CPU를 식별합니다.

14.3. perf top을 사용하여 프로파일링하는 동안 특정 CPU 표시

시스템을 실시간으로 프로파일링하는 동안 특정 CPU와 상대 사용량을 표시하도록 perf top 을 구성할 수 있습니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  • CPU로 정렬하는 동안 perf top 인터페이스를 시작합니다.

    # perf top --sort cpu

    이 명령을 수행하면 CPU와 해당 오버헤드가 오버헤드 사용량의 내림차순으로 실시간으로 나열됩니다. CPU 및 명령으로 정렬하여 CPU 시간이 소비되는 위치에 대한 자세한 정보를 확인할 수 있습니다.

    # perf top --sort cpu,comm

    이 명령은 총 오버헤드로 전체 오버헤드로 명령을 나열하고 명령이 실시간으로 실행된 CPU를 식별합니다.

14.4. perf 레코드 및 perf 보고서를 사용하여 특정 CPU 모니터링

perf 를 사용하여 특정 CPU의 성능 데이터를 샘플링하고 결과를 분석하여 CPU별 병목 현상을 확인합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  1. 특정 CPU의 성능 데이터를 기록합니다.

    특정 CPU를 대상으로 하려면 perf 레코드와 함께 -C 옵션을 사용합니다. 다음 예제에서는 개별 CPU 또는 범위를 지정하는 방법을 보여줍니다.

    • 선택한 CPU의 데이터를 샘플링하려면 다음을 수행합니다.

      # perf record -C 0,1 sleep <seconds>

      이 명령은 지정된 시간(초) 동안 CPU 01 의 성능 데이터를 샘플링하고 기록합니다.

    • 다양한 CPU의 데이터를 샘플링하려면 다음을 수행합니다.

      # perf record -C 0-2 sleep <seconds>

      이 명령은 지정된 기간 동안 CPU 0,12 의 성능 데이터를 샘플링하고 기록합니다.

  2. 기록된 성능 데이터를 분석합니다.

    perf report 명령을 사용하여 perf.data 파일을 읽고 분석합니다.

    # perf report

    이 명령은 perf.data 파일의 내용을 표시합니다.

    참고

    각 샘플이 기록된 CPU를 보려면 perf 보고서로 어떤 CPU 샘플이 수행된지 표시를 참조하십시오.

15장. perf를 사용하여 uprobes 생성

Uprobes (사용자 공간 프로브)는 런타임 시 사용자 공간 애플리케이션에 대한 동적 계측을 제공합니다. 소스 코드를 변경하거나 다시 컴파일할 필요가 없습니다.

uprobes 가 유용한 두 가지 주요 사용 사례가 있습니다.

디버깅 및 성능 분석
Uprobes 는 감시 지점과 유사하게 작동합니다. 애플리케이션의 특정 위치에 삽입하여 해당 코드 경로가 실행되는 빈도를 계산할 수 있습니다. 또한 호출 스택 또는 변수 값과 같은 풍부한 컨텍스트를 캡처할 수 있습니다. 성능 병목 현상을 식별하거나 버그를 추적하는 데 사용합니다.
이벤트 기반 데이터 수집
Uprobes 는 원형 버퍼와 같은 메커니즘에 대한 전환 이벤트 역할을 합니다. 사용자 공간의 실행 트리거에 따라 데이터가 기록되거나 플러시되는 시기를 제어할 수 있습니다.

Uprobesperf 와 원활하게 통합되므로 기존 업로브 를 소비하고 새 버전을 생성할 수 있습니다. 이러한 유연성을 통해 kprobes를 사용하여 (Kprobes를 사용하여) 커널 공간 계측과 함께 사용자 공간 동작의 강력한 비 침입 및 프로파일링을 수행할 수 있습니다.

15.1. perf를 사용하여 기능 수준에서 uprobes 생성

perf 툴을 사용하여 프로세스 또는 애플리케이션의 임의의 지점에서 동적 추적 지점을 생성합니다. perf stat 또는 perf 레코드와 함께 이러한 추적 포인트를 사용하여 프로세스 및 애플리케이션 동작을 분석합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  • 프로세스 또는 애플리케이션 관련 위치에서 모니터링에 관심이 있는 프로세스 또는 애플리케이션에 uprobe를 생성합니다.

    # perf probe -x /path/to/executable -a function
    Added new event:
      probe_executable:function   (on function in /path/to/executable)
    
    You can now use it in all perf tools, such as:
        perf record -e probe_executable:function -aR sleep 1

15.2. perf를 사용하여 함수 내의 행에 uprobes 생성

프로세스 또는 애플리케이션 동작을 더 잘 이해하기 위해 perf stat 및 perf 레코드와 같은 다른 perf 툴과 함께 추적 포인트를 사용할 수 있습니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • 실행 파일에 대한 디버깅 기호가 수신되었습니다.

    # objdump -t ./your_executable | head
    참고

    이렇게 하려면 실행 파일의 debuginfo 패키지를 설치합니다. 실행 파일이 로컬에서 개발한 애플리케이션인 경우 GCC의 -g 옵션을 사용하여 디버깅 정보로 애플리케이션을 컴파일합니다.

프로세스

  1. uprobe 를 배치할 수 있는 함수 라인 보기:

    $ perf probe -x ./your_executable -L main
    <main@/home/user/my_executable:0>
                  0  int main(int argc, const char *argv) 1 { int err; const char *cmd; char sbuf[STRERR_BUFSIZE]; / libsubcmd init */
                  7         exec_cmd_init("perf", PREFIX, PERF_EXEC_PATH, EXEC_PATH_ENVIRONMENT);
    8         pager_init(PERF_PAGER_ENVIRONMENT);
  2. 모니터링할 함수 줄에 대한 uprobe 를 생성합니다.

    # perf probe -x ./my_executable main:8
    Added new event:
              probe_my_executable:main_L8   (on main:8 in /home/user/my_executable)
    
    you can now use it in all perf tools, such as:
    
    Perf record -e probe_my_executable:main_L8 -aR sleep 1

15.3. uprobes를 통해 기록된 데이터의 perf 스크립트 출력

uprobes 로 수집된 데이터를 분석하는 일반적인 방법은 perf script 명령을 실행하는 것입니다. perf.data 파일을 읽고 기록된 워크로드에 대한 세부 추적을 표시합니다.

perf 스크립트 예제 출력에서
  • my_prog라는 프로그램에서 uprobe 함수에 추가됩니다.
  • auprobe 에 추가된 함수 인수입니다. 또는 uprobe 를 추가하는 코드 범위에 표시되는 임의의 변수가 될 수 있습니다.

    # perf script
        my_prog  1367 [007] 10802159.906593: probe_my_prog:isprime: (400551) a=2
        my_prog  1367 [007] 10802159.906623: probe_my_prog:isprime: (400551) a=3
        my_prog  1367 [007] 10802159.906625: probe_my_prog:isprime: (400551) a=4
        my_prog  1367 [007] 10802159.906627: probe_my_prog:isprime: (400551) a=5
        my_prog  1367 [007] 10802159.906629: probe_my_prog:isprime: (400551) a=6
        my_prog  1367 [007] 10802159.906631: probe_my_prog:isprime: (400551) a=7
        my_prog  1367 [007] 10802159.906633: probe_my_prog:isprime: (400551) a=13
        my_prog  1367 [007] 10802159.906635: probe_my_prog:isprime: (400551) a=17
        my_prog  1367 [007] 10802159.906637: probe_my_prog:isprime: (400551) a=19

16장. perf mem을 사용하여 메모리 액세스 프로파일링

perf mem 명령을 사용하여 시스템의 메모리 액세스를 샘플링할 수 있습니다. perf 툴의 mem 하위 명령을 사용하면 메모리 액세스(로드 및 저장소)를 샘플링할 수 있습니다.

perf mem 명령은 메모리 대기 시간, 액세스 유형 및 캐시 적중을 추적합니다. 또한 기록 데이터 기호는 이러한 이벤트에 대한 메모리 위치를 식별합니다.

16.1. perf mem로 메모리 액세스 샘플링

perf mem 명령을 사용하여 시스템의 메모리 액세스를 샘플링할 수 있습니다. 명령은 perf 레코드 및 perf 보고서와 동일한 옵션과 mem 하위 명령 전용 옵션도 사용합니다. 기록된 데이터는 나중에 분석할 수 있도록 현재 디렉토리의 perf.data 파일에 저장됩니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  1. 메모리 액세스 샘플:

    # perf mem record -a sleep <seconds>

    이 명령은 sleep 명령에 지정된 대로 < seconds > 초 동안 모든 CPU의 메모리 액세스를 샘플링합니다. 메모리 액세스 데이터를 샘플링하려는 모든 명령에 대해 sleep 명령을 교체할 수 있습니다. 기본적으로 perf mem 은 메모리 로드와 저장소를 모두 샘플링합니다. -t 옵션을 사용하고 perf mem레코드 간에 로드 또는 저장소를 지정하여 하나의 메모리 작업만 선택할 수 있습니다. 로드의 경우 메모리 계층 수준, TLB 메모리 액세스, 버스 스누퍼 및 메모리 잠금에 대한 정보가 캡처됩니다.

  2. 분석을 위해 perf.data 파일을 엽니다.

    # perf mem report

    예제 명령을 사용한 경우 출력은 다음과 같습니다.

    Available samples
    35k cpu/mem-loads,ldlat=30/P
    54k cpu/mem-stores/P

    cpu/mem-loads,ldlat=30/P 행은 메모리 로드를 통해 수집된 데이터를 나타내며 cpu/mem-stores/P 행은 메모리 저장소를 통해 수집된 데이터를 나타냅니다. 관심 있는 범주를 강조 표시하고 Enter 를 눌러 데이터를 확인합니다.

    Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 4067062
    Overhead       Samples  Local Weight  Memory access             Symbol                                                                 Shared Object                 Data Symbol                                                     Data Object                            Snoop         TLB access              Locked
       0.07%            29  98            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%            26  97            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%            25  96            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%             1  2325          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e9084                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.06%             1  2247          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e8164                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.05%             1  2166          L1 or L1 hit              [.] 0x00000000038140d6                                                 libxul.so                     [.] 0x00007ffd7b84b4a8                                          [stack]                                None          L1 or L2 hit            No
       0.05%             1  2117          Uncached or N/A hit       [k] check_for_unclaimed_mmio                                           [kernel.kallsyms]             [k] 0xffffb092c1842300                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.05%            22  95            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.05%             1  1898          L1 or L1 hit              [.] 0x0000000002a30e07                                                 libxul.so                     [.] 0x00007f610422e0e0                                          anon                                   None          L1 or L2 hit            No
       0.05%             1  1878          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e8164                                          [kernel.kallsyms]                      None          L2 miss                 No
       0.04%            18  94            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.04%             1  1593          Local RAM or RAM hit      [.] 0x00000000026f907d                                                 libxul.so                     [.] 0x00007f3336d50a80                                          anon                                   Hit           L2 miss                 No
       0.03%             1  1399          L1 or L1 hit              [.] 0x00000000037cb5f1                                                 libxul.so                     [.] 0x00007fbe81ef5d78                                          libxul.so                              None          L1 or L2 hit            No
       0.03%             1  1229          LFB or LFB hit            [.] 0x0000000002962aad                                                 libxul.so                     [.] 0x00007fb6f1be2b28                                          anon                                   None          L2 miss                 No
       0.03%             1  1202          LFB or LFB hit            [.] __pthread_mutex_lock                                               libpthread-2.29.so            [.] 0x00007fb75583ef20                                          anon                                   None          L1 or L2 hit            No
       0.03%             1  1193          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e9164                                          [kernel.kallsyms]                      None          L2 miss                 No
    0.03%             1  1191          L1 or L1 hit              [k] azx_get_delay_from_lpib                                            [kernel.kallsyms]             [k] 0xffffb092ca7efcf0                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
  3. 선택 사항: 결과를 정렬하여 데이터를 표시할 때 관심 있는 다양한 측면을 조사합니다. 예를 들어 샘플링 중에 발생하는 메모리 액세스 유형별로 메모리 로드를 초과하는 데이터를 내림차순으로 정렬하려면 해당 오버헤드의 내림차순으로 다음을 수행합니다.

    # perf mem -t load report --sort=mem

    예를 들어 출력은 다음과 같습니다.

    Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 40670
    Overhead       Samples  Memory access
      31.53%          9725  LFB or LFB hit
      29.70%         12201  L1 or L1 hit
      23.03%          9725  L3 or L3 hit
      12.91%          2316  Local RAM or RAM hit
       2.37%           743  L2 or L2 hit
       0.34%             9  Uncached or N/A hit
       0.10%            69  I/O or N/A hit
       0.02%           825  L3 miss

16.2. perf mem 보고서 출력 해석

수정자 없이 perf mem report 명령을 실행하면 데이터를 여러 열로 정렬합니다.

오버헤드
해당 특정 함수에서 수집된 전체 샘플의 백분율을 나타냅니다.
Samples
해당 행에 의해 계산되는 샘플 수를 표시합니다.
지역 Weight
프로세서 코어 주기로 액세스 대기 시간을 표시합니다.
메모리 액세스
발생한 메모리 액세스 유형을 표시합니다.
기호
함수 이름 또는 기호를 표시합니다.
공유 오브젝트
샘플이 들어오는 ELF 이미지 이름을 표시합니다(샘플이 커널에서 오면 [kernel.kallsyms] 이름).
Data Symbol

행이 대상으로 지정한 메모리 위치의 주소를 표시합니다.

중요

Data Symbol 열에는 액세스 중인 메모리 또는 스택 메모리의 동적 할당으로 인해 원시 주소가 표시될 수 있습니다.

Snoop
버스 트랜잭션을 표시합니다.
TLB 액세스
TLB 메모리 액세스를 표시합니다.
잠김
함수가 메모리가 잠겨 있는지 여부를 나타냅니다. 기본 모드에서 함수는 가장 높은 오버헤드가 있는 항목과 함께 내림차순으로 정렬됩니다.

17장. 잘못된 공유 감지

잘못된 공유는 Symmetric Multi Processing (SMP) 시스템의 프로세서 코어가 동일한 캐시 라인에 있는 다른 데이터 항목을 수정할 때 발생합니다. 이러한 프로세서는 프로세서 간에 공유되지 않는 다른 데이터 항목에 액세스합니다.

수정된 캐시 라인은 다른 프로세서가 수정된 데이터가 필요하지 않은 경우에도 복사본을 무효화하고 업데이트하도록 강제 적용합니다.

perf c2c 명령을 사용하여 잘못된 공유를 감지할 수 있습니다.

17.1. perf c2c의 목적

perf 툴의 c2c 하위 명령은 Shared Data Cache-to-Cache (C2C) 분석을 활성화합니다. perf c2c 명령을 사용하여 캐시 라인 경합을 검사하여 true 및 false 공유를 모두 감지할 수 있습니다.

캐시 라인 경합은 프로세서 코어가 다른 프로세서에서 공유하는 캐시 라인의 데이터를 수정할 때 발생합니다. 그런 다음 이 캐시 라인을 사용하는 다른 모든 프로세서는 복사본을 무효화하고 업데이트된 프로세서를 요청해야 합니다. 이로 인해 성능이 저하될 수 있습니다.

perf c2c 명령은 다음과 같은 정보를 제공합니다.

  • 경합이 감지된 캐시 라인
  • 데이터를 읽고 쓰는 프로세스
  • 경합을 유발하는 명령
  • 경합과 관련된 NUMA(Non-Uniform Memory Access) 노드

17.2. perf c2c를 사용하여 캐시 라인 경합 감지

perf c2c 명령을 사용하여 시스템에서 캐시 라인 경합을 감지할 수 있습니다. perf c2c 명령은 perf 레코드와 동일한 옵션과 c2c 하위 명령 전용 옵션도 지원합니다. 기록된 데이터는 나중에 분석할 수 있도록 현재 디렉토리의 perf.data 파일에 저장됩니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  • perf c2c 를 사용하여 캐시 라인 경합을 탐지합니다.

    # perf c2c record -a sleep <seconds>

    이 명령은 sleep 명령에 의해 지정된 대로 < seconds > 기간 동안 모든 CPU의 캐시 라인 경합 데이터를 샘플링하고 기록합니다. sleep 명령을 캐시 라인 경합 데이터를 수집하려는 모든 명령으로 교체할 수 있습니다.

17.3. perf c2c 레코드로 기록된 perf.data 파일 시각화

perf c2c 명령을 사용하여 기록된 perf.data 파일을 시각화할 수 있습니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • perf c2c 명령을 사용하여 기록된 perf.data 파일은 현재 디렉터리에서 사용할 수 있습니다. 자세한 내용은 perf c2c를 사용하여 캐시 라인 경합 탐지 를 참조하십시오.

프로세스

  1. 분석을 위해 perf.data 파일을 엽니다.

    # perf c2c report --stdio

    이 명령은 perf.data 파일을 명령줄 내의 여러 그래프로 시각화합니다.

    =================================================
               Trace Event Information
    =================================================
     Total records                     :     329219
     Locked Load/Store Operations      :      14654
     Load Operations                   :      69679
     Loads - uncacheable               :          0
     Loads - IO                        :          0
     Loads - Miss                      :       3972
     Loads - no mapping                :          0
     Load Fill Buffer Hit              :      11958
     Load L1D hit                      :      17235
     Load L2D hit                      :         21
     Load LLC hit                      :      14219
     Load Local HITM                   :       3402
     Load Remote HITM                  :      12757
     Load Remote HIT                   :       5295
     Load Local DRAM                   :        976
     Load Remote DRAM                  :       3246
     Load MESI State Exclusive         :       4222
     Load MESI State Shared            :          0
     Load LLC Misses                   :      22274
     LLC Misses to Local DRAM          :        4.4%
     LLC Misses to Remote DRAM         :       14.6%
     LLC Misses to Remote cache (HIT)  :       23.8%
     LLC Misses to Remote cache (HITM) :       57.3%
     Store Operations                  :     259539
     Store - uncacheable               :          0
     Store - no mapping                :         11
     Store L1D Hit                     :     256696
     Store L1D Miss                    :       2832
     No Page Map Rejects               :       2376
     Unable to parse data source       :          1
    
    =================================================
       Global Shared Cache Line Event Information
    =================================================
     Total Shared Cache Lines          :         55
     Load HITs on shared lines         :      55454
     Fill Buffer Hits on shared lines  :      10635
     L1D hits on shared lines          :      16415
     L2D hits on shared lines          :          0
     LLC hits on shared lines          :       8501
     Locked Access on shared lines     :      14351
     Store HITs on shared lines        :     109953
     Store L1D hits on shared lines    :     109449
     Total Merged records              :     126112
    
    =================================================
                     c2c details
    =================================================
     Events                            : cpu/mem-loads,ldlat=30/P
    	                                    : cpu/mem-stores/P
     Cachelines sort on                : Remote HITMs
     Cacheline data grouping          : offset,pid,iaddr
    
    =================================================
    	   Shared Data Cache Line Table
    =================================================
    #
    #                              Total      Rmt  ----- LLC Load Hitm -----  ---- Store Reference ----  --- Load Dram ----      LLC    Total  ----- Core Load Hit -----  -- LLC Load Hit --
    # Index           Cacheline  records     Hitm    Total      Lcl      Rmt    Total    L1Hit   L1Miss       Lcl       Rmt  Ld Miss    Loads       FB       L1       L2       Llc       Rmt
    # .....  ..................  .......  .......  .......  .......  .......  .......  .......  .......  ........  ........  .......  .......  .......  .......  .......  ........  ........
    #
          0            0x602180   149904   77.09%    12103     2269     9834   109504   109036      468       727      2657    13747    40400     5355    16154        0      2875       529
          1            0x602100    12128   22.20%     3951     1119     2832        0        0        0        65       200     3749    12128     5096      108        0      2056       652
          2  0xffff883ffb6a7e80      260    0.09%       15        3       12      161      161        0         1         1       15       99       25       50        0         6         1
          3  0xffffffff81aec000      157    0.07%        9        0        9        1        0        1         0         7       20      156       50       59        0        27         4
          4  0xffffffff81e3f540      179    0.06%        9        1        8      117       97       20         0        10       25       62       11        1        0        24         7
    
    =================================================
          Shared Cache Line Distribution Pareto
    =================================================
    #
    #        ----- HITM -----  -- Store Refs --        Data address                               ---------- cycles ----------       cpu                                     Shared
    #   Num      Rmt      Lcl   L1 Hit  L1 Miss              Offset      Pid        Code address  rmt hitm  lcl hitm      load       cnt               Symbol                Object                  Source:Line  Node{cpu list}
    # .....  .......  .......  .......  .......  ..................  .......  ..................  ........  ........  ........  ........  ...................  ....................  ...........................  ....
    #
      -------------------------------------------------------------
          0     9834     2269   109036      468            0x602180
      -------------------------------------------------------------
              65.51%   55.88%   75.20%    0.00%                 0x0    14604            0x400b4f     27161     26039     26017         9  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:144   0{0-1,4}  1{24-25,120}  2{48,54}  3{169}
    	   0.41%    0.35%    0.00%    0.00%                 0x0    14604            0x400b56     18088     12601     26671         9  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:145   0{0-1,4}  1{24-25,120}  2{48,54}  3{169}
    	   0.00%    0.00%   24.80%  100.00%                 0x0    14604            0x400b61         0         0         0         9  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:145   0{0-1,4}  1{24-25,120}  2{48,54}  3{169}
    	   7.50%    9.92%    0.00%    0.00%                0x20    14604            0x400ba7      2470      1729      1897         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:154   1{122}  2{144}
    	  17.61%   20.89%    0.00%    0.00%                0x28    14604            0x400bc1      2294      1575      1649         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:158   2{53}  3{170}
    	   8.97%   12.96%    0.00%    0.00%                0x30    14604            0x400bdb      2325      1897      1828         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:162   0{96}  3{171}
    
      -------------------------------------------------------------
          1     2832     1119        0        0            0x602100
      -------------------------------------------------------------
    	  29.13%   36.19%    0.00%    0.00%                0x20    14604            0x400bb3      1964      1230      1788         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:155   1{122}  2{144}
    	  43.68%   34.41%    0.00%    0.00%                0x28    14604            0x400bcd      2274      1566      1793         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:159   2{53}  3{170}
    27.19%   29.40%    0.00%    0.00%                0x30    14604            0x400be7      2045      1247      2011         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:163   0{96}  3{171}

17.4. perf c2c 보고서 출력 해석

perf c2c report --stdio 명령을 실행하여 표시되는 시각화는 데이터를 여러 테이블로 정렬합니다.

추적 이벤트 정보
perf c2c 레코드 에서 수집한 모든 로드 및 저장소 샘플에 대한 높은 수준의 요약을 제공합니다.
글로벌 공유 캐시 라인 이벤트 정보
공유 캐시 행에 대한 통계를 제공합니다.
c2c 세부 정보
샘플된 이벤트와 perf c2c 보고서 데이터를 구성하는 방법에 대한 정보를 제공합니다.
공유 데이터 캐시 행 테이블
잘못된 공유를 보여주는 가장 hottest 캐시 행이 요약되어 있습니다. 캐시 라인당 원격 Hitm 개수를 내림차순으로 정렬합니다.
공유 캐시 라인 배포 Pareto

경합이 발생하는 각 캐시 라인에 대한 다양한 정보를 제공합니다.

  • 캐시 줄은 0 부터 시작하여 NUM 열에서 번호가 지정됩니다.
  • 각 캐시 라인의 가상 주소는 데이터 주소 Offset 열에 포함됩니다. 그런 다음 서로 다른 액세스가 발생한 캐시 라인에 대한 오프셋이 뒤에 옵니다.
  • Pid 열에는 프로세스 ID가 포함되어 있습니다.
  • Code Address 열에는 명령 포인터 코드 주소가 포함되어 있습니다.
  • cycles 레이블 아래의 열에는 평균 부하 대기 시간이 표시됩니다.
  • cpu cnt 열에는 다양한 CPU 샘플 수가 표시됩니다. 지정된 위치에서 인덱싱된 데이터를 기다리는 다양한 CPU 수입니다.
  • Symbol 열에는 함수 이름 또는 기호가 표시됩니다.
  • Shared Object 열에는 샘플이 제공된 ELF 이미지 이름([kernel.kallsyms]이 커널에서 오면 사용됨)이 표시됩니다.
  • Source:Line 열에는 소스 파일 및 행 번호가 표시됩니다.
  • Node{cpu list} 열에는 각 노드에 대해 제공되는 특정 CPU 샘플이 표시됩니다.

17.5. perf c2c로 잘못된 공유 감지

perf c2c 명령을 사용하여 잘못된 공유를 감지할 수 있습니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • perf c2c 명령을 사용하여 기록된 perf.data 파일은 현재 디렉터리에서 사용할 수 있습니다. 자세한 내용은 perf c2c를 사용하여 캐시 라인 경합 탐지 를 참조하십시오.

프로세스

  1. perf.data 파일을 엽니다.

    # perf c2c report --stdio

    그러면 명령줄에서 perf.data 파일이 열립니다.

  2. 추적 이벤트 정보 테이블에서 LLC Misses to Remote Cache (HITM)의 값이 포함된 행을 찾습니다.

    LLC Misses to Remote Cache (HITM) 행의 값 열의 백분율은 수정된 캐시 라인의 NUMA 노드에서 발생한 LLC 누락의 백분율을 나타내며 잘못된 공유가 발생한 주요 지표입니다.

    =================================================
                Trace Event Information
    =================================================
      Total records                     :     329219
      Locked Load/Store Operations      :      14654
      Load Operations                   :      69679
      Loads - uncacheable               :          0
      Loads - IO                        :          0
      Loads - Miss                      :       3972
      Loads - no mapping                :          0
      Load Fill Buffer Hit              :      11958
      Load L1D hit                      :      17235
      Load L2D hit                      :         21
      Load LLC hit                      :      14219
      Load Local HITM                   :       3402
      Load Remote HITM                  :      12757
      Load Remote HIT                   :       5295
      Load Local DRAM                   :        976
      Load Remote DRAM                  :       3246
      Load MESI State Exclusive         :       4222
      Load MESI State Shared            :          0
      Load LLC Misses                   :      22274
      LLC Misses to Local DRAM          :        4.4%
      LLC Misses to Remote DRAM         :       14.6%
      LLC Misses to Remote cache (HIT)  :       23.8%
      LLC Misses to Remote cache (HITM) : 57.3%
      Store Operations                  :     259539
      Store - uncacheable               :          0
      Store - no mapping                :         11
      Store L1D Hit                     :     256696
      Store L1D Miss                    :       2832
      No Page Map Rejects               :       2376
      Unable to parse data source       :          1
  3. 공유 데이터 캐시 라인 테이블의 LLC Load Hitm 필드의 Rmt 열을 검사합니다.

    =================================================
                 Shared Data Cache Line Table
    =================================================
      #
      #                              Total      Rmt  ----- LLC Load Hitm -----  ---- Store Reference ----  --- Load Dram ----      LLC    Total  ----- Core Load Hit -----  -- LLC Load Hit --
      # Index           Cacheline  records     Hitm    Total      Lcl      Rmt    Total    L1Hit   L1Miss       Lcl       Rmt  Ld Miss    Loads       FB       L1       L2       Llc       Rmt
      # .....  ..................  .......  .......  .......  .......  .......  .......  .......  .......  ........  ........  .......  .......  .......  .......  .......  ........  ........
      #
            0            0x602180   149904   77.09%    12103     2269     9834   109504   109036      468       727      2657    13747    40400     5355    16154        0      2875       529
            1            0x602100    12128   22.20%     3951     1119     2832        0        0        0        65       200     3749    12128     5096      108        0      2056       652
            2  0xffff883ffb6a7e80      260    0.09%       15        3       12      161      161        0         1         1       15       99       25       50        0         6         1
            3  0xffffffff81aec000      157    0.07%        9        0        9        1        0        1         0         7       20      156       50       59        0        27         4
            4  0xffffffff81e3f540      179    0.06%        9        1        8      117       97       20         0        10       25       62       11        1        0        24         7

    테이블은 캐시 라인별로 감지된 원격 Hitm 의 양에 따라 내림차순으로 정렬됩니다. LLC Load Hitm 섹션의 Rmt 열의 높은 숫자는 잘못된 공유를 나타냅니다. 잘못된 공유 활동을 디버깅하려면 발생한 캐시 행을 추가로 검사해야 합니다.

18장. 관련 리뷰: Getting Started withgraphs

시스템 관리자는ap graphs를 사용하여 perf 도구로 기록된 시스템 성능 데이터의 시각화를 생성할 수 있습니다. 소프트웨어 개발자로서, 당신은 perf 도구로 기록된 애플리케이션 성능 데이터의 시각화를 생성하기 위해 graphs 를 사용할 수 있습니다. 스택 추적 샘플링은 perf 툴을 사용하여 CPU 성능을 프로파일링하는 일반적인 기술입니다. 안타깝게도 perf 를 사용한 프로파일링 스택 추적의 결과는 매우 상세하고 분석을 위해 인건비 집약적일 수 있습니다. thegraphs 는 핫 코드 경로를 더 빠르고 쉽게 식별할 수 있도록 perf 로 기록된 데이터에서 생성된 시각화입니다.

18.1. firegraphs 설치

필요한 패키지를 설치해야합니다. . . ..

프로세스

  • graphs 패키지를 설치합니다.

    # dnf install js-d3-flame-graph

18.2. 전체 시스템에 대한 매개 변수 생성

분수를 사용하여 전체 시스템에 기록된 성능 데이터를 시각화할 수 있습니다.

사전 요구 사항

프로세스

  • 데이터를 기록하고 시각화를 만듭니다.

    # perf script flamegraph -a -F 99 sleep 60

    이 명령은 sleep 명령을 사용하여 규정한 대로 전체 시스템에 대한 성능 데이터를 60초 동안 샘플링하고 기록한 다음 현재 활성 디렉토리에 저장된 시각화를 html 로 구성합니다. 명령은 기본적으로 호출 그래프 데이터를 샘플링하고 perf 툴과 동일한 인수를 사용합니다. 이 경우 다음과 같습니다.

    -a
    전체 시스템에 대한 데이터를 기록합니다.
    -F
    초당 샘플링 빈도를 설정하려면 다음을 수행합니다.

검증

  • 분석을 위해 생성된 시각화를 확인합니다.

    # xdg-open flamegraph.html

    이 명령은 기본 브라우저에서 시각화를 엽니다.

모든 CPU에서 CPU 활동을 표시하는 Flamegraph

18.3. 특정 프로세스에 대한 자격 증명 생성

가상 머신을 사용하여 실행 중인 특정 프로세스에 기록된 성능 데이터를 시각화할 수 있습니다.

사전 요구 사항

프로세스

  • 데이터를 기록하고 시각화를 만듭니다.

    # perf script flamegraph -a -F 99 -p ID1,ID2 sleep 60

    이 명령은 sleep 명령을 사용하여 지정된 대로 60 초 동안 프로세스 ID의 ID1ID2 를 사용하여 프로세스의 성능 데이터를 샘플링하고 기록한 다음 현재 활성 디렉터리에 저장할 시각화를 구성합니다. 명령은 기본적으로 호출 그래프 데이터를 샘플링하고 perf 툴과 동일한 인수를 사용합니다. 이 경우 다음과 같습니다.

    -a
    전체 시스템에 대한 데이터를 기록합니다.
    -F
    초당 샘플링 빈도를 설정하려면 다음을 수행합니다.
    -p
    데이터를 샘플링하고 기록할 특정 프로세스 ID를 규정합니다.

검증

  • 분석을 위해 생성된 시각화를 확인합니다.

    # xdg-open flamegraph.html

    이 명령은 기본 브라우저에서 시각화를 엽니다.

Flamegraph

18.4. inegraphs의 스택 추적 및 기능 핫스팟 분석

각 상자는 스택 의 다른 기능을 나타냅니다. y축 은 스택 깊이를 보여줍니다. 각 스택의 맨 위 상자는 CPU에 있는 함수를 나타내며 나머지 상자는 조상을 나타냅니다. X 축은 샘플링된 호출- 그래프 데이터의 채우기를 표시합니다.

X축은 시간이 아니라 샘플 수에 따라 작동합니다. 자식은 전체 샘플의 내림차순으로 표시됩니다. 상자 너비는 CPU의 빈도를 나타냅니다. 더 큰 상자는 더 많은 샘플에서 캡처된 기능 또는 조상자를 나타냅니다.

프로세스

  • 이전에 표시되지 않은 함수의 이름을 공개하고 데이터를 추가로 조사하려면 지정된 위치에서 스택을 축소하려면 이 그래프 내의 상자를 클릭합니다.

    확대/축소 이미지
  • 기본 보기로 돌아가려면 확대/축소 재설정 을 클릭합니다.

    중요

    사용자 공간 함수를 나타내는 박스는 함수의 바이너리가 제거되었기 때문에 알 수 없음 으로 레이블이 지정될 수 있습니다. 디버깅 정보가 활성화된 debuginfo 패키지를 설치하거나 로컬 애플리케이션을 컴파일합니다. GCC에서 -g 옵션을 사용하여 이러한 상황에서 함수 이름 또는 기호를 표시합니다.

    Flamegraph visualization

19장. perf circular buffer를 사용하여 성능 병목 현상 모니터링

perf 툴을 사용하여 데이터의 이벤트별 스냅샷을 가져오는 원형 버퍼를 생성할 수 있습니다. 이를 사용하여 특정 프로세스 또는 시스템에서 실행되는 애플리케이션의 일부에서 성능 병목 현상을 모니터링합니다.

이러한 경우 perf 는 지정된 이벤트가 감지된 경우 나중에 분석을 위해 perf.data 파일에만 데이터를 씁니다.

19.1. perf를 사용하는 원형 버퍼 및 이벤트별 스냅샷

특정 이벤트 전에 Perf 데이터의 기록 시간은 과도한 오버헤드를 발생시키거나 분석을 위해 비현실적임을 증명할 수 있습니다. 이러한 경우 perf 레코드를 사용하여 특정 이벤트 후에 스냅샷을 사용하는 사용자 지정 원형 버퍼를 생성합니다.

--overwrite 옵션을 사용하면 perf 레코드 가 모든 데이터를 덮어 쓰기 가능한 원형 버퍼에 저장합니다. 버퍼가 가득 차면 perf 레코드 가 가장 오래된 레코드를 자동으로 덮어쓰므로 perf.data 파일에 기록되지 않습니다.

--overwrite--switch-output-event 옵션을 함께 사용하면 원형 버퍼가 구성됩니다. --switch-output-event 트리거 이벤트를 감지할 때까지 데이터를 지속적으로 기록하고 덤프합니다. 이벤트 후 circular 버퍼에서 perf 파일에 데이터를 쓰기 위한 트리거 신호 perf 레코드 입니다. 이렇게 하면 관련 정보를 perf.data 파일에만 작성하여 오버헤드를 줄이는 동시에 특정 데이터를 수집합니다.

perf 툴을 사용하면 순환 버퍼를 생성할 수 있습니다. 이는 관심 있는 데이터만 수집하도록 지정하는 이벤트에 의해 트리거됩니다. 이벤트 관련 데이터를 수집하는 순환 버퍼를 생성하려면 perf 에 대해 --overwrite--switch-output-event 옵션을 사용합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.
  • 프로세스 또는 애플리케이션 내의 관심 위치에서 모니터링에 관심이 있는 프로세스 또는 애플리케이션에 uprobe 를 배치했습니다.

    # perf probe -x </path/to/executable> -a function
    Added new event:
      probe_executable:function   (on function in /path/to/executable)
    
    You can now use it in all perf tools, such as:
    
        perf record -e probe_executable:function -aR sleep 1

프로세스

  • uprobe 를 트리거 이벤트로 사용하여 원형 버퍼를 생성합니다.

    # perf record --overwrite -e cycles --switch-output-event probe_executable:function ./executable
    [ perf record: dump data: Woken up 1 times ]
    [ perf record: Dump perf.data.2021021012231959 ]
    [ perf record: dump data: Woken up 1 times ]
    [ perf record: Dump perf.data.2021021012232008 ]
    [ perf record: dump data: Woken up 1 times ]
    [ perf record: Dump perf.data.2021021012232082 ]
    [ perf record: Captured and wrote 5.621 MB perf.data.<timestamp> ]

    이 명령은 실행 파일을 시작하고 --switch-output-event 옵션 뒤에 지정된 트리거 이벤트인 uprobe 를 감지할 때까지 -e 옵션 뒤에 지정된 cpu 사이클을 수집합니다. 이 시점에서 perf 스냅샷은 순환 버퍼 데이터를 순환하고 타임 스탬프로 식별된 고유한 perf.data 파일에 저장합니다. 이 예에서는 총 2개의 스냅샷이 생성되었으며, Ctrl+C 를 누르면 마지막 perf.data 파일이 강제 적용되었습니다.

20장. perf 수집기를 사용하여 추적 지점 관리

제어 파이프 인터페이스를 사용하여 실행 중인 perf 수집기에서 다양한 추적 지점을 관리합니다. perf 를 중지하거나 다시 시작하지 않고도 수집하는 데이터를 동적으로 조정할 수 있습니다. 이렇게 하면 레코딩 프로세스를 중지하거나 다시 시작할 때 발생하는 성능 데이터 손실이 방지됩니다.

컨트롤 파이프 인터페이스를 사용하여 실행 중인 perf 수집기에 tracepoints를 추가할 수 있습니다. perf 는 기록되는 데이터를 조정하여 perf 를 중지하지 않고도 성능 데이터의 손실을 방지합니다.

사전 요구 사항

  • perf 사용자 공간 도구가 설치되어 있어야 합니다. 자세한 내용은 perf 설치를 참조하십시오.

프로세스

  1. 제어 파이프 인터페이스를 구성합니다.

    # mkfifo control ack perf.pipe
  2. 활성화하려는 컨트롤 파일 구성 및 이벤트를 사용하여 perf 레코드를 실행합니다.

    # perf record --control=fifo:control,ack -D -1 --no-buffering -e 'sched:*' -o - > perf.pipe

    이 예제에서 -e 옵션은 스케줄러 이벤트로 perf 레코드를 시작한 후 'sched:*' 로 선언합니다.

  3. 두 번째 명령줄에서 제어 파이프의 읽기 측면을 시작합니다.

    # cat perf.pipe | perf --no-pager script -i -
  4. 제어 파이프의 읽기 측면을 시작하면 첫 번째 명령줄에서 다음 메시지가 트리거됩니다.

    Events disabled
  5. 세 번째 명령줄에서 제어 파일을 사용하여 추적 지점을 활성화합니다.

    # echo 'enable sched:sched_process_fork' > control

    이 명령은 perf 를 트리거하여 선언된 이벤트에 대한 제어 파일의 현재 이벤트 목록을 스캔합니다. 이벤트가 있으면 tracepoint가 활성화되고 첫 번째 명령줄에 다음 메시지가 표시됩니다.

    event sched:sched_process_fork enabled
  6. 추적 지점이 활성화되면 두 번째 명령줄은 추적 지점을 감지하는 perf의 출력을 표시합니다.

    bash 33349 [034] 149587.674295: sched:sched_process_fork: comm=bash pid=33349 child_comm=bash child_pid=34056

컨트롤 파이프 인터페이스를 사용하여 실행 중인 perf 수집기에서 추적 포인트를 제거할 수 있습니다. 이는 perf 를 중지하고 성능 데이터를 손실하지 않고도 수집하는 데이터 범위를 줄이는 데 도움이 됩니다.

사전 요구 사항

프로세스

  • 추적 지점을 제거합니다.

    # echo 'disable sched:sched_process_fork' > control

    이 예에서는 이전에 스케줄러 이벤트를 제어 파일에 로드하고 tracepoint sched:sched_process_fork 를 활성화했다고 가정합니다.

    이 명령은 perf 를 트리거하여 선언된 이벤트에 대한 제어 파일의 현재 이벤트 목록을 스캔합니다. 있으면 추적 포인트가 비활성화되고 다음 메시지가 컨트롤 파이프를 구성하는 데 사용되는 명령줄에 표시됩니다.

    # event sched:sched_process_fork disabled

21장. 웹 콘솔에서 시스템 성능 최적화

RHEL 웹 콘솔에서 성능 프로파일을 설정하여 선택한 작업에 대한 시스템의 성능을 최적화할 수 있습니다.

21.1. 웹 콘솔의 성능 튜닝 옵션

Red Hat Enterprise Linux는 시스템을 최적화하는 몇 가지 성능 프로필을 제공합니다.

  • 데스크탑을 사용하는 시스템
  • 처리량 성능
  • 대기 시간 성능
  • 네트워크 성능
  • 저전력 소비
  • 가상 머신

TuneD 서비스는 선택한 프로필과 일치하도록 시스템 옵션을 최적화합니다. 웹 콘솔에서 시스템의 성능 프로필을 설정할 수 있습니다.

21.2. 웹 콘솔에서 성능 프로필 설정

수행하려는 작업에 따라 웹 콘솔을 사용하여 적절한 프로필을 설정하여 시스템 성능을 최적화합니다.

사전 요구 사항

프로세스

  1. RHEL 10 웹 콘솔에 로그인합니다.
  2. 개요 를 클릭합니다.
  3. 구성 섹션에서 현재 성능 프로필을 클릭합니다.

    Performance profile in the Overview pane of the web console

  4. 성능 프로필 변경 대화 상자에서 필요한 프로필을 설정합니다.
  5. 프로필 변경을 클릭합니다.

21.3. 웹 콘솔을 사용하여 로컬 시스템에서 성능 모니터링

RHEL 웹 콘솔은 문제 해결에 사용률 및 오류(USE) 방법을 사용합니다. 새로운 성능 지표 페이지에는 맨 위의 최신 데이터로 구성된 데이터의 기록 보기가 있습니다. 지표 및 기록 페이지에서 리소스 사용률 및 포화 상태에 대한 이벤트, 오류 및 그래픽 표시를 볼 수 있습니다.

사전 요구 사항

  • RHEL 10 웹 콘솔을 설치했습니다.

    자세한 내용은 웹 콘솔 설치 및 활성화를 참조하십시오.

  • cockpit-pcp 패키지가 설치되어 있습니다.
  • pmlogger.servicepmproxy.service 서비스가 활성화되어 있고 실행 중인 PCP(Performance Co- Cryostat) 서비스가 활성화되어 있습니다.

프로세스

  1. RHEL 10 웹 콘솔에 로그인합니다.
  2. 개요 를 클릭합니다.
  3. 사용 섹션에서 메트릭 및 기록 보기를 클릭합니다.

    웹 콘솔의 개요 창에서 메트릭 보기

    Metrics 및 history 섹션이 열리고 표시됩니다. 현재 시스템 구성 및 사용자 지정 시간 간격 동안 그래픽 형식으로 성능 지표를 사용합니다.

21.4. 웹 콘솔 및 Grafana를 사용하여 여러 시스템에서 성능 모니터링

Grafana는 여러 시스템의 데이터를 집계하여 PCP(Performance Co- Cryostat) 메트릭을 그래픽으로 시각화합니다. 웹 콘솔 인터페이스에서 성능 지표 모니터링을 구성하고 여러 시스템에 대해 내보낼 수 있습니다.

사전 요구 사항

  • RHEL 10 웹 콘솔을 설치했습니다.

    자세한 내용은 웹 콘솔 설치 및 활성화를 참조하십시오.

  • cockpit-pcp 패키지를 설치했습니다.
  • pmlogger.servicepmproxy.service 서비스가 활성화되어 있고 실행 중인 PCP(Performance Co- Cryostat) 서비스가 활성화되어 있습니다.
  • Grafana 대시보드를 구성했습니다. 자세한 내용은 grafana-server 설정을 참조하십시오.
  • valkey 패키지가 설치되어 있습니다.

    또는 나중에 절차의 웹 콘솔 인터페이스에서 패키지를 설치할 수 있습니다.

프로세스

  1. RHEL 10 웹 콘솔에 로그인합니다.
  2. 개요 페이지에서 사용 표의 지표 및 기록 보기를 클릭합니다.
  3. Metrics 설정 버튼을 클릭합니다.
  4. 활성 위치로 내보내기 네트워크 슬라이더로 이동합니다.

    valkey 패키지가 설치되어 있지 않은 경우 웹 콘솔에서 설치하라는 메시지를 표시합니다.

  5. pmproxy 서비스를 열려면 드롭다운 목록에서 영역을 선택하고 pmproxy 추가 버튼을 클릭합니다.
  6. 저장을 클릭합니다.

검증

  1. 네트워킹 을 클릭합니다.
  2. 방화벽 테이블에서 규칙 및 영역 편집 버튼을 클릭합니다.
  3. 선택한 영역에서 pmproxy 를 검색합니다.

    중요

    성능을 모니터링하려는 모든 시스템에서 이 절차를 반복합니다.

22장. BPF Compiler Collection을 사용하여 시스템 성능 분석

BPF Compiler Collection(BCC)은 BPF(Berkeley Packet Filter) 함수를 사용하여 사용자 지정 커널 프로그램을 실행하여 시스템 성능을 분석합니다. BCC는 BPF 프로그램의 성능 모니터링, 추적 및 디버깅을 위해 시스템 이벤트에 액세스하여 시스템 인사이트를 추출하기 위한 툴과 라이브러리를 제공합니다.

22.1. bcc-tools 패키지 설치

bcc-tools 패키지를 설치하여 BPF Compiler Collection (BCC) 라이브러리 및 관련 도구를 가져올 수 있습니다.

프로세스

  • bcc-tools를 설치합니다.

    # dnf install bcc-tools

    BCC 툴은 /usr/share/bcc/tools/ 디렉터리에 설치됩니다.

검증

  • 설치된 툴을 검사합니다.

    # ls -l /usr/share/bcc/tools/

    설치된 도구 목록이 나타납니다. 목록의 doc 디렉터리에는 각 툴에 대한 문서가 있습니다.

22.2. execsnoop를 사용하여 시스템 프로세스 검사

BCC 제품군의 execsnoop 툴은 새 프로세스 실행 이벤트를 실시간으로 캡처하고 표시합니다. 시스템에서 실행 중인 명령 또는 바이너리를 관찰하여 디버깅, 감사 및 보안 모니터링을 지원하는 데 유용합니다.

프로세스

  1. 하나의 명령줄에서 execsnoop 프로그램을 실행합니다.

    # /usr/share/bcc/tools/execsnoop
  2. ls 명령의 단기 프로세스를 생성하려면 다른 명령줄에서 다음을 입력합니다.

    $ ls /usr/share/bcc/tools/doc/

    execsnoop 을 실행하는 명령줄에는 다음 출력이 표시됩니다.

    PCOMM	PID    PPID   RET ARGS
    ls   	8382   8287     0 /usr/bin/ls --color=auto /usr/share/bcc/tools/doc/

    execsnoop 프로그램은 시스템 리소스를 사용하는 새 프로세스마다 출력 행을 출력합니다. ls 와 같이 곧 실행되는 프로그램의 프로세스도 감지할 수 있으며 대부분의 모니터링 도구는 등록하지 않습니다. execsnoop 출력에는 다음 필드가 표시됩니다.

    PCOMM
    상위 프로세스 이름입니다. (ls)
    PID
    프로세스 ID입니다. (8382)
    PPID
    상위 프로세스 ID입니다. (8287)
    RET
    프로그램 코드를 새 프로세스로 로드하는 exec() 시스템 호출(0)의 반환 값입니다.
    ARGS

    시작된 프로그램의 인수와 관련된 위치입니다.

    자세한 내용은 시스템의 /usr/share/bcc/tools/doc/execsnoop_example.txt 파일 및 exec Cryostat 도움말 페이지를 참조하십시오.

22.3. opensnoop을 사용하여 명령으로 열린 파일 추적

BPF Compiler Collection(BCC)의 opensnoop 툴을 사용하여 특정 명령으로 실시간으로 파일 액세스를 모니터링하고 기록합니다. 이 기능은 애플리케이션의 런타임 동작을 디버깅, 감사 또는 이해하는 데 유용합니다.

프로세스

  1. 한 명령줄에서 opensnoop 프로그램을 실행하여 uname 명령 프로세스에서만 열린 파일의 출력을 출력합니다.

    # /usr/share/bcc/tools/opensnoop -n uname
  2. 다른 명령줄에서 명령을 입력하여 특정 파일을 엽니다.

    $ uname
    The command line running opensnoop shows the output similar to the following:
    PID    COMM 	FD ERR PATH
    8596   uname 	3  0   /etc/ld.so.cache
    8596   uname 	3  0   /lib64/libc.so.6
    8596   uname 	3  0   /usr/lib/locale/locale-archive
    ...

    opensnoop 프로그램은 전체 시스템에서 open() 시스템 호출을 감시하고 uname 이 동시에 열려고 하는 각 파일의 출력을 출력합니다. opensnoop 출력에는 다음 필드가 표시됩니다.

    PID
    프로세스 ID입니다. (8596)
    COMM
    프로세스 이름입니다. (uname)
    FD
    파일 설명자 - open()이 열려 있는 파일을 참조하기 위해 반환하는 값입니다. (3)
    ERR
    모든 오류.
    PATH

    open() 이 열려고 하는 파일의 위치입니다.

    명령이 존재하지 않는 파일을 읽으려고 하면 FD 열은 -1 을 반환합니다. 또한 ERR 열에는 관련 오류에 해당하는 값이 출력됩니다. opensnoop 을 사용하여 제대로 작동하지 않는 애플리케이션을 식별합니다. 자세한 내용은 시스템의 /usr/share/bcc/tools/doc/opensnoop_example.txt 파일 및 open(2) 매뉴얼 페이지를 참조하십시오.

biotop 툴은 디스크 I/O 활동을 가장 많이 생성하는 프로세스의 실시간 보기를 제공합니다. 고성능 모니터링 및 문제 해결을 위한 툴 역할을 하는 디스크가 높은 애플리케이션을 식별합니다.

프로세스

  1. 30 초 요약을 생성하려면 30을 인수로 사용하여 한 명령줄에서 biotop 프로그램을 실행합니다.

    # /usr/share/bcc/tools/biotop 30

    인수를 지정하지 않으면 기본적으로 1초마다 출력 화면이 새로 고쳐집니다.

  2. 다른 명령줄에서 명령을 입력하여 로컬 하드 디스크 장치의 내용을 읽고 출력을 /dev/zero 파일에 씁니다.

    # dd if=/dev/vda of=/dev/zero

    이 단계는 biotop 를 설명하기 위해 특정 I/O 트래픽을 생성합니다. biotop 를 실행하는 명령줄에는 다음과 유사한 출력이 표시됩니다.

    PID    COMM             D MAJ MIN DISK       I/O  Kbytes     AVGms
    9568   dd               R 252 0   vda      16294 14440636.0  3.69
    48     kswapd0          W 252 0   vda       1763 120696.0    1.65
    7571   gnome-shell      R 252 0   vda        834 83612.0     0.33
    1891   gnome-shell      R 252 0   vda       1379 19792.0     0.15
    7515   Xorg             R 252 0   vda        280  9940.0     0.28
    7579   llvmpipe-1       R 252 0   vda        228  6928.0     0.19
    9515   gnome-control-c  R 252 0   vda         62  6444.0     0.43
    8112   gnome-terminal-  R 252 0   vda         67  2572.0     1.54
    7807   gnome-software   R 252 0   vda         31  2336.0     0.73
    9578   awk              R 252 0   vda         17  2228.0     0.66
    7578   llvmpipe-0       R 252 0   vda        156  2204.0     0.07
    9581   pgrep            R 252 0   vda         58  1748.0     0.42
    7531   InputThread      R 252 0   vda         30  1200.0     0.48
    7504   gdbus            R 252 0   vda          3  1164.0     0.30
    1983   llvmpipe-1       R 252 0   vda         39   724.0     0.08
    1982   llvmpipe-0       R 252 0   vda         36   652.0     0.06
    ...

    biotop 출력에는 다음 필드가 표시됩니다.

    PID
    프로세스 ID입니다. (9568)
    COMM
    프로세스 이름입니다. (dd)
    DISK
    디스크가 읽기 작업을 수행합니다. (vda)
    I/O
    수행된 읽기 작업 수입니다. (16294)
    kbytes
    읽기 작업에서 도달한 K바이트 수입니다. (14,440,636)
    AVGms

    평균 읽기 작업의 I/O 시간입니다. (3.69)

    자세한 내용은 시스템의 /usr/share/bcc/tools/doc/biotop_example.txt 파일 및 dd(1) 매뉴얼 페이지를 참조하십시오.

22.5. xfsslower로 예기치 않은 느린 파일 시스템 작업 노출

xfsslower 는 읽기, 쓰기, 열기 또는 동기화 (fsync) 작업을 수행하는 XFS 파일 시스템에서 사용하는 시간을 측정합니다. 인수 1 은 프로그램이 1ms보다 느린 작업만 표시하도록 합니다.

프로세스

  1. 한 줄에서 xfsslower 프로그램을 실행합니다.

    # /usr/share/bcc/tools/xfsslower 1

    인수를 지정하지 않으면 xfsslower 가 기본적으로 10ms보다 느리게 작업을 표시합니다.

  2. 다른 명령줄에서 vim 을 사용하여 XFS 파일 시스템과의 상호 작용을 시작할 텍스트 파일을 생성합니다.

    $ vim text
    The command line running xfsslower shows something similar upon saving the file from the previous step:
    TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
    13:07:14 b'bash'        4754   R 256     0           7.11 b'vim'
    13:07:14 b'vim'         4754   R 832     0           4.03 b'libgpm.so.2.1.0'
    13:07:14 b'vim'         4754   R 32      20          1.04 b'libgpm.so.2.1.0'
    13:07:14 b'vim'         4754   R 1982    0           2.30 b'vimrc'
    13:07:14 b'vim'         4754   R 1393    0           2.52 b'getscriptPlugin.vim'
    13:07:45 b'vim'         4754   S 0       0           6.71 b'text'
    13:07:45 b'pool'        2588   R 16      0           5.58 b'text’
    ...

    각 행은 파일 시스템의 작업을 나타내며 특정 임계값보다 많은 시간이 걸렸습니다. xfsslower 는 예기치 않은 느린 작업 형태를 취할 수 있는 가능한 파일 시스템 문제를 감지합니다. xfsslower 출력에는 다음 필드가 표시됩니다.

    COMM
    프로세스 이름입니다. (b'bash')
    T

    작업 유형입니다. (R)

    • Read
    • w rite
    • O
    • s ync
    OFF_KB
    KB의 파일 오프셋입니다. (0)
    파일 이름

    읽기, 쓰기 또는 동기화된 파일입니다.

    자세한 내용은 시스템의 /usr/share/bcc/tools/doc/xfsslower_example.txt 파일과 fsync(2) 매뉴얼 페이지를 참조하십시오.

23장. CPU 사용률을 최적화하도록 운영 체제 구성

워크로드 전체에서 CPU 사용률을 최적화하도록 운영 체제를 구성할 수 있습니다.

23.1. 프로세서 문제 모니터링 및 진단 툴

다음은 Red Hat Enterprise Linux에서 프로세서 관련 성능 문제를 모니터링하고 진단하는 데 사용할 수 있는 툴입니다.

  • numactl 유틸리티는 프로세서 및 메모리 선호도를 관리하는 다양한 옵션을 제공합니다. numactl 패키지에는 커널에서 지원하는 NUMA 정책에 간단한 프로그래밍 인터페이스를 제공하는 libnuma 라이브러리가 포함되어 있으며 numactl 애플리케이션보다 세분화된 튜닝에 사용할 수 있습니다.
  • numad 는 자동 NUMA 선호도 관리 데몬입니다. 시스템 내에서 NUMA 토폴로지 및 리소스 사용량을 모니터링하여 NUMA 리소스 할당 및 관리를 동적으로 개선합니다.
  • numastat 툴은 운영 체제 및 해당 프로세스에 대한 노드 메모리 통계를 표시하고, 관리자에게 프로세스 메모리가 시스템 전체에 분산되어 있는지 또는 특정 노드에 중앙 집중화되어 있는지 여부를 보여줍니다. 이 툴은 numactl 패키지에서 제공합니다.
  • pqos 유틸리티는 intel-cmt-cat 패키지에서 사용할 수 있습니다. 최근 Intel 프로세서의 CPU 캐시 및 메모리 대역폭을 모니터링합니다. 다음과 같은 유형의 정보를 모니터링합니다.

    • 사이클당 지침 (IPC)
    • 마지막 수준 캐시의 수입니다.
    • LLC에서 프로그램이 지정된 CPU에서 실행하는 크기(KB)입니다.
    • 로컬 메모리로의 대역폭(MBL)
    • 원격 메모리로의 대역폭(MBR)
  • /proc/interrupts 파일에는 다음과 같은 유형의 정보가 표시됩니다.

    • 인터럽트 요청(IRQ) 번호
    • 시스템의 각 프로세서에서 처리하는 유사한 인터럽트 요청 수
    • 전송된 인터럽트 유형
    • 나열된 인터럽트 요청에 응답하는 쉼표로 구분된 장치 목록
  • taskset 툴은 util-linux 패키지에서 제공합니다. 관리자는 실행 중인 프로세스의 프로세서 선호도를 검색 및 설정하거나 지정된 프로세서 선호도로 프로세스를 시작할 수 있습니다.
  • Turbo stat 툴은 지정된 간격으로 카운터 결과를 출력하여 관리자가 과도한 전원 사용, 깊은 수면 상태가 입력되지 않거나 시스템 관리 인터럽트(SMI)가 불필요하게 생성되는 서버에서 예기치 않은 동작을 식별하는 데 도움이 됩니다.
  • x86_energy_perf_policy 툴을 사용하면 관리자가 성능과 에너지 효율성의 상대적 중요성을 정의할 수 있습니다. 이러한 특정 하드웨어 기능을 사용하여 성능 및 에너지 효율성의 균형을 유지하기 위해 지원되는 프로세서에 영향을 미칩니다.

23.2. 시스템 토폴로지 유형

최신 컴퓨팅에서 단일 CPU에 대한 개념은 대부분의 최신 시스템에 여러 프로세서가 있으므로 잘못된 CPU입니다. 시스템의 토폴로지는 이러한 프로세서가 서로 그리고 다른 시스템 리소스에 연결된 방법입니다.

이는 시스템 및 애플리케이션 성능과 시스템의 튜닝 고려 사항에 영향을 미칠 수 있습니다.

다음은 최신 컴퓨팅에서 사용되는 두 가지 주요 토폴로지 유형입니다.

대칭 SMP(Multi-Processor) 토폴로지
SMP 토폴로지를 사용하면 모든 프로세서가 동일한 시간 내에 메모리에 액세스할 수 있습니다. SMP 시스템에서 직렬화된 메모리 액세스는 더 이상 허용되지 않는 스케일링 제약 조건을 생성합니다. 따라서 거의 모든 최신 서버 시스템은 NUMA 시스템입니다.
NUMA(Non-Uniform Memory Access) 토폴로지

NUMA 토폴로지는 최근 SMP 토폴로지보다 더 최근에 개발되었습니다. NUMA 시스템에서 여러 프로세서는 물리적으로 소켓에 그룹화됩니다. 각 소켓에는 전용 메모리 영역이 있으며 해당 소켓의 프로세서는 이 메모리에 대한 로컬 액세스 권한을 갖습니다. 소켓, 해당 메모리 및 관련 프로세서가 함께 노드라고 하는 것을 형성합니다. 동일한 노드의 프로세서는 노드의 메모리 뱅크에 대한 고속 액세스와 다른 노드의 메모리 뱅크에 대한 액세스 속도가 느려집니다.

결과적으로 로컬이 아닌 메모리에 액세스할 때 성능이 저하됩니다. 따라서 NUMA 토폴로지가 있는 시스템의 성능에 민감한 애플리케이션은 로컬 메모리에 액세스해야 합니다. 또한 최적의 성능을 보장하기 위해 가능한 한 원격 메모리에 액세스하지 않아야 합니다.

성능에 민감한 다중 스레드 애플리케이션은 특정 프로세서가 아닌 특정 NUMA 노드에서 실행되도록 구성할 수 있습니다. 이것이 적합한지 여부는 시스템 및 애플리케이션의 요구 사항에 따라 달라집니다.

  • 여러 애플리케이션 스레드가 동일한 캐시된 데이터에 액세스하는 경우 동일한 프로세서에서 실행되도록 해당 스레드를 구성하는 것이 적합할 수 있습니다.
  • 다른 데이터에 액세스하고 캐시하는 여러 스레드가 동일한 프로세서에서 실행되는 경우 각 스레드는 이전 스레드에서 액세스하는 캐시된 데이터를 제거할 수 있습니다. 즉, 각 스레드가 캐시를 '허용하고 메모리에서 데이터를 가져와서 캐시에서 교체하는 실행 시간을 삭제합니다. perf 툴을 사용하여 과도한 수의 캐시 누락을 확인합니다.

23.3. 시스템 토폴로지 표시

여러 명령을 사용하여 시스템의 토폴로지를 이해할 수 있습니다.

프로세스

  • 시스템 토폴로지 개요를 표시하려면 다음을 수행합니다.

    $ numactl --hardware
    available: 4 nodes (0-3)
    node 0 cpus: 0 4 8 12 16 20 24 28 32 36
    node 0 size: 65415 MB
    node 0 free: 43971 MB
    [...]
  • CPU 아키텍처(예: CPU, 스레드, 코어, 소켓, NUMA 노드 수)에 대한 정보를 수집하려면 다음을 수행합니다.

    $ lscpu
    Architecture:          x86_64
    CPU op-mode(s):        32-bit, 64-bit
    Byte Order:            Little Endian
    CPU(s):                40
    On-line CPU(s) list:   0-39
    Thread(s) per core:    1
    Core(s) per socket:    10
    Socket(s):             4
    NUMA node(s):          4
    Vendor ID:             GenuineIntel
    CPU family:            6
    Model:                 47
    Model name:            Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
    Stepping:              2
    CPU MHz:               2394.204
    BogoMIPS:              4787.85
    Virtualization:        VT-x
    L1d cache:             32K
    L1i cache:             32K
    L2 cache:              256K
    L3 cache:              30720K
    NUMA node0 CPU(s):     0,4,8,12,16,20,24,28,32,36
    NUMA node1 CPU(s):     2,6,10,14,18,22,26,30,34,38
    NUMA node2 CPU(s):     1,5,9,13,17,21,25,29,33,37
    NUMA node3 CPU(s):     3,7,11,15,19,23,27,31,35,39
  • 시스템의 그래픽 표시를 보려면 다음을 수행합니다.

    # dnf install hwloc-gui
    # lstopo
    lstopo 출력
  • 자세한 텍스트 출력을 보려면 다음을 수행합니다.

    # dnf install hwloc
    # lstopo-no-graphics
    Machine (15GB)
      Package L#0 + L3 L#0 (8192KB)
        L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
            PU L#0 (P#0)
            PU L#1 (P#4)
           HostBridge L#0
        PCI 8086:5917
            GPU L#0 "renderD128"
            GPU L#1 "controlD64"
            GPU L#2 "card0"
        PCIBridge
            PCI 8086:24fd
              Net L#3 "wlp61s0"
        PCIBridge
            PCI 8086:f1a6
        PCI 8086:15d7
    Net L#4 "enp0s31f6"

23.4. 커널 눈금 시간 구성

기본적으로 RHEL은 틱리스 커널을 사용합니다. 유휴 CPU는 전원 사용량을 줄이고 새 프로세서가 깊은 수면 상태를 활용할 수 있도록 유휴 CPU를 중단하지 않습니다. RHEL은 고성능 컴퓨팅 또는 실시간 컴퓨팅과 같은 대기 시간에 민감한 워크로드에 유용한 동적 틱리스 옵션도 제공합니다. 기본적으로 동적 틱리스 옵션은 비활성화되어 있습니다. cpu-partitioning TuneD 프로필을 사용하여 isolated_cores 로 지정된 코어에 대해 동적 틱리스 옵션을 활성화할 수 있습니다.

프로세스

  1. 특정 코어에서 동적 틱리스 동작을 활성화하려면 nohz_full 매개변수를 사용하여 커널 명령줄에 해당 코어를 지정합니다. 예를 들어 16개의 코어 시스템에서 nohz_full=1-15 커널 옵션을 활성화합니다.

    # grubby --update-kernel=ALL --args="nohz_full=1-15"

    이를 통해 코어 1에서 15까지 동적 틱리스 동작을 모든 시간 보관을 유일하게 지정되지 않은 코어(코어 0)로 이동할 수 있습니다.

  2. 시스템이 부팅되면 rcu 스레드를 대기 시간에 민감한 코어(이 경우 core 0)로 수동으로 이동합니다.

    # for i in pgrep rcu[^c] ; do taskset -pc 0 $i ; done
  3. 선택 사항: 커널 명령줄에 isolcpus 매개변수를 사용하여 특정 코어를 사용자 공간 작업에서 분리합니다.
  4. 선택 사항: 커널의 나중 쓰기 bdi-flush 스레드의 CPU 선호도를 하우스키핑 코어로 설정합니다.

    echo 1 > /sys/bus/workqueue/devices/writeback/cpumask

검증

  • 시스템이 재부팅되면 dynticks 가 활성화되어 있는지 확인합니다.

    # journalctl -xe | grep dynticks
    Mar 15 18:34:54 rhel-server kernel: NO_HZ: Full dynticks CPUs: 1-15.
  • 동적 틱리스 구성이 올바르게 작동하는지 확인합니다.

    # perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 sleep 3

    이 명령은 CPU 1에서 3초 동안 유휴 상태가 되도록 지시하는 동안 틱을 측정합니다. 기본 커널 타이머 구성에는 일반 CPU에 약 3100개의 틱이 표시됩니다.

    # perf stat -C 0 -e irq_vectors:local_timer_entry taskset -c 0 sleep 3
     Performance counter stats for 'CPU(s) 0':
    
                 3,107      irq_vectors:local_timer_entry
    
      3.001342790 seconds time elapsed

    동적 틱리스 커널이 구성되면 대신 약 4개의 눈금이 표시됩니다.

    # perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 sleep 3
     Performance counter stats for 'CPU(s) 1':
    
                     4      irq_vectors:local_timer_entry
    
           3.001544078 seconds time elapsed

23.5. 인터럽트 요청 개요

인터럽트 요청(IRQ)은 하드웨어 조각에서 프로세서로 전송되는 즉각적인 주의를 위한 신호입니다. 시스템의 각 장치에는 하나 이상의 IRQ 번호가 할당되어 고유한 인터럽트를 보낼 수 있습니다.

활성화된 인터럽트를 사용하면 인터럽트 요청을 수신하는 프로세서가 인터럽트 요청을 수신하여 현재 애플리케이션 스레드의 실행을 일시 중지합니다.

인터럽트가 정상적인 작동을 중단하기 때문에 높은 인터럽트 속도가 시스템 성능이 저하될 수 있습니다. 인터럽트 선호도를 구성하거나 병합을 사용하여 우선순위가 낮은 인터럽트를 배치하여 인터럽트 오버헤드를 줄입니다.

인터럽트 요청에는 인터럽트 요청을 처리하는 프로세서를 정의하는 연결된 affnity 속성 smp_affinity 가 있습니다. 애플리케이션 성능을 개선하고 지정된 인터럽트 및 애플리케이션 스레드를 활성화하여 캐시 행을 공유하려면 다음을 수행하십시오.

  • 인터럽트 선호도를 할당합니다.
  • 동일한 코어의 동일한 프로세서 또는 프로세서에 대한 프로세스 선호도입니다.

지원되는 시스템에서 smp_affinity 를 수정하면 하드웨어 수준의 인터럽트 조작이 가능합니다. 하드웨어 경로는 커널 개입 없이 특정 프로세서로 인터럽트됩니다.

23.6. 수동으로 인터럽트 밸런싱

BIOS에서 NUMA(Non-Uniform Memory Access) 토폴로지를 내보내는 경우 irqbalance 는 요청 하드웨어에 로컬 노드에서 인터럽트 요청을 제공합니다.

프로세스

  1. 구성할 인터럽트 요청에 해당하는 장치를 확인합니다.
  2. 플랫폼의 하드웨어 사양을 찾습니다. 시스템의 칩셋이 인터럽트 배포를 지원하는지 확인합니다.

    • 칩셋이 배포를 지원하는 경우 다음 단계에 설명된 대로 인터럽트 전달을 구성할 수 있습니다. 또한 칩셋이 인터럽트의 균형을 조정하는 데 사용하는 알고리즘을 확인합니다. 일부 BIOS에는 인터럽트 전달을 구성할 수 있는 옵션이 있습니다.
    • 칩셋이 배포를 지원하지 않는 경우, 칩셋은 항상 모든 인터럽트를 단일 정적 CPU로 라우팅합니다. 사용 중인 CPU를 구성할 수 없습니다.
  3. 시스템에서 사용 중인 Advanced Programmable Interrupt Controller (APIC) 모드를 확인합니다.

    $ journalctl --dmesg | grep APIC
    • 시스템이 flat 이외의 모드를 사용하는 경우 APIC 라우팅 설정 과 유사한 행을 볼 수 있습니다.
    • 이러한 메시지가 표시되지 않으면 시스템은 플랫 모드를 사용합니다.
    • 시스템에서 x2apic 모드를 사용하는 경우 부트로더 구성에서 nox2apic 옵션을 커널 명령줄에 추가하여 비활성화할 수 있습니다.

      물리적이 아닌 플랫 모드(flat)만 인터럽트를 여러 CPU에 분산할 수 있습니다. 이 모드는 CPU가 8개 이상인 시스템에서만 사용할 수 있습니다.

  4. smp_affinity mask를 계산합니다. smp_affinity 마스크 계산 방법에 대한 자세한 내용은 smp_affinity mask 설정을 참조하십시오.

23.7. smp_affinity mask 설정

smp_affinity 값은 시스템의 모든 프로세서를 나타내는 16진수 비트 마스크로 저장됩니다. 각 비트는 다른 CPU를 구성합니다. 최소 유효 비트는 CPU 0입니다. 마스크의 기본값은 f 입니다. 즉, 인터럽트 요청은 시스템의 모든 프로세서에서 처리될 수 있습니다.

이 값을 1 로 설정하면 프로세서 0 만 인터럽트를 처리할 수 있습니다.

프로세스

  1. 바이너리에서 인터럽트를 처리하는 CPU에 1 값을 사용합니다. 예를 들어 CPU 0 및 CPU 7 을 설정하여 인터럽트를 처리하려면 0000000010000001 을 바이너리 코드로 사용합니다.

    Expand
    표 23.1. CPU용 바이너리 비트

    CPU

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

    바이너리

    0

    0

    0

    0

    0

    0

    0

    0

    1

    0

    0

    0

    0

    0

    0

    1

  2. 바이너리 코드를 16진수로 변환합니다.

    예를 들어 Python을 사용하여 바이너리 코드를 변환하려면 다음을 수행합니다.

    >>> hex(int('0000000010000001', 2))
    
    '0x81'

    32개 이상의 프로세서가 있는 시스템에서는 개별 32비트 그룹에 대해 smp_affinity 값을 분리해야 합니다. 예를 들어 64 프로세서 시스템의 처음 32 프로세서만 인터럽트 요청을 서비스하려면 0xffffffffffffff 0000 을 사용합니다.

  3. 특정 인터럽트 요청에 대한 인터럽트 선호도 값은 연결된 /proc/irq/irq_number/smp_affinity 파일에 저장됩니다. 이 파일에서 smp_affinity 마스크를 설정합니다.

    # echo mask > /proc/irq/irq_number/smp_affinity

24장. tuna 인터페이스를 사용하여 시스템 검토

tuna 툴은 튜닝 작업 수행의 복잡성을 줄입니다. tuna 를 사용하여 스케줄러 튜닝 가능 항목 매개변수를 조정하고 스레드 우선 순위, IRQ 처리기를 조정하며 CPU 코어와 소켓을 분리할 수 있습니다. tuna 를 사용하면 다음 작업을 수행할 수 있습니다.

  • 시스템의 CPU를 나열합니다.
  • 시스템에서 현재 실행 중인 인터럽트 요청(IRQ)을 나열합니다.
  • 스레드에 대한 정책 및 우선 순위 정보를 변경합니다.
  • 시스템의 현재 정책 및 우선 순위를 표시합니다.

24.1. tuna 툴 설치

tuna 툴은 실행 중인 시스템에서 사용하도록 설계되었습니다. 애플리케이션별 측정 툴은 변경 후 즉시 시스템 성능을 분석하기 시작할 수 있습니다.

프로세스

  • tuna 툴을 설치합니다.

    # dnf install tuna

검증

  • 사용 가능한 tuna CLI 옵션을 표시합니다.

    # tuna -h

    자세한 내용은 시스템의 tuna(8) 도움말 페이지를 참조하십시오.

24.2. tuna 툴을 사용하여 시스템 상태 보기

tuna CLI(명령줄 인터페이스) 툴을 사용하여 시스템 상태를 볼 수 있습니다.

사전 요구 사항

  • tuna 툴이 설치되어 있습니다. 자세한 내용은 tuna 툴 설치를 참조하십시오.

프로세스

  1. 현재 정책 및 우선 순위를 확인합니다.

    # tuna show_threads
    pid   SCHED_ rtpri affinity             cmd
    1      OTHER     0      0,1            init
    2       FIFO    99        0     migration/0
    3      OTHER     0        0     ksoftirqd/0
    4       FIFO    99        0      watchdog/0
  2. 또는 PID에 해당하거나 명령 이름과 일치하는 특정 스레드를 확인합니다.

    # tuna show_threads -t pid_or_cmd_list

    pid_or_cmd_list 인수는 쉼표로 구분된 PID 또는 명령 이름 패턴 목록입니다.

  3. 시나리오에 따라 다음 작업 중 하나를 수행합니다.

  4. 변경된 구성을 저장합니다.

    # tuna save filename

    이 명령은 현재 실행 중인 커널 스레드만 저장합니다. 실행 중이 아닌 프로세스는 저장되지 않습니다.

24.3. tuna 툴을 사용하여 CPU 튜닝

tuna 명령은 개별 CPU를 관리할 수 있습니다. tuna 툴을 사용하면 다음 작업을 수행할 수 있습니다.

CPU 분리
지정된 CPU에서 실행되는 모든 작업은 사용 가능한 다음 CPU로 이동합니다. CPU를 격리하면 모든 스레드의 선호도 마스크에서 이 CPU를 제거할 수 없습니다.
CPU 포함
지정된 CPU에서 작업을 실행할 수 있습니다.
CPU 복원
지정된 CPU를 이전 구성으로 복원합니다.

사전 요구 사항

  • tuna 툴이 설치되어 있습니다. 자세한 내용은 tuna 툴 설치를 참조하십시오.

프로세스

  1. 현재 실행 중인 모든 프로세스를 나열합니다.

    # ps ax | awk 'BEGIN { ORS="," }{ print $1 }'
    PID,1,2,3,4,5,6,8,10,11,12,13,14,15,16,17,19
  2. tuna 인터페이스에서 스레드 목록을 표시합니다.

    # tuna show_threads -t 'thread_list from above cmd'
  3. 시나리오에 따라 다음 작업 중 하나를 사용하여 프로세스의 CPU 선호도를 관리합니다.

    # tuna [command] --cpus cpu_list
    • cpu_list 인수는 쉼표로 구분된 CPU 번호 목록입니다(예: --cpus 0,2 ).
    • 현재 cpu_list 에 특정 CPU를 추가하려면 (예: --cpus +0 )를 사용합니다.
  4. 시나리오에 따라 다음 작업 중 하나를 수행합니다.

    1. CPU를 분리하려면 다음을 입력합니다.

      # tuna isolate --cpus cpu_list
    2. CPU를 포함하려면 다음을 입력합니다.

      # tuna include --cpus cpu_list
  5. 4개 이상의 프로세서가 있는 시스템을 사용하려면 모든 ssh 스레드가 CPU 01 과 CPU 23 에서 모든 http 스레드에서 실행되도록 합니다.

    # tuna move --cpus 0,1 -t ssh*
    # tuna move --cpus 2,3 -t http\*

검증

  • 현재 구성을 표시하여 적용된 변경 사항을 확인합니다.

    # tuna show_threads -t ssh*
    pid   SCHED_  rtpri  affinity   voluntary   nonvoluntary   cmd
    855   OTHER   0      0,1        23           15            sshd
    # tuna show_threads -t http\*
    pid   SCHED_  rtpri  affinity   voluntary   nonvoluntary   cmd
    855   OTHER   0       2,3        23           15           http

    자세한 내용은 시스템의 /proc/cpuinfo 파일 및 tuna(8) 도움말 페이지를 참조하십시오.

24.4. tuna 툴을 사용하여 IRQ 조정

/proc/interrupts 파일은 인터럽트 유형 및 장치 이름을 포함하여 IRQ당 인터럽트 수를 중지합니다.

사전 요구 사항

  • tuna 툴이 설치되어 있습니다. 자세한 내용은 tuna 툴 설치를 참조하십시오.

프로세스

  1. 현재 IRQ 및 해당 선호도를 확인합니다.

    # tuna show_irqs
    # users            affinity
    0 timer                   0
    1 i8042                   0
    7 parport0                0
  2. 명령의 영향을 받을 IRQ 목록을 지정합니다.

    # tuna <command> --irqs irq_list --cpus cpu_list
    • irq_list 인수는 쉼표로 구분된 IRQ 번호 또는 사용자 이름 패턴 목록입니다.
    • &lt ;command&gt;를 (예: --spread )로 바꿉니다.
  3. 인터럽트를 지정된 CPU로 이동합니다.

    # tuna show_irqs --irqs <128>
    users            affinity
    128 iwlwifi           0,1,2,3
    # tuna move --irqs 128 --cpus 3
    • 128irq_list 인수로 바꾸고 3cpu_list 인수로 바꿉니다.
    • cpu_list 인수는 쉼표로 구분된 CPU 번호 목록입니다(예: --cpus 0,2 ). 자세한 내용은 tuna 툴을 사용하여 CPU 튜닝을 참조하십시오.

검증

  • 인터럽트를 지정된 CPU로 이동하기 전후에 선택한 IRQ의 상태를 비교합니다.

    # tuna show_irqs --irqs 128
         users            affinity
     128 iwlwifi                 3

    자세한 내용은 시스템의 /proc/interrupts 파일 및 tuna(8) 도움말 페이지를 참조하십시오.

25장. 메모리 액세스를 최적화하도록 운영 체제 구성

RHEL에 포함된 툴을 사용하여 워크로드 전체에서 메모리 액세스를 최적화하도록 운영 체제를 구성할 수 있습니다.

25.1. 시스템 메모리 문제 모니터링 및 진단 툴

시스템 성능을 모니터링하고 시스템 메모리와 관련된 성능 문제를 진단하기 위해 Red Hat Enterprise Linux에서 다음 툴을 사용할 수 있습니다.

  • procps-ng 패키지에 포함된 vmstat 툴은 시스템의 프로세스, 메모리, 페이징, 블록 I/O, 트랩, 디스크 및 CPU 활동에 대한 보고서를 표시합니다. 머신이 마지막으로 설정된 시점 또는 이전 보고서 이후의 이벤트 평균을 표시하는 인스턴트 보고서를 생성합니다.
  • valgrind 프레임워크는 사용자 공간 바이너리에 계측을 제공합니다. 이 프레임워크에는 다음과 같은 프로그램 성능을 프로파일링 및 분석하는 데 사용할 수 있는 여러 도구가 포함되어 있습니다.

    • memcheck 툴은 valgrind 의 기본 툴입니다. 다음과 같이 탐지 및 진단하기 어려울 수 있는 여러 메모리 오류를 감지하고 보고합니다.

      • 잘못된 메모리 액세스
      • 정의되지 않았거나 초기화되지 않은 값 사용
      • 잘못 해제된 힙 메모리
      • 포인터 중복(Buffer overlap)
      • 메모리 누수

        참고

        memcheck 는 이러한 오류만 보고할 수 있으며 이를 방지할 수 없습니다. 그러나 memcheck 는 오류가 발생하기 직전에 오류 메시지를 기록합니다.

    • cachegrind 툴은 애플리케이션이 시스템의 캐시 계층 구조 및 분기 예측자와 상호 작용하는 방법을 시뮬레이션합니다. 애플리케이션 실행 기간에 대한 통계를 수집하고 콘솔에 요약을 표시합니다.
    • volume if 툴은 지정된 애플리케이션에서 사용하는 힙 공간을 측정합니다. 이는 유용한 공간과 예약 유지 및 정렬을 위해 할당된 추가 공간을 모두 측정합니다.

      자세한 내용은 시스템의 /usr/share/doc/valgrind-version/valgrind_manual.pdf 파일 및 vmstat(8)valgrind(1) 매뉴얼 페이지를 참조하십시오.

25.2. 시스템 메모리 개요

Linux 커널은 시스템 메모리(RAM)의 리소스 사용을 극대화하도록 설계되었습니다. 이러한 설계 특성으로 인해 커널 작업은 워크로드에 대부분의 시스템 메모리를 사용하지만 약간의 여유를 남겨 둡니다.

이 사용 가능한 메모리는 특수 시스템 할당 및 기타 낮거나 높은 우선 순위 시스템 서비스를 위해 예약되어 있습니다. 나머지 시스템 메모리는 워크로드 자체에 전용되며 다음 두 가지 범주로 나뉩니다.

파일 메모리

이 카테고리에 추가된 페이지는 영구 스토리지의 파일 일부를 나타냅니다. 페이지 캐시의 이러한 페이지는 애플리케이션의 주소 공간에 매핑되거나 매핑 해제될 수 있습니다. 애플리케이션은 mmap 시스템 호출을 사용하여 주소 공간에 파일을 매핑하거나 버퍼링된 I/O 읽기 또는 쓰기 시스템 호출을 사용하여 파일에서 작동할 수 있습니다.

페이지를 직접 매핑하는 애플리케이션뿐만 아니라 버퍼링된 I/O 시스템 호출은 매핑되지 않은 페이지를 다시 사용할 수 있습니다. 결과적으로 커널은 이러한 페이지를 캐시하여 특히 메모리 사용량이 낮은 기간에 반복되고 느린 I/O 작업을 방지합니다.

익명 메모리
이러한 페이지는 동적 프로세스에서 사용하거나 영구 스토리지에 관련 파일이 없습니다. 이러한 페이지는 애플리케이션 스택 및 힙과 같은 각 작업의 메모리 내 제어 구조를 백업합니다.
메모리 사용 패턴

25.3. 가상 메모리 매개변수

가상 메모리 매개변수는 /proc/sys/vm 디렉터리에 나열됩니다.

다음은 사용 가능한 가상 메모리 매개변수입니다.

vm.dirty_ratio
백분율 값입니다. 전체 시스템 메모리의 이 백분율이 수정되면 시스템에 디스크 수정 쓰기가 시작됩니다. 기본값은 20%입니다.
vm.dirty_background_ratio
백분율 값입니다. 전체 시스템 메모리의 이 백분율이 수정되면 시스템에서 백그라운드에서 디스크에 수정 사항 쓰기를 시작합니다. 기본값은 10%입니다.
vm.overcommit_memory
대규모 메모리 요청이 수락 또는 거부되는지 여부를 결정하는 조건을 정의합니다. 기본값은 0입니다. 커널은 사용 가능한 총 RAM 및 스왑을 기반으로 메모리 요청을 부여하여 대규모 할당만 거부합니다. 그렇지 않으면 가상 메모리 할당이 부여되고 메모리 과다 할당을 허용할 수 있습니다.
overcommit_memory 매개변수의 값 설정
  • 1로 설정하면 커널이 메모리 과다 할당 처리를 수행하지 않습니다. 이렇게 하면 메모리 과부하 가능성이 높지만 메모리 집약적인 작업의 성능이 향상됩니다.
  • 2로 설정하면 커널은 총 스왑과 overcommit_ratio 에 정의된 RAM 백분율을 초과하는 할당을 거부합니다. 이 설정은 메모리 과다 할당 위험을 줄입니다. 스왑 파티션이 물리적 메모리보다 큰 시스템에만 이 값을 사용합니다.
vm.overcommit_ratio
overcommit_memory 가 2로 설정될 때 고려되는 물리적 RAM의 백분율을 지정합니다. 기본값은 50입니다.
vm.max_map_count
프로세스에서 사용할 수 있는 최대 메모리 맵 영역 수를 정의합니다. 기본값은 65530입니다. 애플리케이션에 더 많은 메모리 맵 영역이 필요한 경우 이 값을 늘립니다.
vm.min_free_kbytes
예약된 여유 페이지 풀의 크기를 설정합니다. 또한 min_page,low_pagehigh_page 임계값을 설정해야 합니다. 이러한 임계값은 Linux 커널의 페이지 회수 알고리즘의 동작을 제어합니다. 또한 시스템에서 사용 가능한 최소 킬로바이트 수를 유지하도록 지정합니다. 이렇게 하면 각 낮은 메모리 영역에 대한 특정 값이 계산됩니다. 각 영역에는 크기와 비례하여 여러 개의 예약된 사용 가능한 페이지가 할당됩니다.
vm.min_free_kbytes 매개변수의 값 설정
  • 매개변수 값을 늘리면 애플리케이션 작업 세트 사용 가능한 메모리가 효과적으로 줄어듭니다. 따라서 atomic 컨텍스트에서 드라이버 버퍼를 할당해야 하는 커널 기반 워크로드에만 사용할 수 있습니다.
  • 매개 변수 값을 줄이면 시스템에서 메모리가 크게 조정되면 커널에서 시스템 요청을 서비스할 수 없게 될 수 있습니다.

    주의

    극단적인 값은 시스템 성능에 영향을 미칠 수 있습니다. vm.min_free_kbytes 를 매우 낮은 값으로 설정하면 시스템이 메모리를 효과적으로 회수할 수 없습니다. 이로 인해 시스템 충돌 및 서비스 중단 또는 기타 커널 서비스가 실패할 수 있습니다. 그러나 vm.min_free_kbytes 를 너무 높게 설정하면 시스템 회수 활동이 크게 증가하여 false 직접 회수 상태로 인해 할당 대기 시간이 발생합니다. 이로 인해 시스템이 메모리 부족 상태가 될 수 있습니다. vm.min_free_kbytes 매개변수는 min_pages 라는 페이지 회수 워터마크도 설정합니다. 이 워터마크는 페이지 회수 알고리즘을 관리하는 두 개의 다른 메모리 워터마크, low_pageshigh_pages 를 결정할 때 요인으로 사용됩니다.

  • /proc/PID/oom_adj 이벤트에서 시스템이 메모리 부족하고 panic_on_oom 매개변수가 0으로 설정된 경우 oom_killer 함수는 시스템을 복구할 때까지 가장 높은 oom_score 프로세스부터 프로세스를 종료합니다. oom_adj 매개변수는 프로세스의 oom_score 를 결정합니다. 이 매개변수는 프로세스 ID별로 설정됩니다. 값 -17 은 해당 프로세스의 oom_killer 를 비활성화합니다. 기타 유효한 값의 범위는 -16 에서 15 사이입니다.

    참고

    조정된 프로세스에서 생성한 프로세스는 해당 프로세스의 oom_score 를 상속합니다.

vm.swappiness
0에서 200 사이의 swappiness 값은 시스템이 익명 페이지 또는 페이지 캐시에서 메모리 회수 우선 순위를 지정하는지 여부를 제어합니다.
swappiness 매개변수의 값 설정
  • 값이 클수록 file-mapped driven workloads를 선호하고 덜 적극적으로 액세스하지 않는 프로세스의 익명 매핑된 메모리를 스왑 아웃합니다. 파일 서버 및 스트리밍 애플리케이션은 이를 사용하여 데이터를 메모리에 유지하여 I/O 대기 시간을 줄입니다.
  • 낮은 값은 페이지 캐시(파일 매핑된 메모리)를 회수하는 동안 익명 매핑 기반 워크로드를 선호합니다. 이 설정은 파일 시스템 정보에 크게 의존하지 않고 동적으로 할당된 개인 메모리를 사용하는 애플리케이션에 유용합니다. 예를 들면 수학적 및 번호 검사 애플리케이션 및 QEMU 와 같은 일부 하드웨어 가상화 감독자가 있습니다. vm.swappiness 매개변수의 기본값은 60입니다.

    주의

    vm.swappiness 를 0으로 설정하면 익명 메모리를 디스크로 스와핑하지 않습니다. 이렇게 하면 oom_killer 함수가 메모리 또는 I/O 집약적인 워크로드 중에 프로세스를 종료할 가능성이 높아집니다.

25.4. 파일 시스템 매개변수

파일 시스템 매개변수는 /proc/sys/fs 디렉터리에 나열됩니다. 다음은 사용 가능한 파일 시스템 매개변수입니다.

aio-max-nr
모든 활성 비동기 입력/출력 컨텍스트에서 허용되는 최대 이벤트 수를 정의합니다. 기본값은 65536이며 이 값을 수정해도 커널 데이터 구조의 크기를 사전 할당하거나 조정하지 않습니다.
file-max

전체 시스템에 대한 최대 파일 처리 수를 결정합니다. Red Hat Enterprise Linux 10에서 기본값은 9223372036854775807 입니다.

참고

기본값은 systemd 에 의해 설정되며 구성 가능한 최대값에 해당합니다.

25.5. 커널 매개변수

커널 매개 변수의 기본값은 /proc/sys/kernel/ 디렉터리에 있습니다. 커널에서 제공하는 기본값 또는 sysctl을 사용하여 사용자가 지정한 값으로 설정됩니다. 다음 커널 매개변수는 msg* 및 shm* System V IPC(sysvipc) 시스템 호출에 대한 제한을 구성합니다.

msgmax
메시지 큐에서 단일 메시지의 최대 허용된 크기(바이트)를 정의합니다. 이 값은 큐 크기(msgmnb)를 초과해서는 안 됩니다. sysctl kernel.msgmax 명령을 사용하여 시스템의 현재 msgmax 값을 확인합니다.
msgmnb
단일 메시지 큐의 최대 크기(바이트)를 정의합니다. sysctl msgmnb 명령을 사용하여 시스템에서 현재 msgmnb 값을 확인합니다.
msgmni
최대 메시지 큐 식별자 수를 정의하므로 최대 대기열 수를 정의합니다. sysctl kernel.msgmni 명령을 사용하여 시스템의 현재 msgmni 값을 확인합니다.
Shmall
시스템에서 동시에 사용할 수 있는 공유 메모리 페이지의 총 양을 정의합니다. 예를 들어, 페이지는 AMD64 및 Intel 64 아키텍처의 4096바이트입니다. sysctl kernel.shmall 명령을 사용하여 시스템의 현재 shmall 값을 확인합니다.
shmmax
커널에서 허용하는 단일 공유 메모리 세그먼트의 최대 크기(바이트)를 정의합니다. 이제 최대 1Gb의 공유 메모리 세그먼트가 커널에서 지원됩니다. sysctl kernel.shmmax 명령을 사용하여 시스템의 현재 shmmax 값을 확인합니다.
shmmni
시스템 전체 공유 메모리 세그먼트 수를 정의합니다. 기본값은 모든 시스템에서 4096입니다.

26장. SystemTap 시작하기

시스템 관리자는 SystemTap을 사용하여 RHEL(Red Hat Enterprise Linux) 시스템의 버그 또는 성능 문제의 근본적인 원인을 식별합니다. 애플리케이션 개발자는 SystemTap을 사용하여 RHEL 환경 내에서 애플리케이션의 동작을 면밀히 모니터링하고 분석할 수 있습니다.

26.1. SystemTap의 목적

SystemTap은 추적 및 검사를 통해 운영 체제 및 커널 활동을 세부적으로 모니터링합니다. SystemTap은 netstat,ps,topiostat 와 같은 툴 출력과 유사한 정보를 제공합니다. 그러나 SystemTap은 수집된 정보에 대한 더 많은 필터링 및 분석 옵션을 제공합니다.

SystemTap 스크립트에서 SystemTap이 수집하는 정보를 지정합니다.

SystemTap은 커널 활동을 추적하여 Linux 모니터링 툴을 다음 두 가지 기본 특성으로 보완합니다.

유연성
SystemTap 스크립트를 개발하여 커널 함수, 시스템 호출 및 기타 커널 공간 이벤트를 모니터링합니다. 이로 인해 SystemTap이 단순한 도구가 아니라 자체 커널별 포렌식 및 모니터링 툴을 개발하기 위한 시스템입니다.
사용 편의성
SystemTap을 사용하면 커널을 다시 컴파일하거나 시스템을 재부팅하지 않고도 커널 활동을 모니터링할 수 있습니다.

26.2. SystemTap 설치

SystemTap 사용을 시작하려면 필요한 패키지를 설치합니다. 여러 커널에서 SystemTap을 사용하려면 각 버전에 대해 일치하는 커널 패키지를 설치합니다.

프로세스

  1. 필요한 SystemTap 패키지를 설치합니다.

    # dnf install systemtap
  2. 필요한 커널 패키지를 설치합니다.

    • stap-prep 사용:

      # stap-prep
    • stap-prep 이 작동하지 않는 경우 필요한 커널 패키지를 수동으로 설치합니다.

      # dnf install kernel-debuginfo-$(uname -r) kernel-debuginfo-common-$(uname -m)-$(uname -r) kernel-devel-$(uname -r)

      $(uname -m) 는 자동으로 시스템의 하드웨어 플랫폼으로 교체되고 $(uname -r) 은 실행 중인 커널 버전으로 자동 교체됩니다.

검증

  • SystemTap으로 검색할 커널이 현재 사용 중인 경우 설치에 성공했는지 테스트합니다.

    # stap -v -e 'probe kernel.function("vfs_read") {printf("read performed\n"); exit()}'

    SystemTap 배포에 성공하려면 다음과 유사한 출력이 표시됩니다.

    Pass 1: parsed user script and 45 library script(s) in 340usr/0sys/358real ms.
    Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) in 290usr/260sys/568real ms.
    Pass 3: translated to C into "/tmp/stapiArgLX/stap_e5886fa50499994e6a87aacdc43cd392_399.c" in 490usr/430sys/938real ms.
    Pass 4: compiled C into "stap_e5886fa50499994e6a87aacdc43cd392_399.ko" in 3310usr/430sys/3714real ms.
    Pass 5: starting run.
    read performed
    Pass 5: run completed in 10usr/40sys/73real ms.

    다음과 같습니다.

  • 5: starting run 은 SystemTap이 커널을 프로브하고 계측을 실행하는 장치를 성공적으로 생성했음을 나타냅니다.
  • Read performed 는 SystemTap이 지정된 이벤트(이 예에서 VFS 읽기)를 감지했음을 나타냅니다.
  • 5 패스: 완료된 < time > ms 를 실행하면 SystemTap이 유효한 처리기를 실행했음을 나타냅니다. 텍스트가 표시되고 오류 없이 닫힙니다.

26.3. SystemTap을 실행할 수 있는 권한

SystemTap 스크립트를 실행하려면 승격된 시스템 권한이 필요하지만 권한이 없는 사용자는 시스템에서 SystemTap 계측을 실행해야 할 수 있습니다.

사용자가 root 액세스 권한 없이 SystemTap 스크립트를 빌드하고 실행할 수 있도록 하려면 다음 두 사용자 그룹에 사용자를 추가합니다.

stapdev
이 그룹의 멤버는 stap 을 사용하여 SystemTap 스크립트를 실행하거나 staprun 을 사용하여 SystemTap 계측 모듈을 실행할 수 있습니다. stap 을 실행하려면 SystemTap 스크립트를 커널 모듈로 컴파일하고 커널에 로드해야 합니다. 이를 위해서는 stapdev 멤버에 부여된 시스템에 대한 승격된 권한이 필요합니다. 이러한 권한은 stapdev 멤버에 대한 효과적인 root 액세스 권한도 부여합니다. root 액세스 권한으로 신뢰할 수 있는 사용자에게만 stapdev 그룹 멤버십을 부여합니다.
stapusr
이 그룹의 멤버는 staprun 만 사용하여 SystemTap 계측 모듈을 실행할 수 있습니다. 또한 이러한 모듈은 /lib/modules/ <kernel_version> /systemtap/ 디렉토리에서만 실행할 수 있습니다. 이 디렉터리는 root 사용자만 소유하고 쓸 수 있어야 합니다.

26.4. SystemTap 스크립트 실행

표준 입력 또는 파일에서 SystemTap 스크립트를 실행할 수 있습니다. Sample SystemTap 스크립트 또는 /usr/share/systemtap/examples 디렉터리에 SystemTap 설치와 함께 배포되는 샘플 스크립트를 찾습니다.

사전 요구 사항

  • SystemTap 및 필요한 커널 패키지는 Systemtap 설치에 설명된 대로 설치됩니다.
  • 일반 사용자로 SystemTap 스크립트를 실행하려면 사용자를 SystemTap 그룹에 추가합니다.

    # usermod --append --groups
    stapdev,stapusr <user_name>

프로세스

  • SystemTap 스크립트를 실행합니다.

    • 표준 입력에서:

      # stap -e "probe timer.s(1) {exit()}"
    • 파일에서 다음을 수행합니다.

      # stap <file_name>.stp

26.5. SystemTap 스크립트 샘플

SystemTap 설치와 함께 배포되는 샘플 스크립트는 /usr/share/systemtap/examples 디렉터리에서 찾을 수 있습니다.

stap 명령을 사용하여 다른 SystemTap 스크립트를 실행합니다.

함수 호출 추적

para-callgraph.stp SystemTap 스크립트를 사용하여 함수 호출 및 함수 반환을 추적할 수 있습니다.

# stap para-callgraph.stp <argument1 argument2>

이 스크립트는 두 가지 명령줄 인수를 사용합니다.

  • 추적 중인 항목/exit인 함수의 이름입니다.
  • 스레드별로 추적을 활성화하거나 비활성화하는 선택적 트리거 기능입니다.

    트리거 함수가 종료되지 않은 한 각 스레드에서 추적은 계속됩니다.

폴링 애플리케이션 모니터링

timeout.stp SystemTap 스크립트를 사용하여 폴링 중인 애플리케이션을 식별하고 모니터링할 수 있습니다. 이를 알고 있으면 불필요하거나 과도한 폴링을 추적할 수 있습니다. CPU 사용량 및 전력 절감 측면에서 개선을 위해 영역을 정확하게 파악하는 데 도움이 될 수 있습니다.

# stap timeout.stp

이 스크립트는 각 애플리케이션이 폴링 을 사용하는 횟수를 추적하고 ,epoll,itimer,futex,nanosleep 및 Cryostat 시스템 호출을선택합니다.

프로세스당 시스템 호출 볼륨 추적

syscalls_by_proc.stp SystemTap 스크립트를 사용하여 시스템 호출의 가장 많은 볼륨을 수행하는 프로세스를 확인할 수 있습니다. 기본적으로 상위 20개의 프로세스를 표시합니다.

# stap syscalls_by_proc.stp
네트워크 소켓 코드에서 호출되는 추적 함수

socket-trace.stp SystemTap 스크립트를 사용하여 커널의 net/socket.c 파일에서 호출된 함수를 추적할 수 있습니다. 이렇게 하면 각 프로세스가 커널 수준에서 네트워크와 상호 작용하는 방법을 자세히 확인할 수 있습니다.

# stap socket-trace.stp
각 파일 읽기 또는 쓰기에 대한 I/O 시간 추적

iotime.stp SystemTap 스크립트를 사용하여 각 프로세스에서 파일을 읽거나 쓰는 데 걸리는 시간을 모니터링합니다. 이렇게 하면 시스템에서 로드하는 속도가 느린 파일을 결정하는 데 도움이 됩니다.

# stap iotime.stp
IRQ 및 작업의 사이클을 훔치는 프로세스 추적

cycle_thief.stp SystemTap 스크립트를 사용하여 작업이 실행되는 시간과 실행되지 않는 시간을 추적합니다. 이를 통해 작업에서 사이클을 훔치는 프로세스를 식별하는 데 도움이 됩니다.

# stap cycle_thief.stp -x pid

자세한 내용은 /usr/share/systemtap/examples 디렉터리를 참조하십시오.

참고

SystemTap 스크립트에 대한 자세한 예제와 정보는 /usr/share/systemtap/examples/index.html 파일에서 확인할 수 있습니다. 웹 브라우저에서 열어 사용 가능한 모든 스크립트 및 해당 설명을 확인합니다.

26.6. SystemTap 교차 복원

교차 복원은 전체 소프트웨어 제품군 없이 다른 호스트에서 사용할 수 있도록 한 호스트에서 SystemTap 모듈을 빌드합니다. SystemTap 스크립트를 실행하면 커널 모듈이 해당 스크립트에서 빌드됩니다. 그런 다음 SystemTap은 모듈을 커널에 로드합니다.

일반적으로 SystemTap 스크립트는 SystemTap이 배포된 시스템에서만 실행할 수 있습니다. 10개의 시스템에서 SystemTap을 실행하려면 해당 모든 시스템에 SystemTap을 배포해야 합니다. 경우에 따라 이 방법이 불가능하거나 실용적이지 않을 수도 있습니다. 예를 들어 기업 정책은 컴파일러를 금지하거나 데이터를 디버그하는 것을 금지하여 모든 대상 시스템에서 표준 SystemTap 배포를 방지할 수 있습니다.

이 문제를 해결하려면 교차 복원을 사용하십시오. 교차 복원은 한 시스템의 SystemTap 스크립트에서 다른 시스템에서 사용할 SystemTap 계측 모듈을 생성하는 프로세스입니다. 이 프로세스는 다음과 같은 이점을 제공합니다.

  • 다양한 시스템의 커널 정보 패키지는 단일 호스트 시스템에 설치할 수 있습니다. 커널 패키징 버그로 인해 설치가 금지될 수 있습니다. 이러한 경우 호스트 시스템 및 대상 시스템의 kernel-debuginfokernel-devel 패키지가 일치해야 합니다. 버그가 발생하면 버그를 Red Hat JIRA에 보고합니다.
  • 각 대상 시스템은 생성된 SystemTap 계측 모듈인 systemtap-runtime 을 사용하기 위해 하나의 패키지만 설치해야 합니다. 계측 모듈에는 동일한 아키텍처 및 배포를 공유하려면 호스트 및 대상 시스템이 필요합니다.

    용어
  • 조정 모듈

    호스트에서 SystemTap 모듈을 빌드한 다음 대상 시스템의 커널에 로드합니다.

  • 호스트 시스템

    대상 시스템에 로드되도록 조정 모듈( SystemTap 스크립트에서)을 컴파일하는 시스템입니다.

  • 대상 시스템

    조정 모듈이 빌드되는 시스템( SystemTap 스크립트의)입니다.

  • 대상 커널

    대상 시스템의 커널입니다. 조정 모듈을 로드하고 실행하는 커널입니다.

26.7. SystemTap 간 복원 초기화

SystemTap 간 복원을 초기화하여 한 시스템에서 모듈을 빌드하고 전체 제품군이 없는 시스템에 배포합니다.

사전 요구 사항

  • SystemTap은 Systemtap 설치에 설명된 대로 호스트 시스템에 설치됩니다.
  • systemtap-runtime 패키지는 각 대상 시스템에 설치됩니다.

    # dnf install systemtap-runtime
  • 호스트와 대상 시스템은 모두 동일한 아키텍처입니다.
  • 호스트와 대상 시스템 모두 Red Hat Enterprise Linux의 동일한 주요 버전(예: Red Hat Enterprise Linux 10)을 실행하고 있습니다.

    중요

    커널 패키징 버그로 인해 여러 kernel-debuginfokernel-devel 패키지가 하나의 시스템에 설치되지 않을 수 있습니다. 이러한 경우 호스트 및 대상 시스템의 마이너 버전이 일치해야 합니다. 버그가 발생하면 Red Hat JIRA 에서 버그를 보고합니다.

프로세스

  1. 각 대상 시스템에서 실행 중인 커널을 확인합니다.

    $ uname -r
  2. 대상 시스템에 대해 이 단계를 반복합니다.
  3. 호스트 시스템에서 Systemtap 설치에 설명된 방법으로 각 대상 시스템의 대상 커널 및 관련 패키지를 설치합니다.
  4. 호스트 시스템에서 조정 모듈을 빌드하고, 이 모듈을 에 복사하여 대상 시스템에서 이 모듈을 실행합니다.

    1. 호스트 시스템에서 대상 시스템에 SSH 연결을 수행할 수 있는 경우 원격 구현을 사용합니다.

      # stap --remote <target_system> script

      이 작업이 성공하려면 호스트 시스템에서 대상 시스템에 대한 SSH 연결을 수행할 수 있는지 확인해야 합니다.

    2. 수동:

      1. 호스트 시스템에서 조정 모듈을 빌드합니다.

        # stap -r <kernel_version> script -m <module_name> -p 4

        여기서 < kernel_version >은 1단계에서 결정된 대상 커널의 버전입니다. script 는 조정 모듈로 변환할 스크립트이며 < module_name >은 조정 모듈의 이름을 지정합니다. -p4 옵션은 SystemTap에 컴파일된 모듈을 로드하지 않고 실행하도록 지시합니다.

      2. 계측 모듈이 컴파일되면 대상 시스템에 복사하고 다음 명령을 사용하여 로드합니다.

        # staprun <module_name>.ko

27장. 스케줄링 정책 튜닝

RHEL(Red Hat Enterprise Linux)에서 스레드는 프로세스 실행의 가장 작은 단위입니다. 시스템 스케줄러는 스레드를 실행하고 전체 시스템 사용률에 우선순위를 매기는 프로세서를 선택합니다. 결과적으로 스레드 예약이 특정 애플리케이션 성능 정책에 최적화되지 않을 수 있습니다.

예를 들어 노드 B의 프로세서가 사용 가능하게 되면 NUMA 시스템의 애플리케이션이 노드 A에서 실행되고 있는 경우입니다. 노드 B에서 프로세서를 계속 사용하려면 스케줄러에서 애플리케이션의 스레드 중 하나를 노드 B로 이동합니다. 그러나 애플리케이션 스레드는 여전히 노드 A의 메모리에 액세스해야 합니다. 이 메모리에 액세스하려면 더 오래 걸립니다. 이제 스레드가 노드 B에서 실행되어 노드가 로컬이 아닌 메모리 원격이 됩니다. 노드 B에서 실행하는 데는 노드 A를 기다리는 것보다 오래 걸릴 수 있습니다. 로컬 메모리 액세스는 마이그레이션의 이점을 벗어나는 경우가 많습니다.

27.1. 스케줄링 정책 카테고리

성능에 민감한 애플리케이션은 종종 로더 또는 관리자가 스레드 실행 위치를 결정하는 이점을 얻을 수 있습니다. Linux 스케줄러는 스레드가 실행되는 위치와 기간을 결정하는 여러 스케줄링 정책을 구현합니다. 다음은 스케줄링 정책의 두 가지 주요 카테고리입니다.

일반 정책
일반 스레드는 일반 우선 순위의 작업에 사용됩니다.
실시간 정책
실시간 정책은 중단 없이 완료해야 하는 시간에 민감한 작업에 사용됩니다. 실시간 스레드는 시간 분할의 영향을 받지 않습니다. 즉, 스레드는 차단, 종료, 수집 출력 또는 더 높은 우선 순위 스레드에 의해 선점될 때까지 실행됩니다.

가장 낮은 우선 순위의 실시간 스레드는 일반 정책이 있는 스레드보다 먼저 예약됩니다. 자세한 내용은 시스템의 sched(7), sched_setaffinity(2), sched_getaffinity(2), sched_setscheduler(2), sched_getscheduler(2) 매뉴얼 페이지를 참조하십시오.

27.2. Cryostat_FIFO를 사용한 정적 우선순위 예약

static 우선순위 스케줄링이라고도 하는 Cryostat _FIFO 는 각 스레드에 고정된 우선 순위를 정의하는 실시간 정책입니다. 관리자는 이 정책을 사용하여 이벤트 응답 시간을 개선하고 대기 시간을 줄일 수 있습니다. 시간에 민감한 작업에 대해 장기간 이 정책을 사용하지 마십시오.

스케줄러는 준비된 스레드 목록에서 가장 높은 우선순위의 Cryostat_FIFO 스레드를 실행합니다. Cryo stat_FIFO 우선순위 수준은 정수 1 에서 99 까지이며, 여기서 99 가 가장 높습니다. 더 적은 수로 시작하고 대기 시간 문제를 식별하는 경우에만 우선 순위를 높입니다.

주의

실시간 스레드는 시간 분할의 영향을 받지 않으므로 우선 순위를 99로 설정하지 않도록 합니다. 이렇게 하면 프로세스가 마이그레이션 및 워치독 스레드와 동일한 우선 순위 수준으로 유지됩니다. 스레드가 컴퓨팅 루프에 들어가고 이러한 스레드가 차단되면 실행할 수 없습니다. 단일 프로세서가 있는 시스템은 결국 이 상황에서 중단됩니다.

관리자는 실시간 애플리케이션 프로그래머가 프로세서를 단조하는 실시간 작업을 시작하는 것을 방지하기 위해 Cryostat _FIFO 대역폭을 제한할 수 있습니다. 다음은 이 정책에서 사용되는 몇 가지 매개변수입니다.

/proc/sys/kernel/sched_rt_period_us
이 매개 변수는 프로세서 대역폭의 100 %로 간주되는 시간 (마이크로초)을 정의합니다. 기본값은 1000000 Cryostats 또는 1초입니다.
/proc/sys/kernel/sched_rt_runtime_us
이 매개 변수는 실시간 스레드를 실행하는 데 사용되는 시간(마이크로초)을 정의합니다. 기본값은 950000 >&#s 또는 0.95초입니다.

27.3. round robin priority scheduling with Cryostat_RR

Cryo stat_RR 은 round-robin variant of the Cryostat _FIFO 입니다. 이 정책은 여러 스레드가 동일한 우선 순위 수준에서 실행되어야 하는 경우에 유용합니다. Cryo stat_FIFO마찬가지로 Cryostat_RR 은 각 스레드에 대한 고정된 우선 순위를 정의하는 실시간 정책입니다. 스케줄러는 모든 Cryostat _RR 스레드 목록을 우선순위순으로 검사합니다. 그런 다음 실행할 준비가 된 가장 높은 우선 순위의 스레드를 예약합니다.

그러나 Cryo stat_FIFO 와 달리 우선 순위가 동일한 스레드는 특정 시간 슬라이스 내에서 라운드 로빈 스타일로 예약됩니다. /proc/sys/kernel/sched_rr_timeslice_ms 파일에서 sched_rr_timeslice_ms 커널 매개변수를 사용하여 이 시간 슬라이스의 값을 밀리초 단위로 설정할 수 있습니다. 가장 낮은 값은 1밀리 초 입니다.

27.4. Cryostat_OTHER를 사용한 일반 예약

Cryo stat_OTHER 는 기본 스케줄링 정책입니다. Cryostat_OTHER 는 CFS(Completely Fair Scheduler)를 사용하여 이 정책과 함께 예약된 모든 스레드에 대한 공정하게 프로세서 액세스를 활성화합니다. Cryostat_OTHER 는 많은 수의 스레드 또는 데이터 처리량이 우선시되는 경우에 유용합니다. 시간이 지남에 따라 스레드를 더 효율적으로 예약할 수 있습니다.

스케줄러는 각 스레드의 nice 값을 기반으로 동적 우선순위 목록을 생성합니다. 관리자는 프로세스의 niceness 값을 변경할 수 있지만 스케줄러의 동적 우선순위 목록을 직접 변경할 수 없습니다.

27.5. 스케줄러 정책 설정

chrt 명령줄 툴을 사용하여 스케줄러 정책 및 우선 순위를 확인하고 조정할 수 있습니다. 예상되는 속성으로 새 프로세스를 시작하거나 실행 중인 프로세스의 속성을 변경할 수 있습니다. 또한 런타임 시 정책을 설정하는 데 사용할 수 있습니다.

프로세스

  1. 활성 프로세스의 PID(프로세스 ID)를 확인합니다.

    # ps
  2. ps 명령과 함께 --pid 또는 -p 옵션을 사용하여 특정 PID의 세부 정보를 확인합니다.
  3. 특정 프로세스의 스케줄링 정책, PID, 우선 순위를 확인합니다.

    # chrt -p 468
    pid 468's current scheduling policy: SCHED_FIFO
    pid 468's current scheduling priority: 85
    # chrt -p 476
    pid 476's current scheduling policy: SCHED_OTHER
    pid 476's current scheduling priority: 0
  4. 프로세스의 스케줄링 정책을 설정합니다. 예를 들면 다음과 같습니다.

    1. PID 1000 인 프로세스를 50으로, 우선순위 50 으로 설정하려면 다음을 실행합니다.

      # chrt -f -p 50 1000
    2. PID 1000 이 있는 프로세스를 우선순위 0 으로 설정하려면 다음을 수행합니다.

      # chrt -o -p 0 1000
    3. PID 1000 이 있는 프로세스를 priority 10 으로 설정하려면 다음을 실행합니다.

      # chrt -r -p 10 1000
    4. 특정 정책 및 우선 순위로 새 애플리케이션을 시작하려면 애플리케이션 이름을 지정합니다.

      # chrt -f 36 /bin/my-app

27.6. chrt 명령의 정책 옵션

chrt 명령을 사용하여 프로세스의 스케줄링 정책을 보고 설정할 수 있습니다. 다음 표에서는 프로세스의 스케줄링 정책을 설정하는 데 사용할 수 있는 적절한 정책 옵션을 설명합니다.

Expand
표 27.1. chrt 명령에 대한 정책 옵션
짧은 옵션긴 옵션설명

-f

--fifo

schedule을 Cryostat _FIFO로 설정합니다.

-o

--other

schedule을 Cryostat _OTHER로 설정합니다.

-r

--rr

schedule을 Cryostat _RR로 설정합니다.

27.7. 부팅 프로세스 중 서비스의 우선 순위 변경

systemd 서비스를 사용하여 부팅 프로세스 중에 시작된 서비스에 대한 실시간 우선 순위를 구성할 수 있습니다. 장치 구성 지시문은 부팅 프로세스 중에 서비스의 우선 순위를 변경하는 데 사용됩니다. service 섹션에서 다음 지시문을 사용하여 부팅 프로세스 우선 순위를 변경할 수 있습니다.

  • CPUSchedulingPolicy=: 실행된 프로세스의 CPU 스케줄링 정책을 설정합니다. 다른, fifo 및 rr 정책을 설정하는 데 사용됩니다.
  • CPUSchedulingPriority=: 실행된 프로세스의 CPU 스케줄링 우선 순위를 설정합니다. 사용 가능한 우선순위 범위는 선택한 CPU 스케줄링 정책에 따라 다릅니다. 실시간 스케줄링 정책의 경우 1(최저 우선 순위)에서 99(최고 우선 순위) 사이의 정수를 사용할 수 있습니다.

부팅 프로세스 중 및 mcelog 서비스를 사용하여 서비스의 우선 순위를 변경할 수 있습니다.

사전 요구 사항

프로세스

  1. 실행 중인 스레드의 스케줄링 우선순위를 확인합니다.

    # tuna --show_threads
        thread       ctxt_switches
        pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
      1      OTHER     0     0xff      3181          292         systemd
      2      OTHER     0     0xff       254            0        kthreadd
      3      OTHER     0     0xff         2            0          rcu_gp
      4      OTHER     0     0xff         2            0      rcu_par_gp
      6      OTHER     0        0         9            0 kworker/0:0H-kblockd
      7      OTHER     0     0xff      1301            1 kworker/u16:0-events_unbound
      8      OTHER     0     0xff         2            0    mm_percpu_wq
      9      OTHER     0        0       266            0     ksoftirqd/0
    [...]
  2. 보조 mcelog 서비스 구성 디렉터리 파일을 생성하고 이 파일에 정책 이름과 우선 순위를 삽입합니다.

    # cat << EOF > /etc/systemd/system/mcelog.service.d/priority.conf
    [Service]
    CPUSchedulingPolicy=fifo
    CPUSchedulingPriority=20
    EOF
  3. systemd 스크립트 구성을 다시 로드합니다.

    # systemctl daemon-reload
  4. mcelog 서비스를 다시 시작하십시오.

    # systemctl restart mcelog

검증

  • systemd 문제로 설정된 mcelog 우선 순위를 표시합니다.

    # tuna -t mcelog -P
    thread       ctxt_switches
    pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
    826     FIFO    20  0,1,2,3        13            0          mcelog

27.8. 우선순위 맵

우선순위는 그룹에 정의되어 있으며, 일부 그룹은 특정 커널 함수를 전용으로 사용합니다. 실시간 스케줄링 정책의 경우 1 (최저 우선 순위)에서 99 (최고 우선 순위) 사이의 정수가 사용됩니다.

다음 표에서는 프로세스의 스케줄링 정책을 설정하는 동안 사용할 수 있는 우선 순위 범위를 설명합니다.

Expand
표 27.2. 우선순위 범위에 대한 설명
우선 순위스레드설명

1

우선 순위가 낮은 커널 스레드

이 우선순위는 일반적으로 history _OTHER 앞에 있어야 하는 작업에 대해 예약되어 있습니다.

2 - 49

사용 가능

일반적인 애플리케이션 우선 순위에 사용되는 범위입니다.

50

기본 hard-IRQ 값

 

51 - 98

높은 우선순위 스레드

주기적으로 실행되고 빠른 응답 시간이 있어야 하는 스레드에 이 범위를 사용합니다. 인터럽트를 중단하므로 CPU 바인딩된 스레드에는 이 범위를 사용하지 마십시오.

99

워치독 및 마이그레이션

가장 높은 우선 순위로 실행해야 하는 시스템 스레드입니다.

27.9. tuned cpu-partitioning 프로필

대기 시간에 민감한 워크로드를 위해 Red Hat Enterprise Linux를 튜닝하려면 cpu-partitioning TuneD 프로필을 사용하십시오. RHEL 9 이상에서는 cpu-partitioning TuneD 프로필을 사용하여 대기 시간이 짧은 튜닝을 더 효율적으로 수행할 수 있습니다.

이 프로필은 대기 시간이 짧은 개별 애플리케이션의 요구 사항에 따라 쉽게 사용자 지정할 수 있습니다. 다음 그림은 cpu-partitioning 프로필을 사용하는 방법을 보여주는 예입니다. 이 예에서는 CPU 및 노드 레이아웃을 사용합니다.

cpu-partitioning

다음 구성 옵션을 사용하여 /etc/tuned/cpu-partitioning-variables.conf 파일에서 cpu-partitioning 프로필을 구성합니다.

로드 밸런싱이 있는 격리된 CPU

cpu-partitioning 그림에서 4에서 23까지 번호가 지정된 블록은 기본 격리된 CPU입니다. 커널 스케줄러의 프로세스 로드 밸런싱이 이러한 CPU에서 활성화됩니다. 커널 스케줄러 로드 밸런싱이 필요한 여러 스레드가 있는 대기 시간이 짧은 프로세스를 위해 설계되었습니다. isolated_cores=cpu-list 옵션을 사용하여 /etc/tuned/cpu-partitioning-variables.conf 파일에서 cpu-partitioning 프로필을 구성합니다. 이 옵션은 커널 스케줄러 로드 밸런싱을 사용하는 CPU를 격리합니다.

분리된 CPU 목록은 쉼표로 구분되거나 대시(예: 3-5)를 사용하여 범위를 지정합니다. 이 옵션은 필수입니다. 이 목록에서 누락된 CPU는 자동으로 하우스키핑 CPU로 간주됩니다.

로드 밸런싱이 없는 격리된 CPU

cpu-partitioning 그림에서 CPU 2 및 3은 분리되고 커널 스케줄러 로드 밸런싱을 제외합니다.

커널 스케줄러 로드 밸런싱을 사용하지 않는 CPU를 격리하는 no_balance_cores= cpu-list 옵션을 사용하여 /etc/tuned/ cpu-partitioning -variables.conf 파일에서 cpu-partitioning 프로필을 구성할 수 있습니다.

no_balance_cores 옵션을 지정하는 것은 선택 사항이지만 이 목록의 모든 CPU는 isolated_cores 목록에 나열된 CPU의 서브 세트여야 합니다. 이러한 CPU를 사용하는 애플리케이션 스레드는 각 CPU에 개별적으로 고정해야 합니다.

하우스키핑 CPU
cpu-partitioning-variables.conf 파일에서 분리되지 않은 CPU는 자동으로 하우스키핑 CPU로 간주됩니다. 하우스키핑 CPU에서 모든 서비스, 데몬, 사용자 프로세스, 이동식 커널 스레드, 인터럽트 처리기 및 커널 타이머를 실행할 수 있습니다.

27.10. 대기 시간이 짧은 튜닝에 TuneD cpu-partitioning 프로필 사용

TuneD의 cpu-partitioning 프로필을 사용하여 대기 시간이 짧은 시스템을 조정할 수 있습니다. 이 경우 애플리케이션은 다음을 사용합니다.

  • 네트워크에서 데이터를 읽는 전용 리더 스레드가 CPU 2에 고정됩니다.
  • 이 네트워크 데이터를 처리하는 다수의 스레드는 CPU 4-23에 고정됩니다.
  • 처리된 데이터를 네트워크에 쓰는 전용 작성기 스레드는 CPU 3에 고정됩니다.

사전 요구 사항

  • dnf install tuned-profiles- cpu-partitioning 명령을 root로 사용하여 cpu-partitioning TuneD 프로필 을 설치했습니다.

프로세스

  1. 다음 변경 사항으로 /etc/tuned/cpu-partitioning-variables.conf 파일을 편집합니다.

    1. isolated_cores=${f:calc_isolated_cores:1} 행을 주석 처리합니다.

      # isolated_cores=${f:calc_isolated_cores:1}
    2. 분리된 CPU에 대해 다음 정보를 추가합니다.

      # All isolated CPUs:
      isolated_cores=2-23
      # Isolated CPUs without the kernel’s scheduler load balancing:
      no_balance_cores=2,3
    3. cpu-partitioning TuneD 프로필을 설정합니다.

      # tuned-adm profile cpu-partitioning
  2. 시스템을 재부팅합니다.

    재부팅 후 cpu-partitioning 그림의 격리에 따라 시스템이 짧은 대기 시간을 위해 조정됩니다. 애플리케이션은 taskset을 사용하여 CPU 2 및 3에 판독기 및 작성기 스레드를 고정하고 CPU 4-23의 나머지 애플리케이션 스레드를 사용할 수 있습니다.

검증

  • 분리된 CPU가 Cpus_allowed_list 필드에 반영되지 않았는지 확인합니다.

    # cat /proc/self/status | grep Cpu
    Cpus_allowed:	003
    Cpus_allowed_list:	0-1
  • 모든 프로세스의 선호도를 보려면 다음을 입력합니다.

    # ps -ae -o pid= | xargs -n 1 taskset -cp
    pid 1's current affinity list: 0,1
    pid 2's current affinity list: 0,1
    pid 3's current affinity list: 0,1
    pid 4's current affinity list: 0-5
    pid 5's current affinity list: 0,1
    pid 6's current affinity list: 0,1
    pid 7's current affinity list: 0,1
    pid 9's current affinity list: 0
    ...
    참고

    tuned는 일부 프로세스의 선호도(대부분 커널 프로세스)를 변경할 수 없습니다. 이 예에서는 PID 4 및 9가 있는 프로세스는 변경되지 않습니다.

27.11. cpu-partitioning TuneD 프로필 사용자 정의

TuneD 프로필을 확장하여 추가 튜닝을 변경할 수 있습니다. 예를 들어 cpu-partitioning 프로필은 cstate=1 을 사용하도록 CPU를 설정합니다. cpu-partitioning 프로필을 사용하지만 CPU cstatecstate1 에서 cstate0 로 추가로 변경하려면 다음 절차를 따르십시오.

프로세스

  1. /etc/tuned/my_profile 디렉터리를 만듭니다.

    # mkdir /etc/tuned/profiles/my_profile
  2. 이 디렉터리에 tuned.conf 파일을 생성하고 다음 콘텐츠를 추가합니다.

    # vi /etc/tuned/profiles/my_profile/tuned.conf
    [main]
    summary=Customized tuning on top of cpu-partitioning
    include=cpu-partitioning
    [cpu]
    force_latency=cstate.id:0|1
  3. 새 프로필을 사용합니다.

    # tuned-adm profile my_profile
    참고

    공유 예에서는 재부팅이 필요하지 않습니다. 그러나 my_profile 프로필의 변경 사항을 적용하려면 재부팅해야 하는 경우 시스템을 재부팅합니다.

28장. numastat를 사용하여 메모리 할당 프로파일링

numastat 툴은 시스템 내의 메모리 할당에 대한 자세한 통계를 제공하여 각 NUMA 노드에 개별적으로 데이터를 제공합니다. 이 정보는 시스템 메모리 성능을 분석하고 다양한 메모리 정책의 효율성을 평가하는 데 유용합니다.

28.1. 기본 numastat 통계

기본적으로 numastat 툴은 각 NUMA 노드에 대한 이러한 데이터 카테고리에 대한 통계를 표시합니다.

numa_hit
이 노드에 성공적으로 할당된 페이지 수입니다.
numa_miss

의도한 노드의 메모리 부족으로 인해 이 노드에 할당된 페이지 수입니다. 각 numa_miss 이벤트에는 다른 노드에서 해당 numa_foreign 이벤트가 있습니다.

참고

높은 numa_hit 값과 낮은 numa_miss 값(별칭)은 최적의 성능을 나타냅니다.

numa_foreign
대신 다른 노드에 할당된 이 노드에 대해 처음 사용되는 페이지 수입니다. 각 numa_foreign 이벤트에는 다른 노드에 해당 numa_miss 이벤트가 있습니다.
interleave_hit
이 노드에 성공적으로 할당된 임시 정책 페이지 수입니다.
local_node
이 노드의 프로세스에서 이 노드에 성공적으로 할당된 페이지 수입니다.
other_node
다른 노드의 프로세스에서 이 노드에 할당된 페이지 수입니다.

28.2. numastat를 사용하여 메모리 할당 보기

numastat 툴을 사용하여 시스템의 메모리 할당을 볼 수 있습니다.

사전 요구 사항

  • numactl 패키지가 설치되어 있습니다.

    # dnf install numactl

프로세스

  • 시스템의 메모리 할당을 확인합니다.

    $ numastat
                                 node0         node1
    numa_hit                  76557759      92126519
    numa_miss                 30772308      30827638
    numa_foreign              30827638      30772308
    interleave_hit              106507        103832
    local_node                76502227      92086995
    other_node                30827840      30867162
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 문서 정보

Legal Notice

Theme

© 2026 Red Hat
맨 위로 이동