Android 10 dan yang lebih tinggi menggunakan lapisan abstraksi grup kontrol (cgroup) dengan profil tugas, yang dapat digunakan developer untuk menjelaskan serangkaian batasan yang akan diterapkan pada thread atau proses. Sistem kemudian mengikuti tindakan yang ditentukan pada profil tugas untuk memilih satu atau lebih cgroup yang sesuai, yang melaluinya pembatasan diterapkan, dan perubahan pada rangkaian fitur cgroup yang mendasarinya dapat dilakukan tanpa memengaruhi lapisan perangkat lunak yang lebih tinggi.
Tentang cgroup
Cgroups menyediakan mekanisme untuk menggabungkan dan mempartisi kumpulan tugas (yang terdiri dari proses, thread, dan semua turunannya di masa depan) ke dalam kelompok hierarki dengan perilaku khusus. Android menggunakan cgroups untuk mengontrol dan memperhitungkan sumber daya sistem seperti penggunaan dan alokasi CPU dan memori, dengan dukungan untuk kernel Linux cgroups v1 dan cgroups v2 .
Android 9 dan lebih rendah
Di Android 9 dan yang lebih rendah, skrip inisialisasi init.rc
berisi kumpulan cgroup yang tersedia, titik pemasangannya, dan versinya. Meskipun hal ini dapat diubah, framework Android mengharapkan sekumpulan cgroup tertentu ada di lokasi tertentu dengan versi dan hierarki subgrup tertentu, berdasarkan skrip. Hal ini membatasi kemampuan untuk memilih versi cgroup berikutnya yang akan digunakan, atau mengubah hierarki cgroup untuk menggunakan fitur baru.
Android 10 dan lebih tinggi
Android 10 dan lebih tinggi menggunakan cgroup dengan profil tugas:
- Pengaturan grup C. Pengembang menjelaskan pengaturan cgroups dalam file
cgroups.json
mereka untuk menentukan kumpulan cgroup, serta lokasi pemasangan dan atributnya. Semua cgroup dipasang pada tahap awal proses inisialisasi. - Profil tugas. Ini memberikan abstraksi yang memisahkan fungsionalitas yang diperlukan dari detail implementasinya. Framework Android menerapkan profil tugas seperti yang dijelaskan dalam file
task_profiles.json
ke proses atau thread menggunakan APISetTaskProfiles
danSetProcessProfiles
. (API ini unik untuk Android 11 dan lebih tinggi.)
Untuk menyediakan kompatibilitas mundur, fungsi lama set_cpuset_policy
, set_sched_policy
, dan get_sched_policy
menyediakan API dan fungsionalitas yang sama, namun implementasinya telah dimodifikasi untuk menggunakan profil tugas. Untuk kasus penggunaan baru, AOSP merekomendasikan penggunaan API profil tugas baru, bukan fungsi set_sched_policy
yang lama.
File deskripsi Cgroups
Cgroup dijelaskan dalam file cgroups.json
yang terletak di bawah <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
. Setiap pengontrol dijelaskan dalam subbagian dan minimal harus memiliki hal berikut:
- Nama, ditentukan oleh bidang Pengontrol .
- Jalur pemasangan, ditentukan oleh bidang Path .
- Mode , UID (ID pengguna), dan GID (ID grup) yang menjelaskan pemilik dan mode akses untuk file di bawah jalur ini (semua opsional).
- Atribut opsional , disetel ke true agar sistem mengabaikan kesalahan pemasangan yang disebabkan oleh pengontrol cgroup yang tidak didukung oleh kernel untuk dipasang.
Contoh file cgroups.json
Contoh di bawah ini menunjukkan deskripsi untuk pengontrol 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"
}
]
}
}
File contoh ini berisi dua bagian, Cgroups (menjelaskan pengontrol cgroup v1) dan Cgroups2 (menjelaskan pengontrol cgroup v2). Semua pengontrol dalam hierarki cgroups v2 dipasang di lokasi yang sama. Oleh karena itu, bagian Cgroups2 memiliki atribut Path , Mode , UID , dan GID sendiri untuk menjelaskan lokasi dan atribut akar hierarki. Atribut Path untuk Pengontrol di bawah Cgroups2 relatif terhadap jalur root tersebut. Di Android 12 dan lebih tinggi, Anda dapat menentukan pengontrol cgroup yang ditentukan dengan jalur dan mode sebagai "Optional"
dengan menyetelnya ke true
.
File cgroups.json
diurai 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 bawah <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
. Gunakan untuk menjelaskan serangkaian tindakan spesifik yang akan diterapkan pada suatu proses atau thread. Serangkaian tindakan dikaitkan dengan nama profil, yang digunakan dalam panggilan SetTaskProfiles
dan SetProcessProfiles
untuk menjalankan 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 Atribut Anda. Setiap entri berisi yang berikut:
- Bidang Nama menentukan nama Atribut.
- Bidang pengontrol mereferensikan pengontrol cgroup dari file
cgroups.json
, berdasarkan namanya. - Bidang file memberi nama file tertentu di bawah pengontrol ini.
Atribut adalah referensi dalam definisi profil tugas. Di luar profil tugas, gunakan hanya ketika kerangka kerja memerlukan akses langsung ke file tersebut, dan akses tidak dapat diabstraksi menggunakan profil tugas. Dalam kasus lainnya, gunakan profil tugas; mereka memberikan pemisahan yang lebih baik antara perilaku yang diperlukan dan detail implementasinya.
Bagian Profil berisi definisi profil tugas dengan yang berikut ini:
- Bidang nama mendefinisikan nama profil.
Bagian tindakan mencantumkan serangkaian tindakan yang dilakukan saat profil diterapkan. Setiap tindakan memiliki hal berikut:
- Bidang nama menentukan tindakan.
- Bagian Params menentukan sekumpulan parameter untuk tindakan.
Tindakan yang didukung tercantum dalam tabel:
Tindakan | Parameter | Keterangan |
---|---|---|
SetTimerSlack | Slack | Pengatur waktu kendur di ns |
SetAttribute | Name | Nama yang merujuk pada 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 lebih tinggi menampilkan bagian AggregateProfiles yang berisi profil agregat, yang masing-masing merupakan alias untuk kumpulan satu atau beberapa profil. Definisi profil agregat terdiri dari berikut ini:
- Bidang nama menentukan nama profil agregat.
- Bidang profil mencantumkan nama profil yang disertakan dalam profil agregat.
Ketika profil agregat diterapkan, semua profil yang memuatnya juga diterapkan secara otomatis. Profil agregat dapat berisi profil individual atau profil agregat lainnya, selama tidak ada rekursi (profil yang menyertakan profil itu sendiri).
perintah bahasa init task_profiles
Perintah task_profiles
dalam Bahasa Init Android tersedia untuk Android 12 dan lebih tinggi guna memfasilitasi aktivasi 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 implementasi mendasar tanpa berpengaruh pada lapisan atas. Pada contoh di bawah, kedua perintah ini secara efektif menjalankan operasi yang sama:
writepid /dev/cpuctl/top-app/tasks
Tidak digunakan lagi di Android 12, Ini digunakan untuk menulis PID tugas saat ini ke dalam file
/dev/cpuctl/top-app/tasks
.task_profiles MaxPerformance
Gabungkan 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 lebih tinggi. Ia menerima satu atau beberapa parameter, yang mewakili nama profil yang ditentukan dalam file task_profiles.json
.
Per profil tugas tingkat API
Di Android 12 dan yang lebih tinggi, Anda dapat mengubah atau mengganti definisi di 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:
pro/system/etc/task_profiles/cgroups_<API level>.json
Gunakan ini untuk grup khusus untuk level API.
/system/etc/task_profiles/task_profiles_<API level>.json
Gunakan ini untuk profil khusus untuk level API.
Untuk mengambil alih 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 pada file default, definisi file (tingkat API atau tingkat vendor) akan menggantikan definisi sebelumnya. Perhatikan juga bahwa definisi tingkat vendor menggantikan definisi tingkat API. Jika definisi baru mempunyai nama baru, maka kumpulan atribut atau profil 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-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 bahwa kode baru menyertakan header processgroup/sched_policy.h
yang baru.
Modul yang menggunakan salah satu fungsi ini harus menambahkan ketergantungan pada perpustakaan libprocessgroup
ke dalam makefile-nya. Jika modul tidak menggunakan fungsionalitas libcutils
lainnya, hilangkan ketergantungan perpustakaan 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 & profiles) SetTaskProfiles(int tid, const std::vector & profiles) 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 & profiles) SetProcessProfiles(uid_t uid, pid_t pid, const std::vector & profiles) Menerapkan profil tugas yang ditentukan dalam profiles ke proses yang ditentukan oleh penggunanya dan ID proses menggunakan parameter uid dan pid |
bool | CgroupGetControllerPath(const std::string& cgroup_name, std::string* path) Mengembalikan apakah pengontrol cgroup yang ditentukan oleh cgroup_name ada; jika true , setel variabel path ke akar cgroup tersebut |
bool | CgroupGetAttributePath(const std::string& attr_name, std::string* path) Mengembalikan apakah atribut profil yang ditentukan oleh attr_name ada; jika true , setel variabel path ke jalur file yang terkait dengan atribut profil tersebut. |
bool | CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path) Mengembalikan apakah atribut profil yang ditentukan oleh attr_name ada; jika true , setel variabel path ke jalur file yang terkait dengan atribut profil tersebut, dan ke utas yang ditentukan oleh ID utasnya menggunakan parameter tid . |
bool | UsePerAppMemcg() Mengembalikan apakah sistem dikonfigurasi untuk menggunakan cgroup memori per aplikasi. |