Android 10 dan yang lebih baru menggunakan grup kontrol (cgroup) lapisan abstraksi dengan profil tugas, yang dapat digunakan developer untuk mendeskripsikan kumpulan (atau set) batasan untuk diterapkan pada thread atau proses. Sistem kemudian mengikuti tindakan yang ditentukan dari profil tugas untuk memilih satu atau beberapa grup yang sesuai, tempat pembatasan diterapkan, dan perubahan pada set fitur cgroup yang mendasarinya dapat dibuat tanpa memengaruhi software yang lebih tinggi lapisan berbeda.
Tentang cgroups
Cgroup menyediakan mekanisme untuk menggabungkan dan mempartisi set tugas (yang terdiri dari proses, utas, dan semua turunan di masa mendatang) ke dalam kelompok hierarkis dengan perilaku khusus. Android menggunakan cgroups untuk mengontrol dan memperhitungkan resource sistem seperti penggunaan dan alokasi CPU dan memori, dengan dukungan untuk cgroups v1 kernel Linux dan cgroups v2.
Android 9 dan yang lebih lama
Di Android 9 dan yang lebih rendah, skrip inisialisasi init.rc
berisi kumpulan
cgroup yang tersedia, titik pemasangannya, dan versinya. Meskipun ini bisa berupa
berubah, kerangka kerja Android mengharapkan
sekumpulan cgrup tertentu di
lokasi spesifik dengan versi dan hierarki subgrup tertentu, berdasarkan
{i>script<i}. Hal ini membatasi kemampuan untuk memilih
versi cgroup berikutnya untuk digunakan, atau untuk
mengubah hierarki {i>cgroup<i} untuk menggunakan fitur baru.
Android 10 dan yang lebih baru
Android 10 dan yang lebih baru menggunakan cgroup dengan profil tugas:
- Penyiapan grup grup. Developer menjelaskan penyiapan cgroups dalam file
cgroups.json
mereka untuk menentukan kumpulan cgroups, serta lokasi dan atribut pemasangannya. Semua cgroups dipasang selama tahap awal inisialisasi 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 bersifat unik 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 dimodifikasi
untuk menggunakan profil tugas. Untuk penggunaan baru
AOSP merekomendasikan penggunaan API profil tugas baru
Fungsi set_sched_policy
.
File deskripsi Cgroups
Cgrup dijelaskan di cgroups.json
file 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, yang ditentukan oleh kolom Path.
- Mode, UID (ID pengguna), dan GID (ID grup) yang mendeskripsikan pemilik dan untuk file pada jalur ini (semua opsional).
- Atribut Opsional, tetapkan ke true agar sistem mengabaikan pemasangan {i>error<i} yang disebabkan oleh {i>cgroup controller<i} yang tidak didukung oleh {i>kernel<i}.
Contoh file cgroups.json
Contoh di bawah ini menunjukkan deskripsi untuk cgroup v1 (Cgroups
) dan cgroup v2
(Cgroups2
) dengan jalurnya 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 (mendeskripsikan cgroup v1
pengontrol) dan Cgroups2 (yang menjelaskan pengontrol cgroup v2). Semua
pengontrol di hierarki cgroups v2
dipasang di lokasi yang sama.
Oleh karena itu, bagian Cgroups2 memiliki Path, Mode, UID, dan
Atribut GID untuk mendeskripsikan lokasi dan atribut untuk root
hierarki sebelumnya. Atribut Path untuk Controllers di bagian Cgroups2 bersifat
relatif terhadap jalur root tersebut. Di Android 12 dan yang lebih tinggi, Anda dapat menentukan cgroup
pengontrol yang ditentukan dengan jalur dan mode sebagai "Optional"
dengan menyetelnya ke true
.
File cgroups.json
diuraikan sebagai bagian dari proses init, selama proses inisialisasi awal
dan cgroup dipasang di lokasi yang ditentukan. Untuk mendapatkan
lokasi pemasangan cgroup, gunakan fungsi API CgroupGetControllerPath
.
File profil tugas
File task_profiles.json
terletak di bagian <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
.
Gunakan untuk menggambarkan serangkaian tindakan tertentu yang akan diterapkan pada proses atau
. Sekumpulan tindakan yang dikaitkan dengan nama profil, yang digunakan di
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 untuk file cgroup tertentu sebagai entri dalam daftar Attributes. Setiap entri berisi hal berikut:
- Kolom Name menentukan nama Atribut.
- Kolom Controller mereferensikan pengontrol cgroup dari file
cgroups.json
, berdasarkan namanya. - Kolom File memberi nama 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 lain, menggunakan profil tugas; mereka memberikan pemisahan yang lebih baik antara perilaku yang diperlukan dan detail implementasinya.
Bagian Profil 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 kumpulan parameter untuk tindakan.
Tindakan yang didukung tercantum dalam tabel:
Tindakan | Parameter | Deskripsi |
---|---|---|
SetTimerSlack |
Slack |
Kelonggaran timer dalam ns |
SetAttribute |
Name |
Nama yang merujuk atribut dari bagian Attributes |
Value |
Nilai yang akan ditulis ke file yang direpresentasikan 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 sub-grup dalam hierarki pengontrol cgroup |
Android 12 dan yang lebih baru menampilkan AggregateProfiles yang berisi profil gabungan, yang masing-masing merupakan alias untuk serangkaian satu atau beberapa profil. Definisi profil gabungan terdiri dari hal berikut:
- Kolom Name menentukan nama profil gabungan.
- Kolom Profiles mencantumkan nama profil yang disertakan dalam profil gabungan.
Ketika profil gabungan diterapkan, semua profil yang memuatnya juga akan otomatis diterapkan. Profil gabungan dapat berisi profil individual atau profil gabungan lainnya, selama tidak ada rekursi (profil yang menyertakan dirinya sendiri).
perintah bahasa init task_profiles
Perintah task_profiles
di Android Init Language
tersedia untuk Android 12 dan yang lebih baru untuk memfasilitasi
aktivasi profil tugas
untuk proses tertentu. Fungsi ini menggantikan writepid
(tidak digunakan lagi di Android 12) yang digunakan untuk memigrasikan
proses antar cgroup. Perintah task_profiles
memberikan fleksibilitas untuk
mengubah implementasi yang mendasarinya tanpa
mempengaruhi lapisan atas. Di kolom
dua perintah berikut secara efektif melakukan operasi yang sama:
writepid /dev/cpuctl/top-app/tasks
Tidak digunakan lagi di Android 12. Digunakan untuk menulis PID dari tugas saat ini ke dalam file
/dev/cpuctl/top-app/tasks
.task_profiles MaxPerformance
Menggabungkan proses saat ini ke grup aplikasi teratas di bawah "cpu" pengontrol (
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 baru. Model ini menerima satu atau beberapa parameter, yang mewakili
nama profil yang ditentukan dalam file task_profiles.json
.
Per profil tugas level API
Di Android 12 dan yang lebih baru, Anda dapat mengubah atau mengganti
dalam file cgroups.json
dan task_profiles.json
default,
mendasarkan perubahan Anda pada API level Android, atau membuatnya dari vendor
partisi.
Untuk mengganti definisi berdasarkan level API, file berikut harus yang ada di perangkat:
/system/etc/task_profiles/cgroups_<API level>.json
Gunakan ini untuk grup khusus dengan level API.
/system/etc/task_profiles/task_profiles_<API level>.json
Gunakan ini untuk profil khusus level API.
Untuk mengganti definisi dari partisi vendor, file-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 dengan ada di file {i>default<i}, definisi file (level API atau tingkat vendor) menggantikan definisi sebelumnya. Perhatikan juga bahwa definisi tingkat vendor menggantikan Definisi level API. Jika definisi baru memiliki nama baru, maka kumpulan atribut atau profil diubah dengan definisi baru.
Sistem Android memuat file cgroup
dan task_profile
dalam urutan ini:
- Default
cgroups.json
dantask_profiles.json
. - File khusus API level, jika ada.
- File partisi vendor, jika ada.
Perubahan pada API yang ada
Android 10 dan yang lebih baru 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 sekarang berisi semua fungsi terkait cgroup.
Meskipun header cutils/sched_policy.h
masih ada, untuk menghindari gangguan
kode yang ada memastikan bahwa kode baru menyertakan kode processgroup/sched_policy.h
baru
{i>header<i} sebagai gantinya.
Modul yang menggunakan salah satu fungsi ini harus menambahkan dependensi pada
library libprocessgroup
ke makefile-nya. Jika modul tidak menggunakan
Fungsi libcutils
, hapus libcutils
dependensi library 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
thread ID (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 pengguna dan ID proses 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 , tetapkan 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 threadnya menggunakan
parameter tid . |
bool |
UsePerAppMemcg()
Menampilkan apakah sistem dikonfigurasi untuk menggunakan cgroup memori per aplikasi. |