Mesurer les performances avec le profileur intégré

  • Raccourci de la révision : Performance/Profiling_with_the_Built-in_Profiler
  • Titre de la révision : Mesurer les performances avec le profileur intégré
  • ID de la révision : 303195
  • Créé :
  • Créateur : Jmdesp
  • Version actuelle ? Non
  • Commentaire

Contenu de la révision

{{ gecko_minversion_header("16.0") }}

Firefox a maintenant un profileur intégré (nom de code SPS). Ce profileur permet, entre autre, de mieux mesurer la réactivité, de déterminer plus précisément à quoi est dû un changement dans les performances, et s'exécute dans des environnements et des plate formes dans lesquels les profileur externe ne sont pas généralement disponible tel que l'ordinateur d'un utilisateur standard, ou un appareil Android fermé par son constructeur.

Note: La plate forme technique du profileur est terminée, mais nous travaillons encore sur l'ajout de fonctionnalités. Surveillez le composant "Gecko Profiler" dans Bugzilla pour plus d'information.

"Stackwalking" contre "pseudostack"

Le profileur est conçu pour opérer dans deux modes différents: "Pseudostack" (par défaut) ou "stackwalking".

Pseudostack

Pseudostack (le défaut) requiert une version de Firefox qui a été intrumentée au niveau du code source avec SAMPLE_LABEL("NAMESPACE", "NAME");'. Ceci ajoute un élément dans la pile d'appel qui est utilisé par le profileur pour déterminer par échantillonnage quel code est en train de s'exécuter. Ce mode est compatible avec toutes les architecture et environnements techniques.

For this to be effective, you do need to liberally use SAMPLE_LABEL throughout the code, and unfortunately it won't be able to dig into system library and drivers.

Because of the small overhead of the instrumentation, the sample label shouldn't be placed inside hot loops. A profile reporting that a large portion is spent in "Unknown" code indicates that the area being executed doesn't have sample label. As we focus on using this tool and add additional sample labels this will improve.

"Stackwalking"

"Stackwalking" est une fonctionnalité dépendant de l'architecture de la plate forme d'exécution dont le support est encore incomplet. L'objectif est de déterminer quel code s'exécute en parcourant la pile des appels sans instrumentation, sur les architectures où cela est possible. Ceci permet d'avoir plus de détails sur les appels, et aide à analyser les problèmes dans lesquels du temps est passé dans les librairies systèmes ou les drivers. Nous travaillons sur les fonctions nécessaire pour ce parcours de pile et l'identification des symboles, et toute aide est la bienvenue.

Disponibilité

Le profileur fonctionne en mode soit "Pseudostack" soit "stackwalking" en fonction de votre environment. Voir la description au-dessus pour les différence entre ses 2 modes.

  Compilé en local Version "Nightly" Version officielle (Gecko 15.0+)
Windows Stackwalking (étapes de configuration à suivre) Stackwalking Pseudostack
Mac Stackwalking Stackwalking Pseudostack
Linux Pseudo stack (Bug concernant l'activation du stackwalking) Pseudo stack (Bug concernant l'activation du stackwalking) Pseudostack
Fennec Pseudostack Non supporté (Bug) Non supporté(Bug)
B2G Pseudostack (patchs à appliquer au source) ??? Non supporté(Bug)

Exécuter le profileur

  1. Utiliser une version "nightly" ou compiler avec ac_add_options --enable-profiling (activez aussi les optimizations afin que que le profilage soit significatif).
  2. Verifiez que vous avez la dernière version de l'extension Profileur. Si le module n'est pas visible, activer 'Affichage ->Barre d'outils->Barre des modules'. Laissez l'extension de mettre à jour.
  3. Contrôler l'exécution du profileur avec les boutons en bas à droite. Utilisez Ctrl-Shift-O (Cmd-Shift-O sur Mac OS X) pour visualiser le résultat en cours.

Profiler une compilation en local sous Windows

If you built Firefox for Windows locally and you would like to use the local symbols with the profiler, you will need to run an additional tool; see Profiling with the Built-in Profiler and Local Symbols on Windows.

