Android 10 ve sonraki sürümlerde kontrol grubu kullanılır (cgroup) geliştiricilerin bir kümeyi açıklamak için kullanabileceği görev profilleri içeren soyutlama katmanı bir iş parçacığına veya işleme uygulanacak kısıtlama (ya da grup) içerir. Bu durumda sistem, bir veya daha fazla seçim yapmak için görev profillerinin belirtilen eylemlerini uygular kısıtlamaların nasıl uygulandığını ve temel alınan cgroup özelliği kümesi, daha yüksek düzeydeki yazılımları etkilemeden katman olarak görünür.
cgroups hakkında
Cgroups, görev gruplarını (işlemler, iş parçacıkları ve gelecekteki tüm alt öğelerinden oluşur) özel davranışa sahip hiyerarşik gruplar halinde toplama ve bölme mekanizması sağlar. Android, Linux çekirdeği cgroups v1 ve cgroups v2 desteğiyle CPU, bellek kullanımı ve tahsisi gibi sistem kaynaklarını kontrol etmek ve hesaba katmak için cgroups'ı kullanır.
Android 9 ve önceki sürümler
Android 9 ve önceki sürümlerde init.rc
başlatma komut dosyası,
bağlantı noktalarını ve sürümlerini içerir. Bunlar projenin
Android çerçevesine göre belirli bir grup Cgroup'un
konuma dayalı olarak, belirli bir sürüme ve alt grup hiyerarşisine
komut dosyası. Bu durum, kullanılacak bir sonraki grup sürümünü seçme imkanını sınırlıyor.
yeni özellikleri kullanmak için Cgroup Hiyerarşisini değiştirebilirsiniz.
Android 10 ve sonraki sürümler
Android 10 ve sonraki sürümlerde görev profillerine sahip cgroups kullanılır:
- Grup kurulumu. Geliştiriciler, cgroups kurulumunu
cgroups.json
bölümünde açıklarlar. dosyası oluşturun. Tüm cgroups, başlatmanın erken başlatma aşamasında eklenir bahsedeceğim. - Görev profilleri. Bunlar, gerekli işlevi, uygulanma ayrıntılarından ayıran bir soyutlama sağlar. Android çerçevesi
task_profiles.json
dosyasında açıklandığı gibi görev profillerini işleme veya iş parçacığı (SetTaskProfiles
veSetProcessProfiles
API'leri) kullanır. (Bu API'ler Android 11 ve sonraki sürümlere özeldir.)
Geriye dönük uyumluluk sağlamak için eski set_cpuset_policy
, set_sched_policy
ve get_sched_policy
işlevleri aynı API'yi ve işlevi sağlar ancak uygulamalarında görev profilleri kullanılacak şekilde değişiklik yapılmıştır. Yeni kullanım için
AOSP'nin, eski sürüm yerine yeni görev profili API'lerini kullanmasını önerdiği durumlar
set_sched_policy
işlevi.
Cgroups açıklama dosyası
C-grupları cgroups.json
bölümünde açıklanmıştır
dosyası <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
altında bulunur.
Her kontrolör bir alt bölümde açıklanır ve en az aşağıdakileri içermelidir:
- Controller (Denetleyici) alanı tarafından tanımlanan ad.
- Yol alanı ile tanımlanan ekleme yolu.
- Mod, UID (user-ID) ve GID (grup kimliği) erişim modlarını kullanabilirsiniz (tümü isteğe bağlıdır).
- İsteğe bağlı özellik: Sistemin ekleme işlemini yoksayması için true olarak ayarlayın. hatası.
Örnek cgroups.json dosyası
Aşağıdaki örnekte, cgroup v1 (Cgroups
) ve cgroup v2 (Cgroups2
) denetleyicilerinin açıklamaları ve ilgili yolları gösterilmektedir.
{
"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"
}
]
}
}
Bu örnek dosya Cgroups olmak üzere iki bölüm içerir (v1 cgrubunu açıklayan
denetleyiciler) ve Cgroups2 (cgroup v2 denetleyicilerini açıklar). Tümü
cgroups v2 hiyerarşisindeki denetleyiciler aynı konuma montedir.
Dolayısıyla, Cgroups2 bölümünün kendi Yol, Mod, UID ve
GID özniteliklerini tanımlamak için kullanılan konum ve özellikleri
hiyerarşik olarak düzenlenmiştir. Cgroups2 altındaki Denetleyiciler için Yol özelliği
eklemeniz gerekir. Android 12 ve sonraki sürümlerde cgroup tanımlayabilirsiniz
yol ve mod olarak "Optional"
olarak belirtilen kumanda
bunu true
olarak ayarlayabilirsiniz.
cgroups.json
dosyası, erken başlatma sırasında başlatma işleminin bir parçası olarak ayrıştırılır.
aşamasında ve cgroup'lar belirtilen konumlara monte edilir. Daha sonra edinmek için
CgroupGetControllerPath
API işlevini kullanın.
Görev profilleri dosyası
task_profiles.json
dosyası <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/
altındadır.
Bir sürece uygulanacak belirli bir işlem kümesini tanımlamak için
ileti dizisi. Bir işlem grubu, şurada kullanılan bir profil adıyla ilişkilendirilir:
Profil işlemlerini çağırmak için SetTaskProfiles
ve SetProcessProfiles
çağrıları.
Örnek görevi_profile.json dosyası
{
"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" ]
}
}
Belirli grup dosyalarına adlar Özellikler listenizde giriş olarak atayın. Her giriş şunları içerir:
- Ad alanı, Özelliğin adını belirtir.
- Controller (Denetleyici) alanı,
cgroups.json
içindeki bir cgroup denetleyicisine referans verir. adına göre ekleyebilirsiniz. - Dosya alanı, bu denetleyicinin altındaki belirli bir dosyanın adını taşır.
Özellikler, görev profili tanımlarındaki referanslardır. Görevin dışında kullanıyorsanız bunları yalnızca çerçeve, ilgili profillere doğrudan erişim gerektirdiğinde kullanın ve erişim soyutlanamaz. Diğer tüm durumlarda görev profillerini kullanabilir, gerekli davranış ile gereken davranış arasındaki ayrıntılarını inceleyeceğiz.
Profiller bölümü, aşağıdakilerle birlikte görev profili tanımlarını içerir:
- Ad alanı, profil adını tanımlar.
İşlemler bölümünde, profil aşağıdaki işlemler olduğunda gerçekleştirilen bir dizi işlem listelenir: geçerlidir. Her işlem aşağıdakilere sahiptir:
- Ad alanı işlemi belirtir.
- Params bölümü, işlem için bir parametre grubu belirtir.
Desteklenen işlemler tabloda listelenmiştir:
İşlem | Parametre | Açıklama |
---|---|---|
SetTimerSlack |
Slack |
ns cinsinden zamanlayıcı boşluğu |
SetAttribute |
Name |
Özellikler bölümündeki bir özelliğe referans veren ad |
Value |
Adlandırılmış özelliğin temsil ettiği dosyaya yazılacak değer | |
WriteFile | FilePath | dosyanın yolu |
Value | dosyaya yazılacak bir değer | |
JoinCgroup |
Controller |
cgroups.json kapsamındaki grup denetleyicisinin adı |
Path |
Cgroup denetleyicisinin hiyerarşisindeki bir alt grup yolu |
Android 12 ve sonraki sürümlerde AggregateProfiles bulunur. bölüm, her biri bir dizi kümenin takma adı olan toplu profilleri içerir. bir veya daha fazla profil. Toplu profil tanımları şunlardan oluşur:
- Ad alanı, toplu profilin adını belirtir.
- Profiles (Profiller) alanında, profildeki profillerinizin adları listelenir. bir görünümünü sunar.
Birleştirilmiş profil uygulandığında, içeren tüm profiller de otomatik olarak uygulanır. Birleştirilmiş profiller her iki bağımsız profili de içerebilir yinelemelerin olmadığı müddetçe ( içerir).
görev_profilleri başlangıç dil komutu
Android Init Dili'nde bir task_profiles
komutu
Android 12 ve sonraki sürümlerde kullanılabilir.
belirli bir işlem için görev profili etkinleştirmesi. writepid
, yerini alır
komutunda (Android 12'de desteği sonlandırılmıştır) bir web sitesini
bir süreçtir. task_profiles
komutu, üst katmanları etkilemeden temel uygulamaları değiştirme esnekliği sağlar.
aşağıdaki örnekte gösterildiği gibi, şu iki komut aynı işlemi etkili bir şekilde gerçekleştirir:
writepid /dev/cpuctl/top-app/tasks
Android 12'de desteği sonlandırıldı. PID'yi yazmak için bu kimlik kullanılıyordu.
/dev/cpuctl/top-app/tasks
dosyasına yükleyin.task_profiles MaxPerformance
Mevcut işlemi "cpu"nun altındaki üst uygulama grubuna ekler denetleyici (
cpuctl
) alır. Bu da işlemin PID'sinindev/cpuctl/top-app/tasks
.
Şuradaki görevleri taşımak için her zaman task_profiles
komutunu kullanın:
Android 12 ve sonraki sürümler. Şu parametreyi temsil eden bir veya daha fazla parametreyi kabul eder:
task_profiles.json
dosyasında belirtilen profillerin adları.
API düzeyindeki görev profilleri başına
Android 12 ve sonraki sürümlerde değişiklik yapabilir veya mevcut öğeleri geçersiz kılabilirsiniz.
varsayılan cgroups.json
ve task_profiles.json
dosyalarındaki tanımlar veya
yaptığınız değişikliği Android API düzeyinde veya satıcıdan
bölüm.
API düzeyine dayalı olarak tanımları geçersiz kılmak için aşağıdaki dosyalar cihazda mevcut:
/system/etc/task_profiles/cgroups_<API level>.json
Bu seçeneği, API düzeyine özgü cgroups için kullanın.
/system/etc/task_profiles/task_profiles_<API level>.json
API düzeyine özgü profiller için bunu kullanın.
Tedarikçi bölümünün tanımlarını geçersiz kılmak için cihazda aşağıdaki dosyaların bulunması gerekir:
/vendor/etc/cgroups.json
/vendor/etc/task_profiles.json
Bu dosyalardaki bir özellik veya profil tanımı varsayılan dosyadaysa dosya (API düzeyinde veya tedarikçi firma düzeyinde) tanımı geçersiz kılar görebilirsiniz. Tedarikçi düzeyindeki tanımların geçersiz kılındığını da unutmayın. API düzeyindeki tanımlar. Yeni tanımın yeni bir adı varsa özelliklerinin veya profillerin yeni tanıma göre değiştirilmesi.
Android sistemi, cgroup
ve task_profile
dosyalarını şu sırayla yükler:
- Varsayılan
cgroups.json
vetask_profiles.json
dosyası olarak da kaydedebilir. - API düzeyine özel dosyalar (varsa).
- Sağlayıcı bölüm dosyaları (varsa).
Mevcut API'de yapılan değişiklikler
Android 10 ve sonraki sürümlerde set_cpuset_policy
,
set_sched_policy
ve get_sched_policy
işlevleri API'de değişiklik yapılmadan korunur.
Ancak Android 10 bu işlevleri libprocessgroup
içine taşır. Artık cgroup ile ilgili tüm işlevler libprocessgroup
içindedir.
Bozmamak için cutils/sched_policy.h
üstbilgisi hâlâ mevcut olsa da
Mevcut kod, yeni kodun yeni bir processgroup/sched_policy.h
içerdiğinden emin olun.
başlığını kullanın.
Bu işlevlerden herhangi birini kullanan modüller
libprocessgroup
kitaplığını oluşturma dosyasına ekleyebilir. Bir modül başka bir
libcutils
işlevi, libcutils
işlevini bırakın
kitaplığına bağımlılığınızı artırır.
Görev profilleri API'leri
processgroup/processgroup.h
içindeki gizli API'ler tabloda tanımlanmıştır:
Tür | API ve tanım |
---|---|
bool |
SetTaskProfiles(int tid, const std::vector
profiles öğesinde belirtilen görev profillerini,
tid parametresini kullanarak ileti dizisi kimliğini (git) haline getirin. |
bool |
SetProcessProfiles(uid_t uid, pid_t pid, const std::vector
profiles öğesinde belirtilen görev profillerini, belirtilen işleme uygular
uid ve pid parametrelerini kullanan kullanıcı ve işlem kimliklerine göre |
bool |
CgroupGetControllerPath(const std::string& cgroup_name, std::string* path)
cgroup_name tarafından belirtilen bir cgroup denetleyicisinin olup olmadığını döndürür;
true ise path değişkenini söz konusu cgroup'nin köküne ayarlar |
bool |
CgroupGetAttributePath(const std::string& attr_name, std::string* path)
attr_name tarafından belirtilen bir profil özelliğinin olup olmadığını döndürür; true ise path değişkenini söz konusu profil özelliğiyle ilişkili dosyanın yoluna ayarlar. |
bool |
CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path)
attr_name tarafından belirtilen bir profil özelliğinin mevcut olup olmadığını döndürür; eğer
true , path değişkenini
özelliğini kullanarak ileti dizisi kimliği tarafından belirtilen ileti dizisine
tid parametresini kullanın. |
bool |
UsePerAppMemcg()
Sistemin, uygulama başına bellek cgroups'u kullanacak şekilde yapılandırılıp yapılandırılmadığını döndürür. |