Der vcgencmd war viele Jahre lang tief im Raspberry Pi OS vergraben, aber es hat gedauert Raspberry Pi 5 damit wir es wirklich lieben lernen. Auf seiner grundlegendsten Ebene wird der Befehl verwendet, um Informationen von der VideoCore-GPU auszugeben, die Teil des SoC ist. Aber mit ein paar zusätzlichen Optionen/Argumenten können wir Live-CPU-Temperaturdaten, Spannungen, Taktraten für viele verschiedene Komponenten und vieles mehr erhalten.
In dieser Anleitung stellen wir die grundlegende Verwendung des Befehls vor und schreiben dann ein benutzerdefiniertes Bash-Skript, das alle Benchmarks durchführt Raspberry Pi System.
Grundlegende Verwendung von Vcgencmd
Der Befehl verfügt über mehrere Optionen zum Messen von Taktraten, Temperaturen, Spannungen usw. Lassen Sie uns diese durchgehen und sehen, wie jeder Befehl verwendet wird, sowie ein Beispiel für seine Ausgabe.
Messen Sie Taktraten
Jeder Computer hat mehr als eine Taktfrequenz. Die CPU läuft möglicherweise im Gigahertz-Bereich, einige Teile Ihres Computers laufen jedoch mit viel niedrigeren Geschwindigkeiten. Der Befehl vcgencmd verfügt über Optionen zur Überwachung
Beschreibung | Befehl | Beispielausgabe |
---|---|---|
Erhalten Sie die Kerngeschwindigkeit der Arm-CPU | vcgencmd Measure_clock Arm | Frequenz(0)=1500004352 |
Holen Sie sich die GPU-Kerngeschwindigkeit | vcgencmd Measure_clock Kern | Frequenz(0)=500001504 |
Erhalten Sie H.264-Blockgeschwindigkeit | vcgencmd Measure_clock h264 | Frequenz(0)=0 |
Erhalten Sie die Geschwindigkeit der Bildsensor-Pipeline | vcgencmd Measure_clock isp | Frequenz(0)=500000672 |
Holen Sie sich 3D-Blockgeschwindigkeit | vcgencmd Measure_clock v3d | Frequenz(0)=500001504 |
Holen Sie sich UART-Geschwindigkeit | vcgencmd Measure_clock uart | Frequenz(0)=43999120 |
Holen Sie sich den PWM-Block (analoger Audioausgang) | vcgencmd Measure_clock pwm | Frequenz(0)=0 (Raspberry Pi 5 hat einen analogen Videoausgang, aber kein Audio) |
Erhalten Sie die Taktfrequenz der SD-Kartenschnittstelle | vcgencmd Measure_clock emmc | Frequenz(0)=200000432 |
Pixelwerte abrufen | vcgencmd Measure_clock Pixel | Frequenz(0)=107999800 |
Erhalten Sie die Geschwindigkeit eines analogen Video-Encoders | vcgencmd Measure_clock vec | Frequenz(0)=0 |
Holen Sie sich einen HDMI-Takt | vcgencmd Measure_clock HDMI | Frequenz(0)=648002816 |
Ermitteln Sie die Taktgeschwindigkeit der parallelen Anzeigeschnittstelle | vcgencmd Measure_clock dpi | Frequenz(0)=0 |
Spannungen messen
Mit vcgencmd können wir die Spannungen des VideoCore-Chips, des RAM sowie die Spannungen und Ströme messen, die an den vielen Stromquellen, einschließlich des Power Management IC (PMIC), verwendet werden.
Beschreibung | Befehl | Beispielausgabe |
---|---|---|
Holen Sie sich die VideoCore-Spannung | vcgencmd Measure_Volts Kern | Volt = 0,7200 V |
Ermitteln Sie die RAM-Kernspannung | vcgencmd Measure_volts sdram_c | Volt = 0,6000 V |
Rufen Sie die RAM-I/O-Spannung ab | vcgencmd Measure_volts sdram_i | Volt = 0,6000 V |
Holen Sie sich die RAM-Phy-Spannung | vcgencmd Measure_volts sdram_p | Volt = 1,1000 V |
Lesen Sie die PMIC-Spannungen ab | vcgencmd pmic_read_adc | 3V7_WL_SW_A Strom(0)=0,00390372A 3V3_SYS_A Strom(1)=0,05562801A 1V8_SYS_A Strom(2)=0,16493220A DDR_VDD2_A Strom(3)=0,02049453A DDR_VDDQ_A Strom(4)=0,00000000A 1V1_SYS_A Strom(5)=0,18152300A 0V8_SYS_A Strom (6)=0,32693650A VDD_CORE_A Strom(7)=0,71440000A 3V3_DAC_A Strom(17)=0,48840000A 3V3_ADC_A Strom(18)=0,42735000A 1V1_SYS_A Strom(16)=5,55555000A HDMI_A Strom(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,80476110 V VDD_CORE_V Volt (15) = 0,72097620 V 3V3_DAC_V Volt (20) = 3,30768900 V 3V3_ADC_V Volt (21) = 3,30494200 V 1V1_SYS_V Volt (19) = 0,79765500 V HDMI_V Volt (23)=5,10004000V EXT5V_V Volt(24)=5,09602000V BATT_V Volt(25)=0,00683760V |
Selektive Ausgabe von PMIC-Werten. Suchen Sie den gewünschten Wert in der Liste und fügen Sie ihn als Argument hinzu. | vcgencmd pmic_read_adc EXT5V_V | EXT5V_V Volt(24)=5,12416000V |
Systemdrosselungsstatus
Wenn der Raspberry Pi etwa 80 Grad Celsius erreicht, geht er in die thermische Drosselung über. Dadurch wird die Geschwindigkeit der CPU verringert, um sie kühl zu halten. Wenn wir Benchmarks ausführen, müssen wir wissen, ob eine CPU gedrosselt ist, und vcgencmd hat den Befehl, uns das mitzuteilen.
Beschreibung | Befehl | Beispielausgabe |
---|---|---|
Gibt den Drosselungszustand des Systems als Bitmuster zurück. | vcgencmd get_throttled | gedrosselt=0x0 |
Zeile 1 – Zelle 0 | Zeile 1 – Zelle 1 | Zeile 1 – Zelle 2 |
Bittabelle für den Status der Systemdrosselung
Beschreibung | Bisschen | Hex-Wert |
---|---|---|
Unterspannung erkannt | 0 | 0x1 |
Aktivierungsfrequenz begrenzt | 1 | 0x2 |
Derzeit gedrosselt | 2 | 0x4 |
Soft-Temperaturbegrenzung aktiv | 3 | 0x8 |
Es ist eine Unterspannung aufgetreten | 16 | 0x10000 |
Es wurde eine Aktivierungsfrequenzbegrenzung durchgeführt | 17 | 0x20000 |
Es ist eine Drosselung aufgetreten | 18 | 0x40000 |
Es ist eine weiche Temperaturgrenze aufgetreten | 19 | 0x80000 |
Systemkonfigurationsinformationen mit Vcgencmd
Mit vcgencmd kann die aktuelle Systemkonfiguration überprüft und ausgegeben werden. Standardmäßig wird die Ausgabe an die Standardausgabe (das Terminal) weitergeleitet, aber mithilfe einer Pipe kann die Ausgabe zum Vergleich in eine Datei umgeleitet werden.
Beschreibung | Befehl | Beispielausgabe |
---|---|---|
Gibt die Systemkonfiguration zurück | 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 Anzeige _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 = 50 0ignore_lcd=-1 init_uart_clock= 0x2dc6c00 isp_freq=910 isp_freq_min=500 mask_gpu_interrupt1=16418 max_framebuffers=2 over_length_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 |
Gibt die Speicheraufteilung für Arm-CPU zurück | vcgencmd get_mem arm | Arm=1020M |
Gibt die Speicheraufteilung für die GPU zurück | vcgencmd get_mem GPU | gpu=4M Hinweis: Für Pi 5 scheint dies dynamisch zugewiesen zu werden. |
Ein einfaches Benchmarking-Skript mit Vcgencmd
Mit unserem Wissen über vcgencmd und Bash-Skripting können wir ein einfaches Benchmarking-Tool erstellen, das alle 60 Sekunden die CPU-Temperatur, die Geschwindigkeit und den Drosselungsstatus misst und die Details dann in einer CSV-Datei speichert.
Das Drehbuch ist in drei Abschnitte unterteilt. Eine 60-sekündige Messung der Leerlauftemperatur, die als Referenz dient. Der zweite Teil ist der Stresstest selbst, bei dem alle vier Kerne fünf Minuten lang unter Stress gesetzt werden. Abschließend wiederholen wir die Leerlaufphase für 60 Sekunden, um zu zeigen, dass die CPU abkühlt.
Wir werden dieses Skript auf einem Raspberry Pi 5 schreiben, aber dasselbe Skript funktioniert auf allen Raspberry Pi-Modellen.
1. Öffnen Sie ein Terminal, aktualisieren Sie die Software-Repositorys und installieren Sie dann Stress. Stress ist ein Befehlszeilentool zum Stresstesten von CPUs.
sudo apt update && sudo apt install stress
2. Wählen Sie im Hauptmenü des Raspberry Pi-Desktops „Programmierung“ >> „Geany“.. Geany ist ein großartiger und leichter Texteditor zum Codieren.
3. Teilen Sie dem Skript mit, wo sich die System-Shell befindet. Der Name „Shabang“ ist eine Kombination aus scharf (#) und knall (!).
#!/bin/bash
4. Geben Sie eine Nachricht an die Shell aus, die den Benutzer darüber informiert, was die Anwendung tun wird. Erstellen Sie dann eine Variable, um den Namen der Ausgabedatei zu speichern. Dies sollte eine CSV-Datei sein, der Name kann jedoch frei gewählt werden.
echo "Tom's Hardware Benchmark Tool"
output_file="benchmark.csv"
5. Erstellen Sie einen Header für die CSV-Datei und schreiben Sie in die Datei. Dadurch werden die Spaltenüberschriften in der CSV-Datei und der Tabelle festgelegt.
echo "Timestamp,CPU Temperature (°C),CPU Clock Speed (MHz),CPU Throttled" > "$output_file"
6. Geben Sie eine Meldung aus, die besagt, dass die Anwendung 60 Sekunden lang im Leerlauf ist.
echo "Idle data for 60 seconds"
7. Erstellen Sie eine for-Schleife, die 60 Mal iteriert.
for i in 1..60; do
8. Schreiben Sie die aktuelle Zeit in eine Variable und geben Sie dann den Zeitstempel an die Shell aus.
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
9. Verwenden Sie vcgencmd, um die aktuelle CPU-Temperatur abzurufen, schneiden Sie alle Informationen außer der Temperatur aus und speichern Sie sie in einer Variablen. Geben Sie dann die Temperatur an die Schale weiter. Wenn wir dies nicht tun, müssen wir die Daten in der CSV-Datei bereinigen, aber jetzt können wir die Entfernung automatisieren.
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
echo "$cpu_temp"
10. Rufen Sie mit vcgencmd die aktuelle CPU-Geschwindigkeit in MHz ab, speichern Sie sie in einer Variablen und geben Sie die Geschwindigkeit dann an die Shell aus. Wir müssen die Geschwindigkeit aus der Ausgabe des Befehls herausschneiden und dann durch 1.000.000 dividieren, um die Geschwindigkeit in MHz zu erhalten.
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
11. Überprüfen Sie, ob die CPU gedrosselt wurde, speichern Sie die Daten in einer Variablen und drucken Sie sie in der Shell aus. Dadurch wird ein Bitmuster zurückgegeben. Informationen zum Dekodieren finden Sie in der Tabelle.
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
12. Geben Sie eine Reihe von # an die Shell zurück. Dies hilft dabei, die Daten in Abschnitte zu unterteilen, wenn sie über das Terminalfenster gedruckt werden.
echo "################"
13. Schreiben Sie die Daten in die CSV-Datei. Beachten Sie, dass wir >> verwenden, um die Daten an die CSV-Datei anzuhängen. Wenn es nur ein einziges > gäbe, würde es überschrieben werden.
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
14. Halten Sie, immer noch innerhalb der for-Schleife, eine Sekunde lang inne und schließen Sie dann die for-Schleife. Der Code in der for-Schleife schreibt 60 Messwerte in die CSV-Datei, einen pro Sekunde der Leerlaufzeit.
sleep 1
done
15. Rufen Sie den Stress-Befehl auf, um einen Stresstest auf allen vier CPU-Kernen für 300 Sekunden (fünf Minuten) durchzuführen. Das „&“ platziert den Befehl im Hintergrund und blockiert nicht die Ausführung unseres Skripts.
stress --cpu 4 -t 300 &
16. Echo (drucken) eine Nachricht, die besagt, dass der Stresstest jetzt beginnt.
echo "Stress data for 300 seconds"
17. Wir wiederholen die for-Schleife von zuvor, Ändern Sie einfach die 60 auf 300 und zeichnen Sie dann die gleiche Temperatur, CPU-Geschwindigkeit und den gleichen Drosselstatus in den Variablen auf und schreiben Sie sie dann in die CSV-Datei.
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
18. Der letzte Abschnitt ist eine Abkühlphase, in der die CPU wieder in den Normalzustand zurückkehren kann. Dies ist die gleiche Schleife wie die Leerlaufzeit.
echo "Cool down data for 60 seconds"
for i in 1..60; do
# Get current timestamp
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp"
# Get CPU temperature in degrees Celsius
cpu_temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
echo "$cpu_temp"
# Get CPU clock speed in MHz
cpu_clock_speed=$(($(vcgencmd measure_clock arm | awk -F= 'print $2') / 1000000))
echo "$cpu_clock_speed"
# Check if the CPU is throttled
throttled_status=$(vcgencmd get_throttled)
echo "$throttled_status"
echo "################"
# Append data to CSV file
echo "$timestamp,$cpu_temp,$cpu_clock_speed,$throttled_status" >> "$output_file"
# Sleep for 1 second
sleep 1
done
19. Speichern Sie den Code als benchmark.sh in Ihrem Home-Verzeichnis.
20. Machen Sie die Datei in einem Terminal ausführbar.
chmod +x benchmark.sh
21. Führen Sie vom Terminal aus den Code aus und warten Sie, bis der Benchmark abgeschlossen ist.
./benchmark.sh
22. Importieren Sie die CSV-Datei in eine Tabellenkalkulation und erstellen Sie daraus Diagramme/Tabellen Ihrer Ergebnisse.
Vollständige Codeliste
#!/bin/bash
echo "Tom's 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"
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
stress --cpu 4 -t 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"
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