Kapazität ist die Gesamtmenge einer Ressource (CPU, GPU usw.), die ein Gerät über einen bestimmten Zeitraum besitzt. Auf dieser Seite wird beschrieben, wie Sie kapazitätsbezogene Jank-Probleme identifizieren und beheben können.
Der Gouverneur reagiert nur langsam
Um Ruckeln zu vermeiden, muss der CPU-Frequenzregler in der Lage sein, schnell auf hohe Arbeitslasten zu reagieren. Die meisten UI-Anwendungen folgen demselben Grundmuster:
- Der Benutzer liest den Bildschirm.
- Der Benutzer berührt den Bildschirm: tippt auf eine Schaltfläche, scrollt usw.
- Als Reaktion auf Eingaben scrollt der Bildschirm, ändert die Aktivität oder wird auf irgendeine Weise animiert.
- Das System wird in den Ruhezustand versetzt, wenn neue Inhalte angezeigt werden.
- Der Benutzer liest wieder den Bildschirm.
Pixel- und Nexus-Geräte implementieren Touch Boost, um das Verhalten des CPU-Frequenzreglers (und -planers) bei Berührung zu ändern. Um einen langsamen Anstieg auf eine hohe Taktfrequenz zu vermeiden (was dazu führen könnte, dass das Gerät bei Berührung Frames auslässt), legt Touch Boost normalerweise eine Frequenzuntergrenze auf der CPU fest, um sicherzustellen, dass bei Berührung ausreichend CPU-Kapazität verfügbar ist. Ein Boden hält nach der Berührung eine gewisse Zeit lang an (normalerweise etwa zwei Sekunden).
Pixel nutzt außerdem die von Energy Aware Scheduling (EAS) bereitgestellte cgroup schedtune als zusätzliches Touch-Boost-Signal: Top-Anwendungen erhalten über schedtune zusätzliches Gewicht, um sicherzustellen, dass sie genügend CPU-Kapazität erhalten, um schnell ausgeführt zu werden. Beim Nexus 5X und 6P ist der Leistungsunterschied zwischen den kleinen und großen CPU-Clustern (A53 bzw. A57) deutlich größer als beim Pixel mit der Kryo-CPU. Wir haben festgestellt, dass der kleine CPU-Cluster nicht immer für eine reibungslose Darstellung der Benutzeroberfläche ausreicht, insbesondere angesichts anderer Jitterquellen auf dem Gerät.
Dementsprechend ändert Touch Boost beim Nexus 5X und 6P das Scheduler-Verhalten, um die Wahrscheinlichkeit zu erhöhen, dass Vordergrundanwendungen auf die großen Kerne verlagert werden (dies ähnelt konzeptionell der Untergrenze der CPU-Frequenz). Ohne die Änderung des Planers, die die Wahrscheinlichkeit erhöht, dass Vordergrundanwendungen in den großen CPU-Cluster verschoben werden, verfügen Vordergrundanwendungen möglicherweise nicht über genügend CPU-Kapazität zum Rendern, bis der Planer beschließt, die Last des Threads auf einen großen CPU-Kern zu verteilen. Durch die Änderung des Scheduler-Verhaltens während des Touch-Boosts ist es wahrscheinlicher, dass ein UI-Thread sofort auf einem großen Kern ausgeführt wird und ein Ruckeln vermieden wird, während er nicht gezwungen wird, immer auf einem großen Kern ausgeführt zu werden, was schwerwiegende Auswirkungen auf den Stromverbrauch haben könnte.
Thermische Drosselung
Eine thermische Drosselung tritt auf, wenn das Gerät seine Gesamtwärmeleistung reduzieren muss, was normalerweise durch Reduzierung der CPU-, GPU- und DRAM-Takte geschieht. Es überrascht nicht, dass dies häufig zu Störungen führt, da das System möglicherweise nicht mehr genügend Kapazität zum Rendern innerhalb einer bestimmten Zeitscheibe bereitstellen kann. Die einzige Möglichkeit, thermisches Throttling zu vermeiden, besteht darin, weniger Strom zu verbrauchen. Es gibt nicht viele Möglichkeiten, dies zu tun, aber basierend auf unseren Erfahrungen mit früheren SOCs haben wir einige Empfehlungen für Systemanbieter.
Stellen Sie beim Aufbau eines neuen SOC mit heterogenen CPU-Architekturen zunächst sicher, dass sich die Leistungs-/W-Kurven der CPU-Cluster überlappen. Die Gesamtleistungs-/W-Kurve für den gesamten Prozessor sollte eine durchgehende Linie sein. Diskontinuitäten in der Leistungs-/W-Kurve zwingen den Planer und den Frequenzregler dazu, abzuschätzen, was eine Arbeitslast benötigt. Um Ruckeln zu verhindern, sind der Scheduler und der Frequenzregler der Meinung, dass sie der Arbeitslast mehr Kapazität geben, als sie benötigt. Dies führt dazu, dass zu viel Strom verbraucht wird, was zur thermischen Drosselung beiträgt.
Stellen Sie sich ein hypothetisches SOC mit zwei CPU-Clustern vor:
- Cluster 1, der kleine Cluster, kann zwischen 100 und 300 mW verbrauchen und erreicht in einem Durchsatz-Benchmark je nach Takt 100 bis 300 Punkte.
- Cluster 2, der große Cluster, kann zwischen 1000 und 1600 mW verbrauchen und erzielt je nach Takt im gleichen Durchsatz-Benchmark Werte zwischen 800 und 1200.
In diesem Benchmark ist eine höhere Punktzahl schneller. Obwohl nicht wünschenswerter als langsamer, schneller == höherer Stromverbrauch.
Wenn der Planer davon ausgeht, dass eine UI-Arbeitslast das Äquivalent einer Punktzahl von 310 bei diesem Durchsatz-Benchmark erfordern würde, besteht die beste Option zur Vermeidung von Störungen darin, den großen Cluster mit der niedrigsten Frequenz auszuführen, was zu erheblicher Energieverschwendung führt. (Dies hängt vom CPU-Verhalten und dem Wettlauf in den Leerlauf ab; SOCs mit kontinuierlichen Leistungs-/W-Kurven lassen sich leichter optimieren.)
Zweitens: Verwenden Sie CPU-Sets. Stellen Sie sicher, dass Sie cpusets in Ihrem Kernel und in Ihrer BoardConfig.mk
aktiviert haben. Sie müssen auch die tatsächlichen CPU-Set-Zuweisungen in Ihrer gerätespezifischen init.rc
einrichten. Einige Anbieter lassen dies in ihren BSPs deaktiviert, in der Hoffnung, dass sie andere Hinweise verwenden können, um das Verhalten des Schedulers zu beeinflussen. Wir sind der Meinung, dass dies keinen Sinn ergibt. cpusets sind nützlich, um sicherzustellen, dass der Lastausgleich zwischen CPUs so erfolgt, dass er widerspiegelt, was der Benutzer tatsächlich auf dem Gerät tut.
ActivityManager weist Apps basierend auf der relativen Wichtigkeit dieser Apps (oben, Vordergrund, Hintergrund) verschiedenen CPU-Sets zu, wobei wichtigere Anwendungen mehr Zugriff auf CPU-Kerne erhalten. Dies trägt dazu bei, die Servicequalität für Vordergrund- und Top-Apps sicherzustellen.
cpusets sind bei homogenen CPU-Konfigurationen nützlich, Sie sollten jedoch kein Gerät mit einer heterogenen CPU-Konfiguration ohne aktivierte cpusets versenden. Nexus 6P ist ein gutes Modell für die Verwendung von CPU-Sets in heterogenen CPU-Konfigurationen; Verwenden Sie dies als Grundlage für die Konfiguration Ihres eigenen Geräts.
CPU-Sets bieten auch Leistungsvorteile, indem sie sicherstellen, dass Hintergrundthreads, die nicht leistungskritisch sind, niemals eine Lastverteilung auf große CPU-Kerne erhalten, wo sie erheblich mehr Energie verbrauchen könnten, ohne dass der Benutzer davon einen Nutzen erfährt. Dies kann auch dazu beitragen, eine thermische Drosselung zu vermeiden. Während die thermische Drosselung ein Kapazitätsproblem darstellt, haben Jitter-Verbesserungen bei thermischer Drosselung einen großen Einfluss auf die UI-Leistung. Da das System näher an seine Fähigkeit herankommt, 60 FPS zu rendern, ist weniger Jitter erforderlich, um einen Frame-Ausfall zu verursachen.