diff --git a/linux_configuration/scripts/fixes/diagnose_arch_performance.sh b/linux_configuration/scripts/fixes/diagnose_arch_performance.sh new file mode 100755 index 0000000..37ea37e --- /dev/null +++ b/linux_configuration/scripts/fixes/diagnose_arch_performance.sh @@ -0,0 +1,371 @@ +#!/usr/bin/env bash + +set -euo pipefail + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +# shellcheck source=../lib/common.sh +source "$SCRIPT_DIR/../lib/common.sh" + +REPORT_DIR="${HOME}/.local/state/system-diagnostics" +REPORT_FILE="$REPORT_DIR/arch-performance-$(date +%Y%m%d_%H%M%S).log" +APPLY_SAFE_FIXES=false +INSTALL_TOOLS=false + +declare -a FINDINGS=() +declare -a ACTIONS=() + +usage() { + cat << 'EOF' +diagnose_arch_performance.sh - Diagnose common causes of Arch Linux slowness/instability + +Usage: + diagnose_arch_performance.sh [OPTIONS] + +Options: + --apply-safe-fixes Apply conservative fixes (requires sudo) + --install-tools Install optional diagnostics packages (requires sudo) + -h, --help Show help + +Safe fixes applied when --apply-safe-fixes is used: + - Enable/start fstrim.timer if missing + - Resolve TLP vs power-profiles-daemon conflict (keeps power-profiles-daemon) + - Vacuum journal logs if they exceed 1GiB + +Notes: + - Script does not reboot automatically. + - Some checks are informational and provide next-step commands. +EOF +} + +parse_args() { + while [[ $# -gt 0 ]]; do + case "$1" in + --apply-safe-fixes) + APPLY_SAFE_FIXES=true + shift + ;; + --install-tools) + INSTALL_TOOLS=true + shift + ;; + -h | --help) + usage + exit 0 + ;; + *) + log_error "Unknown option: $1" + usage + exit 2 + ;; + esac + done +} + +add_finding() { + FINDINGS+=("$1") + log_warn "$1" +} + +add_action() { + ACTIONS+=("$1") + log_info "$1" +} + +run_and_log() { + local header="$1" + shift + { + echo + echo "=== $header ===" + "$@" 2>&1 || true + } >> "$REPORT_FILE" +} + +check_root_if_needed() { + if [[ $APPLY_SAFE_FIXES == "true" || $INSTALL_TOOLS == "true" ]]; then + require_root "$@" + fi +} + +install_optional_tools() { + if [[ $INSTALL_TOOLS != "true" ]]; then + return + fi + + local packages=(lm_sensors smartmontools nvtop iotop powertop) + log_info "Installing optional diagnostic packages: ${packages[*]}" + pacman -S --needed --noconfirm "${packages[@]}" +} + +collect_basics() { + run_and_log "Kernel" uname -a + run_and_log "Uptime" uptime + run_and_log "Memory" free -h + run_and_log "Swap" swapon --show + run_and_log "CPU (lscpu)" lscpu + run_and_log "Disk Usage" df -h / + run_and_log "Boot Time" systemd-analyze + run_and_log "Failed Units" systemctl --failed --no-pager + run_and_log "Recent Errors (this boot)" journalctl -b -p err --no-pager -n 200 + + local cpu_count + cpu_count=$(getconf _NPROCESSORS_ONLN 2> /dev/null || echo 1) + local load1 + load1=$(awk '{print int($1)}' /proc/loadavg 2> /dev/null || echo 0) + if [[ ${load1:-0} -ge ${cpu_count:-1} ]]; then + add_finding "1-minute load average is at/above CPU thread count (${load1}/${cpu_count}); background tasks may be saturating the system." + fi + + local failed_count + failed_count=$(systemctl --failed --no-legend 2> /dev/null | wc -l || true) + failed_count=${failed_count//[[:space:]]/} + if [[ ${failed_count:-0} -gt 0 ]]; then + add_finding "One or more systemd units are failed (${failed_count}); failed services can cause repeated retries and instability." + fi + + local acpi_error_count + acpi_error_count=$(journalctl -b -p err --no-pager 2> /dev/null | grep -ic 'acpi' || true) + if [[ ${acpi_error_count:-0} -ge 5 ]]; then + add_finding "Frequent ACPI errors detected in current boot (${acpi_error_count}); BIOS/firmware update may improve stability." + fi + + local top_snapshot + top_snapshot=$(ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 12 || true) + { + echo + echo "=== Top CPU Processes ===" + echo "$top_snapshot" + } >> "$REPORT_FILE" + + local xorg_cpu + xorg_cpu=$(ps -C Xorg -o %cpu= | awk '{sum+=$1} END {printf "%.0f", sum+0}' || echo 0) + if [[ ${xorg_cpu:-0} -ge 20 ]]; then + add_finding "Xorg is using high CPU (${xorg_cpu}%); desktop/compositor/GPU driver path may be a primary slowdown source." + fi +} + +check_cpu_governor() { + local gov_files + gov_files=$(find /sys/devices/system/cpu -maxdepth 3 -name scaling_governor 2> /dev/null || true) + + if [[ -z $gov_files ]]; then + add_action "CPU governor files not found (may be unsupported on this platform)." + return + fi + + local summary + summary=$(awk '{count[$1]++} END {for (g in count) printf "%s:%d ", g, count[g]}' $gov_files 2> /dev/null || true) + echo "CPU governor summary: ${summary:-unknown}" >> "$REPORT_FILE" + + if grep -q '^powersave$' $gov_files 2> /dev/null; then + add_finding "CPU governor includes 'powersave' on one or more cores; this can make high-end hardware feel slow." + fi +} + +check_thermal_state() { + if has_cmd sensors; then + run_and_log "Temperatures (sensors)" sensors + else + add_action "Install lm_sensors and run 'sensors' to verify thermal throttling." + fi + + if has_cmd dmesg; then + local therm_hits + therm_hits=$(dmesg | grep -Ei 'throttl|thermal|overheat|cpu clock throttled' | tail -n 30 || true) + if [[ -n $therm_hits ]]; then + add_finding "Kernel logs show thermal/throttling related messages." + { + echo + echo "=== Thermal/Throttling dmesg excerpts ===" + echo "$therm_hits" + } >> "$REPORT_FILE" + fi + fi +} + +check_power_services() { + local tlp_enabled="false" + local ppd_enabled="false" + + if systemctl is-enabled tlp.service > /dev/null 2>&1; then + tlp_enabled="true" + fi + if systemctl is-enabled power-profiles-daemon.service > /dev/null 2>&1; then + ppd_enabled="true" + fi + + echo "Power services: tlp=${tlp_enabled}, power-profiles-daemon=${ppd_enabled}" >> "$REPORT_FILE" + + if [[ $tlp_enabled == "true" && $ppd_enabled == "true" ]]; then + add_finding "Both TLP and power-profiles-daemon are enabled; they often conflict and cause inconsistent performance." + fi + + if [[ $tlp_enabled == "false" && $ppd_enabled == "false" ]]; then + add_action "No power management daemon is enabled; consider installing/enabling power-profiles-daemon for predictable AC/battery behavior." + fi +} + +check_storage_health() { + run_and_log "Block Devices" lsblk -o NAME,MODEL,ROTA,SIZE,TYPE,MOUNTPOINT,FSTYPE + + if has_cmd fstrim; then + run_and_log "fstrim dry-run" fstrim -av --dry-run + fi + + if systemctl is-enabled fstrim.timer > /dev/null 2>&1; then + add_action "fstrim.timer is enabled (good for SSD performance longevity)." + else + add_finding "fstrim.timer is not enabled; SSD maintenance trimming may be missing." + fi + + if has_cmd smartctl; then + local root_disk + root_disk=$(findmnt -n -o SOURCE / | sed 's/[0-9]*$//' | sed 's/p$//' || true) + if [[ -n ${root_disk:-} && -b $root_disk ]]; then + run_and_log "SMART Summary ($root_disk)" smartctl -H "$root_disk" + fi + else + add_action "Install smartmontools and run SMART health checks for your SSD/NVMe." + fi +} + +check_memory_pressure() { + local mem_total mem_available swap_total swap_free + mem_total=$(awk '/MemTotal/ {print $2}' /proc/meminfo) + mem_available=$(awk '/MemAvailable/ {print $2}' /proc/meminfo) + swap_total=$(awk '/SwapTotal/ {print $2}' /proc/meminfo) + swap_free=$(awk '/SwapFree/ {print $2}' /proc/meminfo) + + if [[ ${swap_total:-0} -gt 0 ]]; then + local swap_used + swap_used=$((swap_total - swap_free)) + local swap_pct + swap_pct=$((swap_used * 100 / swap_total)) + echo "Swap usage: ${swap_pct}%" >> "$REPORT_FILE" + if [[ $swap_pct -ge 35 && ${mem_available:-0} -gt $((mem_total / 3)) ]]; then + add_finding "High swap usage while RAM is still available; this can cause stutter." + add_action "Consider lowering swappiness (temporary: sudo sysctl vm.swappiness=10)." + fi + fi + + if [[ -f /proc/pressure/memory ]]; then + run_and_log "Memory PSI" cat /proc/pressure/memory + fi +} + +check_gpu_state() { + if has_cmd nvidia-smi; then + run_and_log "NVIDIA State" nvidia-smi + local pstate util power + pstate=$(nvidia-smi --query-gpu=pstate --format=csv,noheader 2> /dev/null | head -n 1 | xargs || true) + util=$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits 2> /dev/null | head -n 1 | xargs || true) + power=$(nvidia-smi --query-gpu=power.draw --format=csv,noheader,nounits 2> /dev/null | head -n 1 | xargs || true) + + echo "NVIDIA pstate: ${pstate:-unknown}" >> "$REPORT_FILE" + echo "NVIDIA util: ${util:-unknown}%" >> "$REPORT_FILE" + echo "NVIDIA power: ${power:-unknown}W" >> "$REPORT_FILE" + + if [[ ${pstate:-} == "P0" && ${util:-100} -le 5 ]]; then + add_finding "NVIDIA GPU is in P0 high-performance state while mostly idle; this can increase heat and trigger thermal limits." + add_action "If laptop has hybrid graphics, prefer iGPU mode for desktop workloads and use dGPU on demand." + fi + else + run_and_log "PCI VGA Devices" lspci -nnk | grep -A3 -Ei 'vga|3d|display' + fi +} + +check_journal_size() { + local journal_line + journal_line=$(journalctl --disk-usage 2> /dev/null || true) + echo "Journal usage: ${journal_line:-unknown}" >> "$REPORT_FILE" + + if [[ $journal_line =~ ([0-9]+\.?[0-9]*)\ (G|M) ]]; then + local value unit + value="${BASH_REMATCH[1]}" + unit="${BASH_REMATCH[2]}" + if [[ $unit == "G" ]]; then + add_finding "Systemd journal is large (${value}G); excessive logs can waste I/O and disk space." + fi + fi +} + +apply_safe_fixes() { + if [[ $APPLY_SAFE_FIXES != "true" ]]; then + return + fi + + log_info "Applying safe fixes..." + + if ! systemctl is-enabled fstrim.timer > /dev/null 2>&1; then + systemctl enable --now fstrim.timer + add_action "Enabled and started fstrim.timer." + fi + + if systemctl is-enabled tlp.service > /dev/null 2>&1 && systemctl is-enabled power-profiles-daemon.service > /dev/null 2>&1; then + systemctl disable --now tlp.service + add_action "Disabled tlp.service to avoid conflict with power-profiles-daemon." + fi + + local journal_line + journal_line=$(journalctl --disk-usage 2> /dev/null || true) + if [[ $journal_line =~ ([0-9]+\.?[0-9]*)\ G ]]; then + journalctl --vacuum-size=300M + add_action "Vacuumed systemd journal to 300M." + fi +} + +print_summary() { + echo + echo "==============================" + echo " Arch Performance Diagnostics" + echo "==============================" + echo "Report: $REPORT_FILE" + echo + + if [[ ${#FINDINGS[@]} -eq 0 ]]; then + log_ok "No high-confidence bottlenecks detected by automated checks." + else + log_warn "Likely issues found (${#FINDINGS[@]}):" + local item + for item in "${FINDINGS[@]}"; do + echo " - $item" + done + fi + + if [[ ${#ACTIONS[@]} -gt 0 ]]; then + echo + log_info "Actions/recommendations:" + local action + for action in "${ACTIONS[@]}"; do + echo " - $action" + done + fi + + echo + echo "Recommended next command for deep per-process analysis:" + echo " sudo iotop -oPa" + echo " top" + echo " systemd-analyze blame" +} + +main() { + parse_args "$@" + check_root_if_needed "$@" + + mkdir -p "$REPORT_DIR" + log_info "Writing diagnostic report to: $REPORT_FILE" + + collect_basics + install_optional_tools + check_cpu_governor + check_thermal_state + check_power_services + check_storage_health + check_memory_pressure + check_gpu_state + check_journal_size + apply_safe_fixes + print_summary +} + +main "$@" diff --git a/linux_configuration/scripts/fixes/fix_arch_performance.sh b/linux_configuration/scripts/fixes/fix_arch_performance.sh new file mode 100755 index 0000000..b20cae6 --- /dev/null +++ b/linux_configuration/scripts/fixes/fix_arch_performance.sh @@ -0,0 +1,326 @@ +#!/usr/bin/env bash + +# Fix common Arch Linux performance issues on laptops with NVIDIA hybrid graphics +# +# Issues addressed: +# 1. NVIDIA xorg RenderAccel disabled → forces software rendering, Xorg eats 30%+ CPU +# 2. CPU governor stuck on powersave → AMD Ryzen throttled despite AC power +# 3. No power management daemon → inconsistent CPU/GPU power state management +# 4. Systemd journal bloated (>1GiB) → wastes disk I/O +# 5. NetworkManager-wait-online.service → adds ~6s to every boot for no benefit +# 6. media-organizer.service broken → wrong script path & user, fails every boot +# +# Usage: +# ./fix_arch_performance.sh # Apply all fixes +# ./fix_arch_performance.sh --dry-run # Show what would be done +# ./fix_arch_performance.sh --interactive # Prompt before each fix +# ./fix_arch_performance.sh -h # Show help +# +# Safe to re-run: all fixes are idempotent. +# Requires reboot/re-login for xorg changes to take effect. + +set -euo pipefail + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +# shellcheck source=../lib/common.sh +source "$SCRIPT_DIR/../lib/common.sh" + +parse_interactive_args "$@" +shift "$COMMON_ARGS_SHIFT" + +DRY_RUN=false +for arg in "$@"; do + case "$arg" in + --dry-run) + DRY_RUN=true + ;; + -h | --help) + cat << 'EOF' +fix_arch_performance.sh - Fix common Arch Linux laptop performance issues + +Usage: fix_arch_performance.sh [OPTIONS] + +Options: + --dry-run Show what would be done without making changes + -i, --interactive Prompt before each fix + -h, --help Show this help message + +Fixes applied: + 1. Enable NVIDIA hardware acceleration (RenderAccel true) + 2. Install/enable power-profiles-daemon, set performance profile + 3. Vacuum systemd journal to 300M, cap future size + 4. Disable NetworkManager-wait-online.service (saves ~6s boot) + 5. Fix media-organizer.service (correct path and user) + +All fixes are idempotent and safe to re-run. +Xorg fixes require reboot/re-login to take effect. +EOF + exit 0 + ;; + esac +done + +require_root "$@" + +print_setup_header "Arch Linux Performance Fix" + +FIXES_APPLIED=0 +FIXES_SKIPPED=0 + +# --------------------------------------------------------------------------- +# Helper: run or print a fix depending on --dry-run / --interactive +# --------------------------------------------------------------------------- +apply_fix() { + local description="$1" + shift + + echo "" + log_info "$description" + + if [[ $DRY_RUN == "true" ]]; then + echo " [dry-run] Would run: $*" + return 0 + fi + + if [[ $INTERACTIVE_MODE == "true" ]]; then + if ! ask_yes_no " Apply this fix?"; then + log_warn "Skipped." + ((FIXES_SKIPPED++)) || true + return 0 + fi + fi + + if "$@"; then + log_ok "Done." + ((FIXES_APPLIED++)) || true + else + log_error "Failed (non-fatal, continuing)." + fi +} + +# =================================================================== +# Fix 1: NVIDIA RenderAccel +# =================================================================== +fix_nvidia_render_accel() { + local conf="/etc/X11/xorg.conf.d/20-nvidia.conf" + + # Check if RenderAccel is already correct + if [[ -f $conf ]] && grep -qi 'RenderAccel.*true' "$conf"; then + log_ok "NVIDIA RenderAccel is already enabled — skipping." + return 0 + fi + + mkdir -p /etc/X11/xorg.conf.d + + # Back up the current config if it exists and has the bad setting + if [[ -f $conf ]]; then + cp "$conf" "${conf}.bak.$(date +%Y%m%d_%H%M%S)" + fi + + cat > "$conf" << 'XORGEOF' +# NVIDIA configuration - hardware acceleration enabled +# Disabling RenderAccel forces Xorg into software rendering, +# causing 30%+ CPU usage on desktop. Keep this set to "true". +Section "Device" + Identifier "NVIDIA Card" + Driver "nvidia" + Option "RenderAccel" "true" +EndSection +XORGEOF + + # Clean up old backups left by nvidia_troubleshoot.sh + rm -f /etc/X11/xorg.conf.d/20-nvidia.conf.backup.* 2> /dev/null || true + return 0 +} + +# =================================================================== +# Fix 2: Power management daemon + performance profile +# =================================================================== +fix_power_management() { + # Install power-profiles-daemon if missing + if ! pacman -Qi power-profiles-daemon > /dev/null 2>&1; then + log_info "Installing power-profiles-daemon..." + pacman -S --needed --noconfirm power-profiles-daemon + fi + + # Enable and start the service + if ! systemctl is-enabled power-profiles-daemon.service > /dev/null 2>&1; then + systemctl enable --now power-profiles-daemon.service + elif ! systemctl is-active power-profiles-daemon.service > /dev/null 2>&1; then + systemctl start power-profiles-daemon.service + fi + + # Resolve TLP conflict if both are enabled + if systemctl is-enabled tlp.service > /dev/null 2>&1; then + log_warn "TLP conflicts with power-profiles-daemon — disabling TLP." + systemctl disable --now tlp.service + fi + + # Set performance profile (appropriate when plugged in with strong hardware) + sleep 1 + if has_cmd powerprofilesctl; then + powerprofilesctl set performance + log_info "Power profile set to: $(powerprofilesctl get)" + fi + + return 0 +} + +# =================================================================== +# Fix 3: Journal vacuum + permanent size cap +# =================================================================== +fix_journal() { + local usage_line + usage_line=$(journalctl --disk-usage 2> /dev/null || true) + + local needs_vacuum=false + if [[ $usage_line =~ ([0-9]+\.?[0-9]*)\ G ]]; then + needs_vacuum=true + fi + + if [[ $needs_vacuum == "true" ]]; then + journalctl --vacuum-size=300M + else + log_ok "Journal is already under 1GiB." + fi + + # Create permanent size cap via drop-in + local dropin_dir="/etc/systemd/journald.conf.d" + local dropin_file="$dropin_dir/size-limit.conf" + + if [[ -f $dropin_file ]] && grep -q 'SystemMaxUse=300M' "$dropin_file"; then + log_ok "Journal size cap already configured." + else + mkdir -p "$dropin_dir" + cat > "$dropin_file" << 'JOURNALEOF' +[Journal] +SystemMaxUse=300M +JOURNALEOF + systemctl restart systemd-journald + fi + + return 0 +} + +# =================================================================== +# Fix 4: Disable NetworkManager-wait-online +# =================================================================== +fix_nm_wait_online() { + if ! systemctl is-enabled NetworkManager-wait-online.service > /dev/null 2>&1; then + log_ok "NetworkManager-wait-online is already disabled — skipping." + return 0 + fi + + systemctl disable NetworkManager-wait-online.service + return 0 +} + +# =================================================================== +# Fix 5: media-organizer.service +# =================================================================== +fix_media_organizer() { + local service_file="/etc/systemd/system/media-organizer.service" + + # Find the organize_downloads.sh script + local script_path="" + local candidates=( + "/home/kuhy/testsAndMisc/linux_configuration/scripts/utils/organize_downloads.sh" + "/home/kuhy/linux-configuration/scripts/utils/organize_downloads.sh" + ) + for candidate in "${candidates[@]}"; do + if [[ -f $candidate ]]; then + script_path="$candidate" + break + fi + done + + if [[ -z $script_path ]]; then + log_warn "organize_downloads.sh not found — skipping media-organizer fix." + return 0 + fi + + local target_user="${SUDO_USER:-kuhy}" + + # Check if already correct + if [[ -f $service_file ]]; then + if grep -q "User=$target_user" "$service_file" \ + && grep -q "ExecStart=$script_path" "$service_file"; then + log_ok "media-organizer.service is already correctly configured — skipping." + return 0 + fi + fi + + systemctl stop media-organizer.service 2> /dev/null || true + + cat > "$service_file" << EOF +[Unit] +Description=Media File Organizer +After=graphical-session.target +Wants=graphical-session.target + +[Service] +Type=oneshot +User=$target_user +Group=$target_user +ExecStart=$script_path +StandardOutput=journal +StandardError=journal +RemainAfterExit=no + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + systemctl reset-failed media-organizer.service 2> /dev/null || true + systemctl enable media-organizer.service + return 0 +} + +# =================================================================== +# Apply all fixes +# =================================================================== +main() { + apply_fix \ + "Fix 1/5: Enable NVIDIA hardware acceleration (RenderAccel → true)" \ + fix_nvidia_render_accel + + apply_fix \ + "Fix 2/5: Install/enable power-profiles-daemon + set performance profile" \ + fix_power_management + + apply_fix \ + "Fix 3/5: Vacuum journal logs + set permanent 300M size cap" \ + fix_journal + + apply_fix \ + "Fix 4/5: Disable NetworkManager-wait-online.service (~6s boot saving)" \ + fix_nm_wait_online + + apply_fix \ + "Fix 5/5: Fix media-organizer.service (correct path and user)" \ + fix_media_organizer + + # --------------------------------------------------------------- + # Summary + # --------------------------------------------------------------- + echo "" + echo "==============================" + echo " Performance Fix Summary" + echo "==============================" + + if [[ $DRY_RUN == "true" ]]; then + log_info "Dry-run mode — no changes were made." + else + log_ok "Fixes applied: $FIXES_APPLIED" + if [[ $FIXES_SKIPPED -gt 0 ]]; then + log_warn "Fixes skipped: $FIXES_SKIPPED" + fi + fi + + echo "" + log_info "Reboot or re-login for xorg changes (Fix 1) to take effect." + log_info "After reboot, verify with: diagnose_arch_performance.sh" +} + +main diff --git a/linux_configuration/scripts/fixes/fix_systemctl.sh b/linux_configuration/scripts/fixes/fix_systemctl.sh index a5a430d..269caa0 100755 --- a/linux_configuration/scripts/fixes/fix_systemctl.sh +++ b/linux_configuration/scripts/fixes/fix_systemctl.sh @@ -10,8 +10,18 @@ set -euo pipefail SERVICE_NAME="media-organizer" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" -ORGANIZE_SCRIPT="/home/kuhy/linux-configuration/scripts/utils/organize_downloads.sh" -TARGET_USER="kuhy" + +DEFAULT_ORGANIZE_SCRIPT="/home/kuhy/testsAndMisc/linux_configuration/scripts/utils/organize_downloads.sh" +LEGACY_ORGANIZE_SCRIPT="/home/kuhy/linux-configuration/scripts/utils/organize_downloads.sh" +if [[ -f $DEFAULT_ORGANIZE_SCRIPT ]]; then + ORGANIZE_SCRIPT="$DEFAULT_ORGANIZE_SCRIPT" +elif [[ -f $LEGACY_ORGANIZE_SCRIPT ]]; then + ORGANIZE_SCRIPT="$LEGACY_ORGANIZE_SCRIPT" +else + ORGANIZE_SCRIPT="$DEFAULT_ORGANIZE_SCRIPT" +fi + +TARGET_USER="${SUDO_USER:-kuhy}" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" diff --git a/linux_configuration/scripts/fixes/nvidia_troubleshoot.sh b/linux_configuration/scripts/fixes/nvidia_troubleshoot.sh index 89df339..142b8f2 100755 --- a/linux_configuration/scripts/fixes/nvidia_troubleshoot.sh +++ b/linux_configuration/scripts/fixes/nvidia_troubleshoot.sh @@ -69,17 +69,20 @@ configure_xorg() { backup_file "$NVIDIA_CONF" # Create NVIDIA-specific configuration + # NOTE: RenderAccel must be "true" (or omitted, since it defaults to true). + # Setting it to "false" forces software rendering, causing Xorg to consume + # 30%+ CPU on the desktop and making the system feel extremely sluggish. cat > "$NVIDIA_CONF" << EOF -# NVIDIA configuration with RenderAccel disabled +# NVIDIA configuration - hardware acceleration enabled # Created by nvidia_troubleshoot.sh on $(date) Section "Device" Identifier "NVIDIA Card" Driver "nvidia" - Option "RenderAccel" "false" + Option "RenderAccel" "true" EndSection EOF - echo "✓ Created $NVIDIA_CONF with RenderAccel disabled" + echo "✓ Created $NVIDIA_CONF with RenderAccel enabled" } # Function to add GCC mismatch workaround