Verstehen der von Prozessen im Benutzer-/Kernelbereich verbrachten CPU-Zeit

Verstehen der von Prozessen im Benutzer-/Kernelbereich verbrachten CPU-Zeit

Ich habe eine Anwendung, die normalerweise meldet ( timeBefehl meldet):

real 1.59
user 1.42
sys 4.73

Wenn ich jedoch eine gemeinsam genutzte Bibliothek lade und ausführe, steigt die Zeit erheblich an ( timeBefehl meldet):

real 28.51
user 106.22
sys 5.23

Während aufgrund der Arbeit meiner gemeinsam genutzten Bibliothek eine gewisse Steigerung der Ausführung zu erwarten ist (unter CentOS und Ubuntu wird eine Steigerung um das 2- bis 4-fache gemeldet – was erwartungsgemäß ist), ist die oben unter Fedora 24 gemeldete Zeit zu hoch.

Ich habe versucht, es zu verwenden perf, und es wurde Folgendes gemeldet:

     255352.948615      task-clock:u (msec)       #    3.895 CPUs utilized
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
            18,127      page-faults:u             #    0.071 K/sec
   664,852,184,198      cycles:u                  #    2.604 GHz                      (50.03%)
    19,323,811,463      stalled-cycles-frontend:u #    2.91% frontend cycles idle     (50.02%)
   578,178,881,331      stalled-cycles-backend:u  #   86.96% backend cycles idle      (50.02%)
   110,595,196,687      instructions:u            #    0.17  insn per cycle
                                                  #    5.23  stalled cycles per insn  (50.00%)
    28,361,633,658      branches:u                #  111.068 M/sec                    (50.01%)
       777,249,031      branch-misses:u           #    2.74% of all branches          (50.01%)

      65.564158710 seconds time elapsed

Dies scheint zu bedeuten, dass die CPU lange Zeit im Leerlauf ist. Aber ich versuche herauszufinden, wo das im Code passiert (ich habe Zugriff auf den gesamten Quellcode sowohl meiner Anwendung als auch der betreffenden gemeinsam genutzten Bibliothek). Ich habe auch gesehen, perf reportdass die in Funktionen/Systemaufrufen aufgewendete Zeit in Prozent angegeben wird. Aber ich bin an einer noch feineren Ebene interessiert, d. h. an der/den Zeile(n) in diesen Funktionen, damit ich verstehen kann, warum.

Ich weiß, dass es nicht einfach ist, konkrete Ratschläge zu geben, da ich nicht viele Informationen zu meiner Anwendung/gemeinsam genutzten Bibliothek bereitgestellt habe. Ich suche nur nach Vorschlägen/Tools/Ideen, um herauszufinden, wo die CPU die meiste Zeit im Code verbringt (oder im Leerlauf ist).

Es ist ein Fedora 24 Linux/x86_64 mit glibc 2.23 (sowohl meine Anwendung als auch meine gemeinsam genutzte Bibliothek sind mit gcc 6.1.1 und glibc 2.23 kompiliert).

Antwort1

Dies scheint darauf hinzudeuten, dass die CPU längere Zeit im Leerlauf ist.

Ja. Und zwar 87 % der Zeit. Das heißt aber nicht, dass der Prozessor nicht an anderen Aufgaben und Prozessen arbeitet.

   664,852,184,198      cycles:u                  #    2.604 GHz                      (50.03%)
    19,323,811,463      stalled-cycles-frontend:u #    2.91% frontend cycles idle     (50.02%)
   578,178,881,331      stalled-cycles-backend:u  #   86.96% backend cycles idle      (50.02%)
   110,595,196,687      instructions:u            #    0.17  insn per cycle

Das Optimieren von Programmen zur besseren Nutzung der CPU und des Speicherzugriffs ist eine komplexe Aufgabe und ohne Code ist es unmöglich, Ihnen detaillierter zu antworten.

verwandte Informationen