Software

라즈베리파이 하드웨어 모니터링 Vcgencmd

crazyits 2023. 10. 15. 04:06
반응형

라즈베리파이(RPI)는 기기를 위하여 최적화된 리눅스를 만들어 배포하고 있습니다.

하드웨어를 모니터링하는 리눅스 명령어들이 있기는 하지만... RPI에서 사용하는 SOC에서 사용하기는 좀 애매한 것도 있습니다.

RPI 에서는 하드웨어 모니터링을 위한 vcgencmd 라는 명령어를 제공하고 있습니다.

이 명령어는 클럭속도, 온도, 전압, VideoCore GPU 관련정보등 다양한 것을 확인할 수 있습니다.

Vcgencmd 의 사용법

클럭속도, 온도, 전압 등을 측정하는데 여러가지 옵션이 있습니다.

클럭 속도 측정

SOC에는 클럭속도라는 것이 하나가 있는 것이 아닙니다. CPU , GPU등을 비롯하여 여러가지의 속도가 있습니다.

설명 명령어 출력
Arm CPU 코어 클럭 정보 vcgencmd measure_clock arm frequency(0)=1500004352
GPU 코어 속도 vcgencmd measure_clock core
frequency(0)=500001504
H.264 블럭 속도 vcgencmd measure_clock h264 frequency(0)=0
이미지센서 라인 속도 vcgencmd measure_clock isp frequency(0)=500000672
3D 블럭 속도 vcgencmd measure_clock v3d
frequency(0)=500001504
UART 속도 vcgencmd measure_clock  uart frequency(0)=43999120
PWM 속도 (아날로그 오디오 출력) vcgencmd measure_clock pwm frequency(0)=0
SD카드 인터페이스 속도 vcgencmd measure_clock emmc frequency(0)=200000432
픽셀 값 속도 vcgencmd measure_clock pixel frequency(0)=107999800
아날로그 비디오 인코더 속도 vcgencmd measure_clock vec frequency(0)=0
HDMI속도 vcgencmd measure_clock hdmi frequency(0)=648002816
디스플레이 병렬 인터페이스 속도 vcgencmd measure_clock dpi frequency(0)=0

 

전압측정

vcgencmd를 사용하면 VideoCore 칩, RAM 전압, PMIC 등 다양한 전원에서 전압, 전류를 확인할 수 있습니다.

설명 명령어 출력
VideoCore 전압 vcgencmd measure_volts core volt=0.7200V
RAM core 전압 vcgencmd measure_volts sdram_c volt=0.6000V
RAM I/O 전압 vcgencmd measure_volts sdram_i volt=0.6000V
RAM Phy 전압 vcgencmd measure_volts sdram_p volt=1.1000V
PMIC 전압 vcgencmd pmic_read_adc 3V7_WL_SW_A current(0)=0.00390372A
3V3_SYS_A current(1)=0.05562801A
1V8_SYS_A current(2)=0.16493220A
DDR_VDD2_A current(3)=0.02049453A
DDR_VDDQ_A current(4)=0.00000000A
1V1_SYS_A current(5)=0.18152300A
0V8_SYS_A current(6)=0.32693650A
VDD_CORE_A current(7)=0.71440000A
3V3_DAC_A current(17)=0.48840000A
3V3_ADC_A current(18)=0.42735000A
1V1_SYS_A current(16)=5.55555000A HDMI_A current(22)=0.02344320A
3V7_WL_SW_V volt(8)=3.71462400V
3V3_SYS_V volt(9)=3.31096100V
1V8_SYS_V volt(10)=1.79926600V
DDR_VDD2_V volt(11)=1.11355200V
DDR_VDDQ_V volt(12)=0.60842430V
1V1_SYS_V volt(13)=1.10622600V
0V8_SYS_V volt(14)=0.80476110V
VDD_CORE_V volt(15)=0.72097620V
3V3_DAC_V volt(20)=3.30768900V
3V3_ADC_V volt(21)=3.30494200V
1V1_SYS_V volt(19)=0.79765500V
HDMI_V volt(23)=5.10004000V
EXT5V_V volt(24)=5.09602000V
BATT_V volt(25)=0.00683760V
PMIC 전압에서 특정한 항목 출력 vcgencmd pmic_read_adc EXT5V_V EXT5V_V volt(24)=5.12416000V

 

시스템 스로틀 상태

RPI가 80도에 도달하면 열로 인한 기기의 파손을 방지하기 위해서 CPU속도를 줄이게 됩니다. 이렇게 되었는지 아닌지 알려주는 것이 있습니다.

설명 명령어 출력
시스템 스로틀 상태를 비트로 반환 vcgencmd get_throttled throttled=0x0

* vcgencmd get_throttled로  반환된 비트에 따른 시스템 상태