Profiler Firefox mobile

  1. You'll need a custom build, this build should be built with optimization, STRIP_FLAGS="--strip-debug" and ac_add_options --disable-elf-hack (until we fix {{bug(747033)}}) but should NOT be built with --enable-profiling.
  2. You'll need to have adb and arm-eabi-addr2line in your bash PATH, so use locate arm-eabi-addr2line (on linux) or mdfind name:arm-eabi-addr2line (on OS X) and stick an export to its location in ~/.bash_profile. The extension will invoke bash to use adb and addr2line.
  3. Install the latest version of the extension in your host machine's Firefox browser that has your phone reachable via ADB.
  4. On your first run use "Get Libs". You'll need to repeat this step when switching phones.
  5. Start Firefox mobile normally and hit "Pull". This will recognize the instance of Firefox mobile and restart it with profiling enabled. Run your benchmark and hit "Pull" again.

Profiler "Boot to Gecko"

Note: Pour l'instant une carte SD est requise, jusqu'à ce que le  {{bug(758697)}} soit fermé.

  1. You'll need a local build of Boot to Gecko; the default build configuration is fine.
  2. You'll need to have adb and arm-eabi-addr2line in your bash PATH, so use locate arm-eabi-addr2line (on linux) or mdfind name:arm-eabi-addr2line (on OS X) and stick an export to its location in ~/.bash_profile. The extension will invoke bash to use adb and arm-eabi-addr2line. If they are not there the process will fail or you'll only see raw addresses
  3. In order to get symbols to work you may need to avoid stripping them. I'm not sure the best way to do this. Some candidates are adding STRIP_FLAGS="--strip-debug"  to gonk-misc/default-gecko-config (this is copied to objdir-gecko/.mozconfig by some part of the build system)
  4. Install the latest version of the extension in your host (Desktop) machine's Firefox browser that has your phone reachable via ADB.
  5. On your first run use "Get Libs". You'll need to repeat this step when switching reflashing/switching phone (this step needs to be done every time you update gecko). "Get Libs" will skip any existing files, so you'll need to delete them so that the new ones get pulled. They are stored in /tmp/[device id]/
  6. Make sure B2G is running and hit "Pull". This will recognize the instance of B2G and restart it with profiling enabled. Run your benchmark and hit "Pull" again.

Profiling content processes. Apply this patch to the profiler add-on.

Warning: When you're done profiling restart Boot to Gecko using adb shell stop b2g && adb shell start b2g.

Contribuer

Le bug listant les problèmes ouverts est le {{ bug("713227") }}. Le source se situe dans {{ Source("tools/profiler") }}.

Le source de l'extension Profileur se trouve sur : https://github.com/bgirard/Gecko-Profiler-Addon.

Le dépôt de source Cleopatra se trouve sur : https://github.com/bgirard/cleopatra.

Fonctionnalités prévues

Here's a list of feature ideas that we haven't committed to yet; feel free to add your ideas:

  • A "Doctor" extension that would detect if the user's browser periodically hangs for more than 500 ms and provide a UI notification with some profile data. The profile data can either be reported to Mozilla to correlate problems, have built in heuristics for resolving the problem (disabling the offending add-on, plug-in tab, db caches etc...), or be used by support for diagnostics.
  • Automatically turn on the profiler a few seconds prior to triggering the hang detectors and attach a profile to the minidump.

Capture d'écran

3b.png

Source de la révision

<p>{{ gecko_minversion_header("16.0") }}</p>
<p>Firefox a maintenant un profileur intégré (nom de code SPS). Ce profileur permet, entre autre, de mieux mesurer la réactivité, de déterminer plus précisément à quoi est dû un changement dans les performances, et s'exécute dans des environnements et des plate formes dans lesquels les profileur externe ne sont pas généralement disponible tel que l'ordinateur d'un utilisateur standard, ou un appareil Android fermé par son constructeur.</p>
<div class="note">
  <strong>Note:</strong> La plate forme technique du profileur est terminée, mais nous travaillons encore sur l'ajout de fonctionnalités. Surveillez le composant "Gecko Profiler" dans <a class="link-https" href="https://bugzilla.mozilla.org/" title="https://bugzilla.mozilla.org/">Bugzilla</a> pour plus d'information.</div>
