Wie man höhere Genauigkeit der "CPU%" als Befehl von OBEN?
Wenn ich OBEN den Befehl hatte, konnte ich die folgende info:
shell@android:/ $ top -n 1
User 31%, System 10%, IOW 0%, IRQ 0%
User 346 + Nice 10 + Sys 120 + Idle 637 + IOW 6 + IRQ 0 + SIRQ 2 = 1121
PID PR CPU% S #THR VSS RSS PCY UID Name
481 1 26% S 89 762832K 81688K fg system system_server
1699 0 5% S 27 676472K 39092K fg u0_a72 wm.cs.systemmonitor
11243 0 3% S 28 673140K 29796K bg u0_a111 com.weather.Weather
13327 2 1% S 23 680472K 35844K bg u0_a83 com.rhmsoft.fm
659 0 1% S 17 663044K 33136K bg u0_a13 android.process.media
20260 1 0% R 1 1208K 508K shell top
Können wir sehen, die CPU%
ist die Runde zu integer, gibt es eine Möglichkeit, ich könnte ein Prozess ist CPU%
mit höherer Präzision?
-- Erläuterungen auf der bounty -- Alex
Die Frage bezieht sich auf Android-system, und vorzugsweise auf einem nicht-gerooteten Gerät. Während Android bietet erweiterte profiling-Techniken für Java-Anwendungen, tools für native code (C++) begrenzt sind. top Befehl auf Android ermöglicht das anzeigen der Statistiken für alle threads in dem system ausgeführt, sowohl von Java-threads-und C++ - threads. Ich bin auf der Suche nach einer Antwort, die helfen, mit der folgenden quest:
Meine app verwendet, die 2% CPU, wenn es inaktiv im hintergrund, während es sollte unter 0.1%. Wenn ich ausführen top -t
bekomme ich 0% für alle 15 threads, die gehören zu meinem Prozess (einige threads sind Java-threads, z.B. den Main-UI-thread; andere sind pthreads, dass nie befestigen JVM). Wie kann ich erraten, welche Gewinde frisst den Akku auf?
Ich würde mich freuen, um noch mehr details über diese unerwartete Aktivität, und Android bietet große Helfer wie TraceView für Java-threads. Jede Einsicht bezüglich der Werkzeuge für native code wird sehr geschätzt werden.
- würde nicht viel Unterschied....
- Ja, es macht keinen Unterschied. Ansonsten, bitte helfen Sie mir, ein Profil der Anwendung, die mit 2% die CPU im hintergrund. Wenn ich
top -t
, bekomme ich 0% für alle 15 threads, die gehören zu meinem Prozess. Wie kann ich erraten, welche Gewinde frisst den Akku auf? - Ich habe nicht gesagt, es würde keinen Unterschied machen; ich sagte: "würde nicht viel Unterschied"
- Mitch hat Recht. Sie können nicht wirklich brauchen, die Präzision. Was ist, wenn 10 von 15 0.0% CPU-Auslastung. Die meisten der Zeit, ist der Fall mit der hintergrund-Prozesse. <1% ist gut genug für die Nichtbeachtung der non-CPU-intensive Prozesse.
- user568109: 15 threads, die alle 0% anzeigen. Aber zusammen ergeben Sie geben Recht deutliche 2%. Einige threads sind Java, und es gibt SDK-tools zu überwachen, Ihr Verhalten. Andere sind C++, und ich wollte aus einem einfachen
top
Befehl genug hibts, mir zu helfen, finden Sie die 2, die verantwortlich sind für die meisten Konsum. - Ich werde Sie nicht posten, weil ich nicht haben einen Weg, um zu testen, aber Sie sollten in der Lage sein, um rohe Informationen über die einzelnen thread ' s cpu-Nutzung in der Uhr tickt in
/proc/[pid]/task/[thread name]
. Das ist so genau, wie Sie in der Lage zu bekommen. Sehenhttp://man7.org/linux/man-pages/man5/proc.5.html
. - "Wie kann ich erraten, welche Gewinde frisst den Akku auf?" -- ähm, wäre es nicht der thread nicht blockiert sehr lange (z.B., polling, busy-waiting)? Ist das nicht eine Frage der code-review, um so mehr, als Werkzeuge?
- definitiv, das ist ein bug in meiner app. Aber ein komplettes code-review, dass würde das Problem beheben, ist jenseits meiner Fähigkeiten. Wenn ich könnte, konzentrieren Sie sich auf einen thread ist, wäre es möglich.
- bitte geben Sie eine Antwort mit dem Inhalt Ihres Kommentars, die es verdient, die bounty. Die Befehlszeile ist
adb shell cat /proc/${pid}/task/*/stat | awk -F\ '{print $1, $14}'
(beachten Sie, dass awk auf dem host ausgeführt wird). - Okay danke. Ich habe einen Artikel veröffentlichen. Es funktioniert auf meinem Rechner auch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nicht erwähnt in deinem post, aber in den Kommentar, Sie haben gesagt, dass Sie wirklich brauchen, die CPU-Auslastung pro thread, nicht pro Prozess.
Wenn Sie nicht finden können, ein tool, das präzise genug ist, können Sie sich direkt in
/proc/[pid]/task/[ThreadName]
wie beschrieben in die man-Seite für/proc
. Diese gibt die Gesamt-CPU-Zeit verbraucht, die in "clock-ticks", die seit der Ausführung begann. Besser Auflösung als das ist wahrscheinlich schwierig oder unmöglich.Bearbeiten
Aus der OP ' s Kommentar, ein Befehl, Listen die relevanten Informationen:
Diese nur
cat
s die richtige/proc
Dateien auf dem debugging-host, läuft ein winzigesawk
Programm zum drucken der Spalten fürpid
unduser time
. Man könnte auch einfach nutzencut -d " " -f1,14
oder etwas ähnliches inperl
erhalten Sie die Spalten, wennawk
ist nicht verfügbar./proc/<pid>/schedstat
und/proc/<pid>/task/<tid>/schedstat
). Die drei Felder sind: verbrachte Zeit auf der CPU, Wartezeit auf eine runqueue; # der timeslices laufen auf der CPU. Einige OEMs nicht aktivieren diese Funktion in den kernel wenn.Versuchen Sie dies:
EDIT:
Können Sie adb shell und busybox (http://www.busybox.net/downloads/BusyBox.html)
adb shell busybox top
(Entnommen aus hier)
Habe diese Informationen von einem anderen thread:
3) Erste CPU-info
~$ adb shell dumpsys cpuinfo
Ausgabe:
Laden: 0.08 /0.4 /0.64
CPU-Auslastung von 42816ms zu 34683ms vor:
system_server: 1% = 1% user + 0% kernel /faults: 16-Moll
kdebuglog.sh: 0% = 0% user + 0% kernel /faults: 160-Moll
tiwlan_wq: 0% = 0% user + 0% kernel
usb_mass_storag: 0% = 0% user + 0% kernel
pvr_workqueue: 0% = 0% user + 0% kernel
+schlafen: 0% = 0% user + 0% kernel
+schlafen: 0% = 0% user + 0% kernel
GESAMT: 6% = 1% user + 3% kernel + 0% irq
EDIT:
Können Sie auch versuchen, mit diesem Befehl:
echo $(adb shell ps | grep com.android.phone | awk '{ system("adb shell cat /proc/" $2 "/stat");}' | awk '{print $14+$15;}')
Auch:
mithilfe von oben : Dies wird Ihnen zeigen, den cpu-stats
top -b -n 1 |grep ^Cpu
mithilfe ps: Dies zeigt die % - cpu-Auslastung für jeden Prozess.
ps -eo pcpu,pid,user,args | sort -r -k1 | less
EDIT2:
In realtion auf Ihre Kommentare und die bounty-Beschreibung (Wie kann ich erraten, welche Gewinde frisst das Akku?) Ich habe eine interessante Seite gefunden:
http://ziyang.eecs.umich.edu/projects/powertutor/
Als dort angegeben:
Versuchen, diese für eine Instanz und sehen, ob es Ihren Anforderungen entspricht.
LETZTE ÄNDERUNG:
Check-out die Systrace-Dokumentation auf der developer.android.com Ort:
http://developer.android.com/tools/debugging/systrace.html
http://developer.android.com/tools/help/systrace.html
Tut mir Leid, wenn du das schon versucht, aber das ist eine konkrete Methode zur Messung der Leistung.
ps
auf meinen Geräten nicht unterstützt-eo
.Verwenden DDMS und Methode-profiling um eine TraceView.
Grundsätzlich:
Mehr details hier:
http://developer.android.com/tools/debugging/debugging-tracing.html
Haftungsausschluss: ich habe nur getan, dies mit einem einfachen test app, damit ich weiß nicht, wie viel Laufleistung Sie erhalten aus ihm heraus. Scheint es zu geben, ein bisschen mehr Präzision als das, was beschrieben wurde, so weit, und erfordert keine root.