Collecter et afficher des traces

Cette page fournit des instructions détaillées pour collecter des traces Perfetto à utiliser avec Wattson et pour analyser les données de puissance résultantes dans l'UI Perfetto.

Bien qu'il existe de nombreuses façons de collecter une trace Perfetto, les méthodes présentées sur cette page incluent les exigences et les workflows spécifiques pour générer une trace compatible avec Wattson.

Exigences minimales concernant la version

Pour vérifier que Wattson dispose des métadonnées requises pour fonctionner correctement, vous devez collecter des traces à partir d'un appareil exécutant une version récente. Les versions minimales de compilation pour l'estimation de la puissance du processeur et du GPU varient selon l'appareil.

Appareil Exigences minimales concernant la compilation : estimation du processeur Configuration minimale requise : estimation du GPU
Pixel Watch 2 Aucune version minimale requise Non disponible
Pixel Watch 3 25Q2 Non disponible
Pixel 6 Aucune version minimale requise 25Q2
Pixel 9 25Q2 Non disponible

Collecter une trace Perfetto à partir de la ligne de commande

Cette section présente un exemple de workflow pour collecter des traces Perfetto à utiliser avec Wattson. Toutes les commandes listées dans les étapes suivantes doivent être émises à partir de l'hôte Android Debug Bridge (adb).

  1. Configurez et démarrez le traçage en créant un fichier de configuration Perfetto sur l'appareil. Vous trouverez un exemple de configuration à l'adresse wattson.cfg dans l'arborescence source.

    Votre configuration doit inclure les événements de trace suivants :

    # Polls CPU freq/idle state at the start of trace
    data_sources: {
       config {
          name: "linux.sys_stats"
          sys_stats_config {
             # Large period so polling doesn't happen continuously
             # Intent is just to poll once upfront
             cpufreq_period_ms: 100000000
             cpuidle_period_ms: 100000000
          }
       }
    }
    data_sources: {
       config {
          name: "linux.ftrace"
          ftrace_config {
             ftrace_events: "devfreq/devfreq_frequency"
             ftrace_events: "cpuhp/cpuhp_enter"
             ftrace_events: "cpuhp/cpuhp_exit"
             ftrace_events: "cpuhp/cpuhp_multi_enter"
             ftrace_events: "power/cpu_frequency"
             ftrace_events: "power/cpu_idle"
             ftrace_events: "power/suspend_resume"
          }
       }
    }
    
  2. Pour activer les estimations de la consommation d'énergie du cache L3, activez l'événement fttrace/print :

    adb shell perfetto --txt -c /data/misc/perfetto-configs/wattson.cfg --background-wait -o /data/misc/perfetto-traces/trace
    
    # Optional
    adb shell simpleperf stat -a -e arm_dsu_0/l3d_cache/,arm_dsu_0/bus_access/ --interval 10
    
  3. (Facultatif) Définissez le début de la fenêtre Wattson, un repère intégré à la trace Perfetto qui indique le début de l'enregistrement. Ce marqueur améliore la précision de la mesure Wattson.

    # Optional
    adb shell "echo 'I|0|wattson_start' >/sys/kernel/tracing/trace_marker"
    
  4. Exécutez la charge de travail qui vous intéresse.

  5. (Facultatif) Activez l'événement de trace ftrace/print pour définir la fin de la fenêtre Wattson :

    # Optional
    adb shell "echo 'I|0|wattson_stop' >/sys/kernel/tracing/trace_marker"
    
  6. Videz les tampons de trace et récupérez le fichier de trace Perfetto :

    adb shell killall -w perfetto
    adb pull /data/misc/perfetto-traces/trace my_perfetto_trace.pb
    

Collecter une trace Perfetto à l'aide de l'UI Perfetto

Pour collecter des traces à l'aide de l'interface utilisateur Perfetto, vous devez activer des paramètres spécifiques pour Wattson. Lorsque vous enregistrez une nouvelle trace dans l'interface utilisateur Perfetto, activez les options Détails de la planification et Fréquence du processeur et états inactifs :

Boutons bascule pour les détails de la planification, la fréquence du processeur et les états d'inactivité

Figure 1 : Boutons bascule pour les détails de planification, la fréquence du processeur et les états d'inactivité.

Pour les appareils Pixel 9, sous les paramètres Ftrace, cochez la case devfreq pour activer la collecte de la fréquence de l'appareil :

Activer la fréquence par appareil

Figure 2. Activez la fréquence par appareil.

Utiliser l'UI Wattson

Avec Perfetto, analysez les estimations de puissance Wattson en sélectionnant une plage de temps pour afficher les statistiques par rail, ou activez des configurations de trace spécifiques pour attribuer la consommation d'énergie au niveau du thread, du processus ou du package.

Afficher la répartition par rail

Pour interagir avec Wattson dans Perfetto :

  1. Ouvrez une trace dans Perfetto.

    Si votre appareil est compatible avec Wattson, les traces Wattson sont automatiquement listées :

    Afficher les traces Wattson dans Perfetto

    Figure 3. Affichez les traces Wattson dans Perfetto.

  2. Cliquez sur Wattson pour développer la section et afficher la répartition par rail virtuel :

    • Tous les graphiques de rails sont automatiquement mis à l'échelle sur la même valeur pour afficher la proportion entre les rails.

    • Des statistiques sont générées pour chaque région sélectionnée (ou marquée) par l'utilisateur.

    • Vous pouvez trier le tableau de statistiques en cliquant sur le nom d'une colonne.

    • Les totaux des estimations sont affichés directement sous les titres des colonnes.

    Estimations pour les trajets en train

    Figure 4. Estimations pour les trajets en train.

