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 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 ve SetProcessProfiles 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
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ı 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'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

    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:

  1. Varsayılan cgroups.json ve task_profiles.json dosyası olarak da kaydedebilir.
  2. API düzeyine özel dosyalar (varsa).
  3. 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)
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 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.