[cross-posting to dev-gaia because this will affect everybody] TL;DR I am about to land cgroup support; this changes the low-level mechanism we use to prioritize applications. If you see unsual slow-downs during application startup or when more than one app is active at the same time, leave a comment on bug 1081871 [1]. We'll back it out mercilessly if perceived performance regresses.
---
Now for the long story. I'm delving in a bit of project history here
because this topic is rather obscure to most and I'd like more people to
be aware of it and of the reasoning behind our past and current choices.
In the early days of the B2G project we were looking for a mechanism to
prioritize applications' CPU usage. Our very first implementation relied
on changing a process' nice value (bug 768832 [2]) but turned out to be
broken as changing a process' nice value on Linux only affects the main
thread.
So we decided to try another mechanism that provided a reliable way to
re-prioritize an entire process: control groups, cgroups in short [3].
Control groups use a pseudo file-system that allows creating classes of
applications with certain properties assigned to them, such as how much
CPU should be allocated to the group. cgroups allow splitting CPU
priority by group rather than by app which is very convenient(e.g. all
background applications together should get no more than 5% of the total
CPU time in the presence of a foreground app requiring as much CPU as
possible).
While they would have made a perfect fit for our requirements, ICS'
cgroup implementation proved to be buggy as we found out in bug 861441
[4]. While we might have worked around its bugs we feared the resulting
system would be fragile. Instead we decided to keep using the tested and
true nice values even though using them to re-prioritize an entire
process required a lot of syscalls (which was expensive) and would
expose us to rare race conditions.
The resulting implementation worked for most cases but fell apart under
extreme scenarios such as receiving a call with both high CPU usage and
strong memory pressure (bug 870181 [5]). This was also fixed but only at
the cost of a lot of added complexity in the process priority manager.
Enter post-ICS kernels. cgroups now work properly, are obviously a
better fit than nice values for CPU priority assignment, and also offer
additional features such as altering an application swappiness which is
handy on devices using zram. In this new scenario we decided it's time
to switch to using cgroups for all our prioritization needs; this is
happening in bug 1081871 [1].
What does this mean to you? First of all switching an app priority
should become a lot faster and should work reliably no matter how much
load the phone is subject to. Second, the rigid segregation of processes
within groups means it will be a lot harder for background apps to
significantly slow down the phone; foreground apps should stay
responsive at all times. Third, being able to balance CPU usage using
relative proportions means we can now have a more fair allocation
between the main process and content processes. Last but not least this
will simplify the affected code a lot and shedding useless complexity is
one of my favorite activities.
One final note: if you're on an ICS device and you're on the master
branch once bug 1081871 lands you might experience significant
performance regressions. I will try to implement a workaround in bug
1119467 [6] so CC yourself there if you're affected. Geeksphone's
devices (peak, keon) will also require some kernel modifications so I'll
need to get them involved too.
[1] Evaluate using cgroups instead of nice values for prioritizing processes
https://bugzilla.mozilla.org/show_bug.cgi?id=1081871
[2] Set oom_adj values for background/foreground content processes
https://bugzilla.mozilla.org/show_bug.cgi?id=768832
[3] https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
[4] GonkHal::SetPriority does not set CPU priorities properly
https://bugzilla.mozilla.org/show_bug.cgi?id=861441
[5] Downgrade processes' CPU priorities when we receive a call
https://bugzilla.mozilla.org/show_bug.cgi?id=870181
[6] Implement a workaround to have working cgroup assignments on
ICS-based devices
https://bugzilla.mozilla.org/show_bug.cgi?id=1119467
signature.asc
Description: OpenPGP digital signature
_______________________________________________ dev-b2g mailing list [email protected] https://lists.mozilla.org/listinfo/dev-b2g