설명 비트 16진수값
저전압 감지 0 0x1
Arm 주파수 제한 1 0x2
현재 스로틀 상태 2 0x4
소프트 온도 제한 활성화 3 0x8
전압부족이 발생 16 0x10000
암 주파수 제한이 발생 17 0x20000
스토틀이 발생 18 0x40000
소프트 온도 제한 발생 19 0x80000

 

vcgencmd를 사용한 시스템 정보

vcgencmd를 사용하여 현재 시스템 구성을 확인할 수 있습니다. 기본 출력은 터미널입니다.

설명 명령어 출력
시스템 구성 정보 vcgencmd get_config int arm_64bit=1
arm_boost=1
arm_freq=2400
arm_freq_min=1000
arm_peri_high=1
audio_pwm_mode=2
auto_initramfs=1
camera_auto_detect=1
core_freq=910
core_freq_min=500
disable_commandline_tags=2
disable_fw_kms_setup=1
disable_l2cache=1
disable_overscan=1
display_auto_detect=1
display_default_lcd=-1
display_hdmi_rotate=-1
display_lcd_rotate=-1
dvfs=4 enable_gic=1
enable_uart=-1
force_eeprom_read=1
force_pwm_open=1
framebuffer_depth=16
framebuffer_ignore_alpha=1
framebuffer_swap=1
gpu_freq_min=500
hdmi_enable_4kp60=1
hevc_freq =910
hevc_freq_min=500
ignore_lcd=-1
init_uart_clock=0x2dc6c00
isp_freq=910
isp_freq_min=500
mask_gpu_interrupt1=16418
max_framebuffers=2
over_voltage_avs=0x20404
pause_burst_frames=1
program_serial_random=1
total_mem=8192
usb_max_current_enable=1
v3d_freq=960
v3d_freq_min=500
vpred=8921
hdmi_force_cec_address:0=65535
hdmi_force_cec_address:1=65535
arm cpu 메모리 분할 정보 vcgencmd get_mem arm arm=1020M
gpu 메모리 분할 정보 vcgencmd get_mem gpu gpu=4M

 

vcgencmd를 사용하여 간단한 벤치마킹 스크립트

터미널 명령어는 bash 스크립트를 이용하여 간단한 것을 만들 수 있습니다.

60초마다 CPU 온도, 속도, 스로틀링 상태를 읽고 세부정보를 CSV 파일에 저장하도록 하겠습니다.

CPU에 부하를 주기 위한 것은 stress 프로그램을 사용합니다.

sudo apt update && sudo apt install stress

bash 스크립트를 작성합니다.

#!/bin/bash
echo "Hardware Benchmark Tool"
output_file="benchmark.csv"


echo "Timestamp,CPU Temperature (°C),CPU Clock Speed (MHz),CPU Throttled" > "$output_file"
echo "Idle data for 60 seconds"

# 60번 반복되는 루프 (벤치마크 실행전 잠시 유휴)
for i in {1..60}; do
	# 시간을 출력
    timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$timestamp"
    # vcgencmd를  사용하여 현재 온도
    cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
    echo "$cpu_temp"
    # vcgencmd를  사용하여 현재 클럭속도 Mhz단위 가져옴
    cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= '{print $2}') / 1000000))
    echo "$cpu_clock_speed"
    # vcgencmd를  사용하여 CPU가 스로틀 되었는지 확인
    throttled_status=$(vcgencmd get_throttled)
    echo "$throttled_status"
    echo "################"
    
    #처음에 설정된 파일에 저장을 한다.
    echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"

    # Sleep for 1 second
    sleep 1
done

# 스트레스 명령어를 4코어에 대해 300초동안 백그라운드에서 실행
stress --cpu 4 -t 300 &

# 위쪽에 사용된 vcgencmd 명령어와 같은 방식으로 300초 동안 기록한다.
echo "Stress data for 300 seconds"
for i in {1..300}; do
    timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$timestamp"
    cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
    echo "$cpu_temp"
    cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= '{print $2}') / 1000000))
    echo "$cpu_clock_speed"
    throttled_status=$(vcgencmd get_throttled)
    echo "$throttled_status"
    echo "################"
    echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"

    # Sleep for 1 second
    sleep 1
done

echo "Stress test complete, 60 second cool down period"

# 스트레스 테스트 종료후 유휴 60초
echo "Cool down data for 60 seconds"
for i in {1..60}; do
    timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$timestamp"
    cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
    echo "$cpu_temp"
    cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= '{print $2}') / 1000000))
    echo "$cpu_clock_speed"
    throttled_status=$(vcgencmd get_throttled)
    echo "$throttled_status"
    echo "################"
    echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"

    # Sleep for 1 second
    sleep 1
done

 

https://www.tomshardware.com/how-to/raspberry-pi-benchmark-vcgencmd

반응형