OSDN Git Service

bind android.bg in system_server to small cores
authorTim Murray <timmurray@google.com>
Thu, 1 Feb 2018 00:16:31 +0000 (16:16 -0800)
committerTim Murray <timmurray@google.com>
Wed, 7 Feb 2018 19:02:08 +0000 (11:02 -0800)
android.bg in system_server primarily handles PSS collection, which is
not performance critical. Accordingly, bind it to little cores.

However, because threads in zygote-derived applications are only in a
single cpuset at a time, this also means the scheduling policy for
system_servershould never be reset by applyOomAdjLocked(). The only
time this happens is when system_server's ProcessRecord is first
created, and its scheduler configuration is already controlled by
init.rc. Configure the right defaults for system_server's scheduling
group so it's never modified from applyOomAdjLocked().

Test: android.bg is in background, rest of system_server is in fg
bug 70859548

Change-Id: Id8582e6d493c6b2d3390fdc45ac2396390744f06

services/core/java/com/android/server/am/ActivityManagerService.java

index 99f36d0..2e78db9 100644 (file)
@@ -3005,6 +3005,16 @@ public class ActivityManagerService extends IActivityManager.Stub
 
         Watchdog.getInstance().addMonitor(this);
         Watchdog.getInstance().addThread(mHandler);
+
+        // bind background thread to little cores
+        // this is expected to fail inside of framework tests because apps can't touch cpusets directly
+        try {
+            Process.setThreadGroupAndCpuset(BackgroundThread.get().getThreadId(),
+                    Process.THREAD_GROUP_BG_NONINTERACTIVE);
+        } catch (Exception e) {
+            Slog.w(TAG, "Setting background thread cpuset failed");
+        }
+
     }
 
     protected ActivityStackSupervisor createStackSupervisor() {
@@ -12648,6 +12658,9 @@ public class ActivityManagerService extends IActivityManager.Stub
         if (!mBooted && !mBooting
                 && userId == UserHandle.USER_SYSTEM
                 && (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
+            // The system process is initialized to SCHED_GROUP_DEFAULT in init.rc.
+            r.curSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+            r.setSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
             r.persistent = true;
             r.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;
         }