fix: Improve CPU temp accuracy and optimize average calculation
- Read CPU temp from hwmon (coretemp/k10temp) instead of thermal_zone0 - Average all CPU core temperatures for accurate reading - Support Intel, AMD, and ARM thermal drivers - Cache average connections for 5 minutes to reduce file I/O - Split dashboard footer into two lines for better readability
This commit is contained in:
73
conduit.sh
73
conduit.sh
@@ -1293,7 +1293,8 @@ show_dashboard() {
|
|||||||
echo -e "\033[K"
|
echo -e "\033[K"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "${BOLD}Refreshes every 10 seconds. ${CYAN}[i]${NC} ${DIM}What do these numbers mean?${NC} ${DIM}[any key] Menu${NC}\033[K"
|
echo -e "${BOLD}Refreshes every 10 seconds.${NC}\033[K"
|
||||||
|
echo -e "${CYAN}[i]${NC} ${DIM}What do these numbers mean?${NC} ${DIM}[any key] Back to menu${NC}\033[K"
|
||||||
|
|
||||||
# Clear any leftover lines below the dashboard content (Erase to End of Display)
|
# Clear any leftover lines below the dashboard content (Erase to End of Display)
|
||||||
# This only cleans up if the dashboard gets shorter
|
# This only cleans up if the dashboard gets shorter
|
||||||
@@ -1395,19 +1396,41 @@ get_system_stats() {
|
|||||||
sys_cpu="N/A"
|
sys_cpu="N/A"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. CPU Temperature
|
# 2. CPU Temperature (cross-platform: Intel coretemp, AMD k10temp, ARM thermal)
|
||||||
local cpu_temp="-"
|
local cpu_temp="-"
|
||||||
# Try thermal_zone first (most common)
|
local temp_sum=0
|
||||||
if [ -f /sys/class/thermal/thermal_zone0/temp ]; then
|
local temp_count=0
|
||||||
local temp_raw=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null)
|
|
||||||
if [ -n "$temp_raw" ] && [ "$temp_raw" -gt 0 ] 2>/dev/null; then
|
# First try hwmon - look for CPU temperature sensors (most accurate)
|
||||||
cpu_temp="$((temp_raw / 1000))°C"
|
for hwmon_dir in /sys/class/hwmon/hwmon*; do
|
||||||
fi
|
[ -d "$hwmon_dir" ] || continue
|
||||||
# Try hwmon as fallback
|
local hwmon_name=$(cat "$hwmon_dir/name" 2>/dev/null)
|
||||||
elif [ -f /sys/class/hwmon/hwmon0/temp1_input ]; then
|
# Match CPU thermal drivers: coretemp (Intel), k10temp (AMD), cpu_thermal/soc_thermal (ARM)
|
||||||
local temp_raw=$(cat /sys/class/hwmon/hwmon0/temp1_input 2>/dev/null)
|
case "$hwmon_name" in
|
||||||
if [ -n "$temp_raw" ] && [ "$temp_raw" -gt 0 ] 2>/dev/null; then
|
coretemp|k10temp|cpu_thermal|soc_thermal|cpu-thermal|thermal-fan-est)
|
||||||
cpu_temp="$((temp_raw / 1000))°C"
|
# Read all core temperatures from this device
|
||||||
|
for temp_file in "$hwmon_dir"/temp*_input; do
|
||||||
|
[ -f "$temp_file" ] || continue
|
||||||
|
local temp_raw=$(cat "$temp_file" 2>/dev/null)
|
||||||
|
if [ -n "$temp_raw" ] && [ "$temp_raw" -gt 0 ] 2>/dev/null; then
|
||||||
|
temp_sum=$((temp_sum + temp_raw))
|
||||||
|
temp_count=$((temp_count + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Calculate average if we found CPU temps via hwmon
|
||||||
|
if [ "$temp_count" -gt 0 ]; then
|
||||||
|
cpu_temp="$((temp_sum / temp_count / 1000))°C"
|
||||||
|
else
|
||||||
|
# Fallback to thermal_zone (less accurate but works on most systems)
|
||||||
|
if [ -f /sys/class/thermal/thermal_zone0/temp ]; then
|
||||||
|
local temp_raw=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null)
|
||||||
|
if [ -n "$temp_raw" ] && [ "$temp_raw" -gt 0 ] 2>/dev/null; then
|
||||||
|
cpu_temp="$((temp_raw / 1000))°C"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2865,8 +2888,10 @@ check_connection_history_reset() {
|
|||||||
mkdir -p "$(dirname "$CONNECTION_HISTORY_START_FILE")" 2>/dev/null
|
mkdir -p "$(dirname "$CONNECTION_HISTORY_START_FILE")" 2>/dev/null
|
||||||
echo "$current_start" > "$CONNECTION_HISTORY_START_FILE"
|
echo "$current_start" > "$CONNECTION_HISTORY_START_FILE"
|
||||||
|
|
||||||
# Clear history file
|
# Clear history file and invalidate average cache
|
||||||
rm -f "$CONNECTION_HISTORY_FILE" 2>/dev/null
|
rm -f "$CONNECTION_HISTORY_FILE" 2>/dev/null
|
||||||
|
_AVG_CONN_CACHE=""
|
||||||
|
_AVG_CONN_CACHE_TIME=0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Record current connection count to history (called every ~5 minutes)
|
# Record current connection count to history (called every ~5 minutes)
|
||||||
@@ -2898,12 +2923,26 @@ record_connection_history() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get average connections since container started
|
# Average connections cache (recalculate every 5 minutes)
|
||||||
|
_AVG_CONN_CACHE=""
|
||||||
|
_AVG_CONN_CACHE_TIME=0
|
||||||
|
|
||||||
|
# Get average connections since container started (cached for 5 min)
|
||||||
get_average_connections() {
|
get_average_connections() {
|
||||||
|
local now=$(date +%s)
|
||||||
|
|
||||||
|
# Return cached value if less than 5 minutes old
|
||||||
|
if [ -n "$_AVG_CONN_CACHE" ] && [ $((now - _AVG_CONN_CACHE_TIME)) -lt 300 ]; then
|
||||||
|
echo "$_AVG_CONN_CACHE"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if containers restarted (clear stale history)
|
# Check if containers restarted (clear stale history)
|
||||||
check_connection_history_reset
|
check_connection_history_reset
|
||||||
|
|
||||||
if [ ! -f "$CONNECTION_HISTORY_FILE" ]; then
|
if [ ! -f "$CONNECTION_HISTORY_FILE" ]; then
|
||||||
|
_AVG_CONN_CACHE="-"
|
||||||
|
_AVG_CONN_CACHE_TIME=$now
|
||||||
echo "-"
|
echo "-"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@@ -2914,7 +2953,9 @@ get_average_connections() {
|
|||||||
END { if (count > 0) printf "%.0f", sum/count; else print "-" }
|
END { if (count > 0) printf "%.0f", sum/count; else print "-" }
|
||||||
' "$CONNECTION_HISTORY_FILE" 2>/dev/null)
|
' "$CONNECTION_HISTORY_FILE" 2>/dev/null)
|
||||||
|
|
||||||
echo "${avg:--}"
|
_AVG_CONN_CACHE="${avg:--}"
|
||||||
|
_AVG_CONN_CACHE_TIME=$now
|
||||||
|
echo "$_AVG_CONN_CACHE"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get connection snapshot from N hours ago (returns "connected|connecting" or "-|-")
|
# Get connection snapshot from N hours ago (returns "connected|connecting" or "-|-")
|
||||||
|
|||||||
Reference in New Issue
Block a user