<h2 id=".22Stackwalking.22_contre_.22pseudostack.22">"Stackwalking" contre "pseudostack"</h2>
<p>Le profileur est conçu pour opérer dans deux modes différents: "Pseudostack" (par défaut) ou "stackwalking".</p>
<h3 id="Pseudostack">Pseudostack</h3>
<p>Pseudostack (le défaut) requiert une version de Firefox qui a été intrumentée au niveau du code source avec <code>SAMPLE_LABEL("NAMESPACE", "NAME");'</code>. Ceci ajoute un élément dans la pile d'appel qui est utilisé par le profileur pour déterminer par échantillonnage quel code est en train de s'exécuter. Ce mode est compatible avec toutes les architecture et environnements techniques.</p>
<p>For this to be effective, you do need to liberally use <code>SAMPLE_LABEL</code> throughout the code, and unfortunately it won't be able to dig into system library and drivers.</p>
<p>Because of the small overhead of the instrumentation, the sample label shouldn't be placed inside hot loops. A profile reporting that a large portion is spent in "Unknown" code indicates that the area being executed doesn't have sample label. As we focus on using this tool and add additional sample labels this will improve.</p>
<h3 id=".22Stackwalking.22">"Stackwalking"</h3>
<p>"Stackwalking" est une fonctionnalité dépendant de l'architecture de la plate forme d'exécution dont le support est encore incomplet. L'objectif est de déterminer quel code s'exécute en parcourant la pile des appels sans instrumentation, sur les architectures où cela est possible. Ceci permet d'avoir plus de détails sur les appels, et aide à analyser les problèmes dans lesquels du temps est passé dans les librairies systèmes ou les drivers. Nous travaillons sur les fonctions nécessaire pour ce parcours de pile et l'identification des symboles, et toute aide est la bienvenue.</p>
<h2 id="Disponibilit.C3.A9">Disponibilité</h2>
<p>Le profileur fonctionne en mode soit "Pseudostack" soit "stackwalking" en fonction de votre environment. Voir la description au-dessus pour les différence entre ses 2 modes.</p>
<table border="1" cellpadding="1" cellspacing="1" class="standard-table">
  <thead>
    <tr>
      <th scope="row">&nbsp;</th>
      <th scope="col">Compilé en local</th>
      <th scope="col">Version "Nightly"</th>
      <th scope="col">Version officielle (Gecko 15.0+)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Windows</th>
      <td>Stackwalking (<a href="/en/Performance/Profiling_with_the_Built-in_Profiler_and_Local_Symbols_on_Windows" title="https://developer.mozilla.org/en/Performance/Profiling_with_the_Built-in_Profiler_and_Local_Symbols_on_Windows">étapes de configuration à suivre</a>)</td>
      <td>Stackwalking</td>
      <td>Pseudostack</td>
    </tr>
    <tr>
      <th scope="row">Mac</th>
      <td>Stackwalking</td>
      <td>Stackwalking</td>
      <td>Pseudostack</td>
    </tr>
    <tr>
      <th scope="row">Linux</th>
      <td>Pseudo stack (<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=757186" title="https://bugzilla.mozilla.org/show_bug.cgi?id=757186">Bug</a> <span class="external">concernant l'activation du</span> stackwalking)</td>
      <td>Pseudo stack (<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=757186" title="https://bugzilla.mozilla.org/show_bug.cgi?id=757186">Bug</a><span class="external"> concernant l'activation du stackwalking</span>)</td>
      <td>Pseudostack</td>
    </tr>
    <tr>
      <th scope="row">Fennec</th>
      <td>Pseudostack</td>
      <td>Non supporté (<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=751034" title="https://bugzilla.mozilla.org/show_bug.cgi?id=751034">Bug</a>)</td>
      <td>Non supporté(<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=751034" title="https://bugzilla.mozilla.org/show_bug.cgi?id=751034">Bug</a>)</td>
    </tr>
    <tr>
      <th scope="row">B2G</th>
      <td>Pseudostack (<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=758697" title="https://bugzilla.mozilla.org/show_bug.cgi?id=758697">patchs à appliquer au source</a>)</td>
      <td>???</td>
      <td>Non supporté(<a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=751034" title="https://bugzilla.mozilla.org/show_bug.cgi?id=751034">Bug</a>)</td>
    </tr>
  </tbody>
</table>
<h2 id="Ex.C3.A9cuter_le_profileur">Exécuter le profileur</h2>
<ol>
  <li>Utiliser une <a class="external" href="http://nightly.mozilla.org/" title="http://nightly.mozilla.org/">version "nightly"</a> ou compiler avec <code>ac_add_options --enable-profiling</code> (activez aussi les optimizations afin que que le profilage soit significatif).</li>
  <li>Verifiez que vous avez <a class="link-https" href="https://github.com/bgirard/Gecko-Profiler-Addon/raw/master/geckoprofiler.xpi" title="https://github.com/bgirard/Gecko-Profiler-Addon/raw/master/geckoprofiler.xpi" type="application/x-xpinstall">la dernière version de l'extension Profileur</a>. <strong>Si le module n'est pas visible, activer 'Affichage -&gt;Barre d'outils-&gt;Barre des modules'</strong>. Laissez l'extension de mettre à jour.</li>
  <li>Contrôler l'exécution du profileur avec les boutons en bas à droite. Utilisez Ctrl-Shift-O (Cmd-Shift-O sur Mac OS X) pour visualiser le résultat en cours.</li>
</ol>
<h3 id="Profiler_votre_compilation_Windows_en_local">Profiler une compilation en local sous Windows</h3>
<p>If you built Firefox for Windows <strong>locally</strong> and you would like to use the local symbols with the profiler, you will need to run an additional tool; see <a href="/en-US/docs/Performance/Profiling_with_the_Built-in_Profiler_and_Local_Symbols_on_Windows" title="/en-US/docs/Performance/Profiling_with_the_Built-in_Profiler_and_Local_Symbols_on_Windows">Profiling with the Built-in Profiler and Local Symbols on Windows</a>.</p>
<h3 id="Profiler_Firefox_mobile">Profiler Firefox mobile</h3>
<ol>
  <li>You'll need a custom build, this build should be built with optimization, <code>STRIP_FLAGS="--strip-debug"</code> and <code>ac_add_options --disable-elf-hack</code> (until we fix {{bug(747033)}}) but should <strong>NOT</strong> be built with <code>--enable-profiling</code>.</li>
  <li>You'll need to have <code>adb</code> and <code>arm-eabi-addr2line</code> in your bash <code>PATH</code>, so use <code>locate arm-eabi-addr2line</code> (on linux) or<code> mdfind name:arm-eabi-addr2line</code> (on OS X) and stick an export to its location in <code>~/.bash_profile</code>. The extension will invoke bash to use <code>adb</code> and <code>addr2line</code>.</li>
  <li>Install the <a class="link-https" href="https://github.com/bgirard/Gecko-Profiler-Addon/raw/master/geckoprofiler.xpi" title="https://github.com/bgirard/Gecko-Profiler-Addon/raw/master/geckoprofiler.xpi">latest version of the extension</a> in your host machine's Firefox browser that has your phone reachable via ADB.</li>
  <li>On your first run use "Get Libs". You'll need to repeat this step when switching phones.</li>
  <li>Start Firefox mobile normally and hit "Pull". This will recognize the instance of Firefox mobile and restart it with profiling enabled. Run your benchmark and hit "Pull" again.</li>
</ol>
<h3 id="Profiler_.22Boot_to_Gecko.22">Profiler "Boot to Gecko"</h3>
<div class="note style-wrap">
  <p><strong>Note:</strong> Pour l'instant une carte SD est requise, jusqu'à ce que le&nbsp; {{bug(758697)}} soit fermé.</p>
</div>
<ol>
  <li>You'll need a local build of Boot to Gecko; the default build configuration is fine.</li>
  <li>You'll need to have <code>adb</code> and <code>arm-eabi-addr2line</code> in your bash <code>PATH</code>, so use <code>locate arm-eabi-addr2line</code> (on linux) or<code> mdfind name:arm-eabi-addr2line</code> (on OS X) and stick an export to its location in <code>~/.bash_profile</code>. The extension will invoke bash to use <code>adb</code> and <code>arm-eabi-</code><code>addr2line</code>. If they are not there the process will fail or you'll only see raw addresses</li>
  <li>In order to get symbols to work you may need to avoid stripping them. I'm not sure the best way to do this. Some candidates are adding <code>STRIP_FLAGS="--strip-debug"</code>&nbsp; to <code>gonk-misc/default-gecko-config</code> (this is copied to <code>objdir-gecko/.mozconfig</code> by some part of the build system)</li>
  <li>Install the <a class="link-https" href="https://github.com/bgirard/Gecko-Profiler-Addon/raw/master/geckoprofiler.xpi" title="https://github.com/bgirard/Gecko-Profiler-Addon/raw/master/geckoprofiler.xpi">latest version of the extension</a> in your host (Desktop) machine's Firefox browser that has your phone reachable via ADB.</li>
  <li>On your first run use "Get Libs". You'll need to repeat this step when switching reflashing/switching phone (this step needs to be done every time you update gecko). "Get Libs" will skip any existing files, so you'll need to delete them so that the new ones get pulled. They are stored in <code>/tmp/[device id]</code>/</li>
  <li>Make sure B2G is running and hit "Pull". This will recognize the instance of B2G and restart it with profiling enabled. Run your benchmark and hit "Pull" again.</li>
</ol>
<p>Profiling content processes. Apply this <a href="http://people.mozilla.com/~jmuizelaar/b2g-child-process-profile.patch" title="http://people.mozilla.com/~jmuizelaar/b2g-child-process-profile.patch">patch</a> to the profiler add-on.</p>
<div class="warning style-wrap">
  <p><strong>Warning:</strong> When you're done profiling restart Boot to Gecko using <code>adb shell stop b2g &amp;&amp; adb shell start b2g</code>.</p>
</div>
<h2 id="Contribuer">Contribuer</h2>
<p>Le bug listant les problèmes ouverts est le {{ bug("713227") }}. Le source se situe dans {{ Source("tools/profiler") }}.</p>
<p>Le source de l'extension Profileur se trouve sur : <a class="link-https" href="https://github.com/bgirard/Gecko-Profiler-Addon" rel="freelink">https://github.com/bgirard/Gecko-Profiler-Addon</a>.</p>
<p>Le dépôt de source&nbsp;Cleopatra se trouve sur : <a class="link-https" href="https://github.com/bgirard/cleopatra" rel="freelink">https://github.com/bgirard/cleopatra</a>.</p>
<h2 id="Fonctionnalit.C3.A9s_pr.C3.A9vues">Fonctionnalités prévues</h2>
<p>Here's a list of feature ideas that we haven't committed to yet; feel free to add your ideas:</p>
<ul>
  <li>A "Doctor" extension that would detect if the user's browser periodically hangs for more than 500 ms and provide a UI notification with some profile data. The profile data can either be reported to Mozilla to correlate problems, have built in heuristics for resolving the problem (disabling the offending add-on, plug-in tab, db caches etc...), or be used by support for diagnostics.</li>
  <li>Automatically turn on the profiler a few seconds prior to triggering the hang detectors and attach a profile to the minidump.</li>
</ul>
<h2 id="Capture_d'.C3.A9cran">Capture d'écran</h2>
<p><a href="/@api/deki/files/6062/=profiler.png" title="profiler.png"><img alt="3b.png" class="internal default" src="/@api/deki/files/6191/=3b.png" style="width: 803px; height: 562px;" /></a></p>
Revenir à cette révision