Afficher les attributions de trace par thread, processus ou package

Si vous avez activé les traces du planificateur et que vous pouvez voir les tranches de threads dans Perfetto, vous pouvez également obtenir l'attribution de la puissance ou de l'énergie au niveau du thread ou du processus :

  1. Dans Perfetto, sélectionnez une région de tranches de threads.
  2. Affichez la répartition du thread, du processus ou du package.

Comme pour les statistiques sur les pistes par rail, vous pouvez cliquer sur n'importe quel nom de colonne pour trier les données en fonction de cette colonne.

Analyser la répartition au niveau des threads

En plus des exigences minimales pour l'estimation de base de la puissance, vous devez ajouter la configuration suivante à la section linux.ftrace du fichier wattson.cfg pour l'attribution de la puissance au niveau de chaque thread :

data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "sched/sched_switch"
        }
    }
}

Répartitions au niveau des fils de discussion

Figure 5. Répartition au niveau du fil de discussion.

Répartition au niveau du processus

L'attribution au niveau du processus nécessite l'activation de process_states sur les données collectées dans la trace Perfetto. Activez la source de données suivante dans votre fichier de configuration wattson.cfg :

data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
        process_stats_config {
            scan_all_processes_on_start: true
        }
    }
}

Par répartition des processus

Figure 6. Par répartition du processus.

Répartition au niveau du package

L'attribution au niveau du package nécessite que android.packages_list soit activé sur les données collectées dans la trace Perfetto. Activez la source de données suivante dans votre fichier de configuration wattson.cfg :

data_sources {
  config {
    name: "android.packages_list"
    target_buffer: 1
  }
}

Comme pour l'attribution au niveau du thread et du processus, lorsque vous sélectionnez une plage de tranches de thread, examinez la répartition au niveau du package.

Répartition au niveau des threads

Figure 7. Répartition au niveau du fil de discussion.

Questions fréquentes

Voici quelques questions fréquentes sur Wattson.

Wattson est-il censé correspondre à la sortie du matériel de mesure de la puissance en laboratoire ?

Pour la plupart des charges de travail, l'estimation Wattson correspond aux mesures matérielles de l'alimentation du laboratoire. Toutefois, ce n'est pas toujours le cas et ce n'est pas l'objectif de Wattson.

Wattson est conçu pour valider les améliorations de la consommation électrique ou détecter les régressions de la consommation électrique sans bruit provenant de facteurs environnementaux (température), des variations d'unité à unité dans les fuites de puce (le même SoC peut avoir des fuites différentes par unité) ou des différences de calibration entre les équipements de mesure de la consommation électrique en laboratoire.

En quoi Wattson est-il plus utile que le temps de processeur ou les cycles de processeur ?

Le temps et les cycles de processeur ne tiennent pas compte de la différence de consommation d'énergie entre les fréquences et les types de processeur (petit, moyen ou grand).

Une fréquence de processeur doublée n'entraîne pas toujours une puissance ou des performances doublées.

Wattson est-il précis par rapport aux solutions matérielles ?

Nous avons comparé Wattson à du matériel de mesure de la puissance en laboratoire dans plusieurs cas d'utilisation fournis par différentes équipes. L'erreur moyenne dans Wattson est de 1 point de pourcentage et l'écart-type est de 1,5 point de pourcentage. Ce niveau de corrélation est maintenu pour les tests de 10 secondes à ceux de 4 heures. Il n'y a donc pas d'augmentation ni de masquage des erreurs en fonction du temps.

Expériences de configuration du noyau Pixel 6

Voici quelques expériences de base de répartition Wattson typiques utilisant le Pixel 6 :

Wattson.cfg

Cette section fournit la configuration typique pour activer Wattson sur Perfetto :

  write_into_file: true
  flush_period_ms: 30000
  file_write_period_ms: 30000

  buffers: {
      size_kb: 2048
      fill_policy: RING_BUFFER
  }
  buffers: {
      size_kb: 200000
      fill_policy: RING_BUFFER
  }

  # Needed for process level power attribution
  data_sources: {
      config {
          name: "linux.process_stats"
          target_buffer: 0
          process_stats_config {
              scan_all_processes_on_start: true
          }
      }
  }

  # Needed for package level power attribution
  data_sources: {
      config {
          name: "android.packages_list"
          target_buffer: 0
      }
  }

  # Needed for determining CPU freq/idle initial state
  data_sources: {
      config {
          name: "linux.sys_stats"
          sys_stats_config {
              cpufreq_period_ms: 100000000
              cpuidle_period_ms: 100000000
          }
      }
  }

  # Needed for estimating power and thread level power attribution
  data_sources: {
      config {
          name: "linux.ftrace"
          target_buffer: 1
          ftrace_config {
              # Minimum data sources for estimating power
              ftrace_events: "power/cpu_frequency"
              ftrace_events: "power/cpu_idle"
              ftrace_events: "power/suspend_resume"
              ftrace_events: "cpuhp/cpuhp_enter"
              ftrace_events: "cpuhp/cpuhp_exit"
              ftrace_events: "cpuhp/cpuhp_multi_enter"
              ftrace_events: "devfreq/devfreq_frequency"

              # Needed for Wattson start/stop markers
              ftrace_events: "ftrace/print"

              # Needed for thread level power attribution
              ftrace_events: "sched/sched_switch"

              # Needed for process level power attribution
              ftrace_events: "sched/sched_process_free"
              ftrace_events: "task/task_newtask"
              ftrace_events: "task/task_rename"
          }
      }
  }