Cgroup soyutlama katmanı

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 kümelerini toplamak ve bölümlendirmek için bir mekanizma sağlar (süreçler, iş parçacıkları ve gelecekteki tüm alt öğelerinden oluşur.) hiyerarşik gruplar halinde olabilir. Android, kullanıcı etkileşimini kontrol etmek ve CPU ve bellek kullanımı ile tahsisi gibi sistem kaynakları Linux çekirdeği cgroups v1 ve cgroups v2.

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, kullanıcı deneyimiyle ilgili gerekli ayrıntılarına inceleyebilirsiniz. Android çerçevesi task_profiles.json dosyasında açıklandığı gibi görev profillerini işleme veya iş parçacığı (SetTaskProfiles ve SetProcessProfiles API'leri) kullanır. (Bu API'ler Android 11 ve sonraki sürümlere özeldir.)

Eski sürüm, geriye dönük uyumluluk sağlamak için set_cpuset_policy, set_sched_policy ve get_sched_policy aynı API'yi ve işlevleri sunar. ancak bunların uygulaması görev profillerini kullanacak şekilde değiştirildi. 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 denetleyici bir alt bölümde açıklanmıştır ve en az aşağıdaki özelliklere sahip olmalıdır:

  • 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 cgrubu v1 (Cgroups) ve cgroup v2 ile ilgili açıklamalar gösterilmektedir (Cgroups2) denetleyiciler ve ilgili yollar.

{
  "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 (cgroup v1'i 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 özellikleri, dosyanın kök dizininin konumunu ve özelliklerini 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ında yer alı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
WriteFileFilePathdosyanın yolu
Valuedosyaya 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 üzerinde etkisi olmadan temel uygulamaları değiştirmek. 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'sinin dev/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

    Bunu, API düzeyine özel cgroups için kullanın.

  • /system/etc/task_profiles/task_profiles_<API level>.json

    Bir API düzeyine özel profiller için bunu kullanın.

Tedarikçi firma bölümündeki tanımları geçersiz kılmak için aşağıdaki dosyalar Cihazda mevcut olması 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:

  1. Varsayılan cgroups.json ve task_profiles.json dosyası olarak da kaydedebilir.
  2. Varsa API düzeyine özel dosyalar.
  3. Varsa tedarikçi bölümü dosyaları.

Mevcut API'de yapılan değişiklikler

Android 10 ve sonraki sürümlerde set_cpuset_policy, API'de değişiklik yapılmadan set_sched_policy ve get_sched_policy. Ancak Android 10'da bu işlevler libprocessgroup (artık toplulukla ilgili tüm işlevleri içeriyor).

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).
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).
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 grup denetleyicisi olup olmadığını döndürür; true ise path değişkenini bu cgrubun köküne ayarlar
bool CgroupGetAttributePath(const std::string& attr_name, 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 bu profil özelliğini kullanabilirsiniz.
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 cgroup'larını kullanacak şekilde yapılandırılıp yapılandırılmadığını döndürür.