Android 10 dan yang lebih tinggi menggunakan lapisan abstraksi grup kontrol (cgroup) dengan profil tugas, yang dapat digunakan developer untuk menjelaskan serangkaian (atau beberapa rangkaian) batasan yang akan diterapkan ke thread atau proses. Sistem kemudian mengikuti tindakan yang ditentukan oleh profil tugas untuk memilih satu atau beberapa cgroup yang sesuai, yang digunakan untuk menerapkan pembatasan, dan perubahan pada set fitur cgroup yang mendasarinya dapat dilakukan tanpa memengaruhi lapisan software yang lebih tinggi.
Tentang cgroup
Cgroup menyediakan mekanisme untuk menggabungkan dan mempartisi serangkaian tugas (yang terdiri dari proses, thread, dan semua turunannya di masa mendatang) ke dalam grup hierarkis dengan perilaku khusus. Android menggunakan cgroup untuk mengontrol dan mencatat penggunaan dan alokasi resource sistem seperti CPU dan memori, dengan dukungan untuk cgroup v1 dan cgroup v2 kernel Linux.
Android 9 dan yang lebih lama
Di Android 9 dan yang lebih lama, skrip inisialisasi init.rc
berisi kumpulan cgroup yang tersedia, titik pemasangan, dan versinya. Meskipun dapat diubah, framework Android mengharapkan sekumpulan cgroup tertentu ada di lokasi tertentu dengan hierarki versi dan subgrup tertentu, berdasarkan skrip. Hal ini membatasi kemampuan untuk memilih versi cgroup berikutnya yang akan digunakan, atau untuk mengubah hierarki cgroup guna menggunakan fitur baru.
Android 10 dan yang lebih tinggi
Android 10 dan yang lebih tinggi menggunakan cgroup dengan profil tugas:
- Penyiapan cgroup. Developer menjelaskan penyiapan cgroup dalam file
cgroups.json
untuk menentukan set cgroup, serta lokasi dan atribut pemasangannya. Semua cgroup dipasang selama tahap inisialisasi awal dari proses inisialisasi. - Profil tugas. Hal ini memberikan abstraksi yang memisahkan fungsi yang diperlukan dari detail penerapannya. Framework Android menerapkan profil tugas seperti yang dijelaskan dalam file
task_profiles.json
ke proses atau thread menggunakan APISetTaskProfiles
danSetProcessProfiles
. (API ini khusus untuk Android 11 dan yang lebih tinggi.)
Untuk memberikan kompatibilitas mundur, fungsi lama set_cpuset_policy
,
set_sched_policy
, dan get_sched_policy
menyediakan API dan fungsi yang sama,
tetapi implementasinya telah diubah untuk menggunakan profil tugas. Untuk kasus penggunaan baru, AOSP merekomendasikan penggunaan API profil tugas baru, bukan fungsi set_sched_policy
lama.
File deskripsi cgroup
Cgroup dijelaskan dalam file cgroups.json
yang terletak di <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
.
Setiap pengontrol dijelaskan dalam subbagian dan harus memiliki minimal hal berikut:
- Nama, ditentukan oleh kolom Controller.
- Jalur pemasangan, ditentukan oleh kolom Path.
- Mode, UID (ID pengguna), dan GID (ID grup) yang menjelaskan pemilik dan mode akses untuk file di jalur ini (semua opsional).
- Atribut Opsional, ditetapkan ke benar agar sistem mengabaikan error pemasangan yang disebabkan oleh pengontrol cgroup yang tidak didukung oleh kernel.
Contoh file cgroups.json
Contoh di bawah menunjukkan deskripsi untuk pengontrol cgroup v1 (Cgroups
) dan cgroup v2 (Cgroups2
) dengan jalur masing-masing.
{
"Cgroups": [
{
"Controller": "cpu",
"Path": "/dev/cpuctl",
"Mode": "0755",
"UID": "system",
"GID": "system"
},
{
"Controller": "memory",
"Path": "/dev/memcg",
"Mode": "0700",
"Optional": true
}
],
"Cgroups2": {
"Path": "/sys/fs/cgroup",
"Mode": "0755",
"UID": "system",
"GID": "system",
"Controllers": [
{
"Controller": "freezer",
"Path": ".",
"Mode": "0755",
"UID": "system",
"GID": "system"
}
]
}
}
Contoh file ini berisi dua bagian, Cgroups (yang menjelaskan pengontrol cgroup v1) dan Cgroups2 (yang menjelaskan pengontrol cgroup v2). Semua
pengontrol dalam hierarki cgroup v2 dipasang di lokasi yang sama.
Oleh karena itu, bagian Cgroups2 memiliki atribut Path, Mode, UID, dan
GID sendiri untuk mendeskripsikan lokasi dan atribut untuk root hierarki. Atribut Path untuk Controllers di bagian Cgroups2
relatif terhadap jalur root tersebut. Di Android 12 dan yang lebih baru, Anda dapat menentukan pengontrol cgroup
yang ditentukan dengan jalur dan mode sebagai "Optional"
dengan menyetelnya ke true
.
File cgroups.json
diuraikan sebagai bagian dari proses init, selama tahap init awal, dan cgroup dipasang di lokasi yang ditentukan. Untuk mendapatkan lokasi pemasangan cgroup nanti, gunakan fungsi API CgroupGetControllerPath
.
File profil tugas
File task_profiles.json
terletak di <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
.
Gunakan untuk menjelaskan serangkaian tindakan tertentu yang akan diterapkan pada proses atau thread. Kumpulan tindakan dikaitkan dengan nama profil, yang digunakan dalam panggilan
SetTaskProfiles
dan SetProcessProfiles
untuk memanggil tindakan profil.
Contoh file task_profiles.json
{
"Attributes": [
{
"Name": "MemSoftLimit",
"Controller": "memory",
"File": "memory.soft_limit_in_bytes"
},
{
"Name": "MemSwappiness",
"Controller": "memory",
"File": "memory.swappiness"
}
],
"Profiles": [
{
"Name": "MaxPerformance",
"Actions" : [
{
"Name" : "JoinCgroup",
"Params" :
{
"Controller": "schedtune",
"Path": "top-app"
}
}
]
},
{
"Name": "TimerSlackHigh",
"Actions" : [
{
"Name" : "SetTimerSlack",
"Params" :
{
"Slack": "40000000"
}
}
]
},
{
"Name": "LowMemoryUsage",
"Actions" : [
{
"Name" : "SetAttribute",
"Params" :
{
"Name" : "MemSoftLimit",
"Value" : "16MB"
}
},
{
"Name" : "SetAttribute",
"Params" :
{
"Name" : "MemSwappiness",
"Value" : "150"
}
}
]
}
]
"AggregateProfiles": [
{
"Name": "SCHED_SP_DEFAULT",
"Profiles": [ "TimerSlackHigh", "MaxPerformance" ]
},
{
"Name": "SCHED_SP_BACKGROUND",
"Profiles": [ "LowMemoryUsage" ]
}
}
Tetapkan nama ke file cgroup tertentu sebagai entri dalam daftar Attributes Anda. Setiap entri berisi hal berikut:
- Kolom Name menentukan nama Atribut.
- Kolom Controller mereferensikan pengontrol cgroup dari file
cgroups.json
berdasarkan namanya. - Nama kolom File menentukan file tertentu di bawah pengontrol ini.
Atribut adalah referensi dalam definisi profil tugas. Di luar profil tugas, gunakan hanya jika framework memerlukan akses langsung ke file tersebut, dan akses tidak dapat diabstraksi menggunakan profil tugas. Dalam semua kasus lainnya, gunakan profil tugas; profil ini memberikan pemisahan yang lebih baik antara perilaku yang diperlukan dan detail implementasinya.
Bagian Profiles berisi definisi profil tugas dengan hal berikut:
- Kolom Name menentukan nama profil.
Bagian Tindakan mencantumkan serangkaian tindakan yang dilakukan saat profil diterapkan. Setiap tindakan memiliki hal berikut:
- Kolom Name menentukan tindakan.
- Bagian Params menentukan serangkaian parameter untuk tindakan.
Tindakan yang didukung tercantum dalam tabel:
Tindakan | Parameter | Deskripsi |
---|---|---|
SetTimerSlack |
Slack |
Penyimpangan timer dalam ns |
SetAttribute |
Name |
Nama yang mereferensikan atribut dari bagian Atribut |
Value |
Nilai yang akan ditulis ke file yang diwakili oleh atribut bernama | |
WriteFile | FilePath | jalur ke file |
Value | nilai yang akan ditulis ke file | |
JoinCgroup |
Controller |
Nama pengontrol cgroup dari cgroups.json |
Path |
Jalur subgrup dalam hierarki pengontrol cgroup |
Android 12 dan yang lebih baru memiliki bagian AggregateProfiles yang berisi profil gabungan, yang masing-masing merupakan alias untuk sekumpulan satu atau beberapa profil. Definisi profil gabungan terdiri dari berikut ini:
- Kolom Name menentukan nama profil gabungan.
- Kolom Profiles mencantumkan nama profil yang disertakan dalam profil gabungan.
Saat profil gabungan diterapkan, semua profil yang ada di dalamnya juga akan otomatis diterapkan. Profil gabungan dapat berisi profil individual atau profil gabungan lainnya, selama tidak ada rekursi (profil yang mencakup dirinya sendiri).
Perintah bahasa inisialisasi task_profiles
Perintah task_profiles
di Android Init Language
tersedia untuk Android 12 dan yang lebih tinggi untuk memfasilitasi
pengaktifan profil tugas untuk proses tertentu. Perintah ini menggantikan perintah writepid
(tidak digunakan lagi di Android 12) yang digunakan untuk memigrasikan
proses antar-cgroup. Perintah task_profiles
memberikan fleksibilitas untuk
mengubah penerapan dasar tanpa memengaruhi lapisan atas. Pada
contoh di bawah, kedua perintah ini secara efektif melakukan operasi yang sama:
writepid /dev/cpuctl/top-app/tasks
Tidak digunakan lagi di Android 12, API ini digunakan untuk menulis PID tugas saat ini ke file
/dev/cpuctl/top-app/tasks
.task_profiles MaxPerformance
Menggabungkan proses saat ini ke dalam grup aplikasi teratas di bawah pengontrol "cpu" (
cpuctl
), yang menghasilkan penulisan PID proses kedev/cpuctl/top-app/tasks
.
Selalu gunakan perintah task_profiles
untuk memigrasikan tugas dalam hierarki cgroup di
Android 12 dan yang lebih tinggi. Fungsi ini menerima satu atau beberapa parameter, yang merepresentasikan
nama profil yang ditentukan dalam file task_profiles.json
.
Profil tugas per level API
Di Android 12 dan yang lebih tinggi, Anda dapat mengubah atau mengganti definisi dalam file cgroups.json
dan task_profiles.json
default, baik dengan mendasarkan perubahan pada level API Android, atau membuatnya dari partisi vendor.
Untuk mengganti definisi berdasarkan level API, file berikut harus ada di perangkat:
/system/etc/task_profiles/cgroups_<API level>.json
Gunakan ini untuk cgroup khusus untuk level API.
/system/etc/task_profiles/task_profiles_<API level>.json
Gunakan ini untuk profil khusus untuk level API.
Untuk mengganti definisi dari partisi vendor, file berikut harus ada di perangkat:
/vendor/etc/cgroups.json
/vendor/etc/task_profiles.json
Jika atribut atau definisi profil dalam file ini menggunakan nama yang sama seperti yang ada dalam file default, definisi file (level API atau level vendor) akan menggantikan definisi sebelumnya. Perhatikan juga bahwa definisi tingkat vendor menggantikan definisi tingkat API. Jika definisi baru memiliki nama baru, set atribut atau profil akan diubah dengan definisi baru.
Sistem Android memuat file cgroup
dan task_profile
dalam urutan ini:
- File
cgroups.json
dantask_profiles.json
default. - File khusus level API, jika ada.
- File partisi vendor, jika ada.
Perubahan pada API yang ada
Android 10 dan yang lebih tinggi mempertahankan fungsi set_cpuset_policy
, set_sched_policy
, dan get_sched_policy
tanpa perubahan pada API.
Namun, Android 10 memindahkan fungsi ini ke
libprocessgroup
, yang kini berisi semua fungsi terkait cgroup.
Meskipun header cutils/sched_policy.h
masih ada, untuk menghindari kerusakan
kode yang ada, pastikan kode baru menyertakan header processgroup/sched_policy.h
baru.
Modul yang menggunakan salah satu fungsi ini harus menambahkan dependensi pada library libprocessgroup
ke dalam makefile-nya. Jika modul tidak menggunakan fungsi
libcutils
lainnya, hapus dependensi
library libcutils
dari makefile.
API profil tugas
API pribadi di processgroup/processgroup.h
ditentukan dalam tabel:
Jenis | API dan definisi |
---|---|
bool |
SetTaskProfiles(int tid, const std::vector
Menerapkan profil tugas yang ditentukan dalam profiles ke thread yang ditentukan oleh
ID thread (tid) menggunakan parameter tid -nya. |
bool |
SetProcessProfiles(uid_t uid, pid_t pid, const std::vector
Menerapkan profil tugas yang ditentukan dalam profiles ke proses yang ditentukan
oleh ID pengguna dan ID prosesnya menggunakan parameter uid dan pid |
bool |
CgroupGetControllerPath(const std::string& cgroup_name, std::string* path)
Menampilkan apakah pengontrol cgroup yang ditentukan oleh cgroup_name ada;
jika true , menetapkan variabel path ke root cgroup tersebut |
bool |
CgroupGetAttributePath(const std::string& attr_name, std::string* path)
Menampilkan apakah atribut profil yang ditentukan oleh attr_name ada; jika
true , menetapkan variabel path ke jalur file yang terkait dengan
atribut profil tersebut. |
bool |
CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path)
Menampilkan apakah atribut profil yang ditentukan oleh attr_name ada; jika
true , menetapkan variabel path ke jalur file yang terkait dengan
atribut profil tersebut, dan ke thread yang ditentukan oleh ID thread-nya menggunakan
parameter tid . |
bool |
UsePerAppMemcg()
Menampilkan apakah sistem dikonfigurasi untuk menggunakan cgroup memori per aplikasi. |