cgroup은 Linux 커널에서 제공하는 일종의 물리적 리소스(예: CPU, 메모리, 장치 IO)입니다. 프로세스 또는 프로세스 그룹 등을 제어할 수 있습니다.) 제한, 격리 및 통계 메커니즘. cgroup의 사용자 공간 관리는 cgroup 파일 시스템을 통해 구현됩니다. Linux의 가상 파일 시스템 덕분에 파일 시스템의 세부 사항은 숨겨지고 사용자는 관련 제어 파일을 통해 이 기능의 사용을 깨닫게 됩니다.
cgroup은 Linux 커널의 리소스 가상화를 위한 기술 기반이자 LXC(Linux 컨테이너) 및 Docker 컨테이너의 기술 초석입니다. cgroup에는 다음과 같은 관련 개념이 있습니다.
Part 02 cgroup 하위 시스템
커널 버전과 관련하여 커널이 반복됨에 따라 얻을 수 있는 리소스는 다음과 같습니다. 제한적 일반적으로 다음 하위 시스템을 포함하여 점점 더 많은 것이 있습니다.
➤ blkio: 물리적 장치(디스크, SSD, USB 등)와 같은 블록 장치에 대한 입/출력 액세스 제한을 설정합니다.
➤ cpu: CPU 예약 시간 분할 할당과 관련된 프로세스의 CPU 사용량을 제한합니다.
➤ cpuacct: cgroup의 작업에 사용되는 CPU 보고서를 자동으로 생성합니다.
➤ cpuset: cgroup의 작업에 독립적인 CPU(멀티 코어 시스템) 및 메모리 노드를 할당합니다.
➤ devices: 장치에 액세스하기 위한 cgroup의 작업을 허용하거나 거부합니다.
➤ freezer: cgroup에서 작업을 일시 중지하거나 재개합니다.
➤ memory: cgroup의 작업에 사용되는 메모리 제한을 설정하고 해당 작업에 사용되는 메모리 리소스에 대한 보고서를 자동으로 생성합니다.
➤ net_cls: 네트워크 패킷을 클래스 식별자로 표시하면 Linux 방황 제어 프로그램이 특정 cgroup에서 생성된 패킷을 식별할 수 있습니다.
➤ ns: 네임스페이스 하위 시스템.
cgroup 계층 구조와 결합하면 트리의 각 노드는 프로세스 그룹으로 이해될 수 있습니다. 여러 하위 시스템과 연관되어 있습니다. 트리에는 Linux 시스템의 모든 프로세스가 포함되지만 각 프로세스는 하나의 노드(프로세스 그룹)에만 속할 수 있습니다. 시스템에는 많은 cgroup 트리가 있을 수 있으며 각 트리는 서로 다른 하위 시스템과 연결되어 있습니다. 즉, 프로세스는 여러 프로세스 그룹에 속할 수 있지만 이러한 프로세스 그룹은 서로 다른 하위 시스템과 연결되어 있습니다. 현재 Linux는 최대 12개의 cgroup 트리를 구축할 수 있으며 각 트리는 하위 시스템과 연결됩니다. 물론 하나의 트리만 구축한 다음 이 트리를 모든 하위 시스템과 연결할 수도 있습니다. cgroup 트리가 어떤 서브시스템과도 연결되지 않은 경우 이는 트리가 프로세스만 그룹화한다는 의미이며, 그룹화를 기반으로 수행할 작업은 Systemd가 그러한 예입니다.
계층 구성에는 다음과 같은 네 가지 규칙이 있습니다.
규칙 1: 단일 계층은 하나 이상의 하위 시스템을 가질 수 있습니다. 그림 1에 표시된 대로 /cpu_memory_cg 수준은 cgroup1 및 cgroup2에 대해 CPU와 메모리라는 두 개의 하위 시스템을 설정합니다.
그림 1 계층 구조 규칙 1
규칙 2: 하위 시스템이 이미 한 수준에 연결된 경우 다른 수준의 구조에 연결할 수 없습니다. 그림 2에 표시된 대로 레벨 A의 cpu_cg는 먼저 CPU 하위 시스템을 관리하고, 레벨 B의 cpu_mem_cg는 CPU 하위 시스템을 관리할 수 없습니다.
그림 2 cgroup 계층 구조 규칙 2
규칙 3: 시스템에 새 계층이 생성될 때마다 시스템의 모든 작업은 처음에 해당 계층의 기본 cgroup(루트 cgroup이라고 함)의 멤버입니다. 생성된 단일 계층의 경우 시스템의 각 작업은 해당 계층의 cgroup 멤버가 될 수 있습니다. 각 cgroup이 서로 다른 서브시스템 계층에 있는 한 작업은 여러 cgroup에 있을 수 있습니다. 작업이 동일한 계층에 있는 두 번째 cgroup의 멤버가 되면 해당 계층에 있는 첫 번째 cgroup에서 삭제됩니다. 즉, 동일한 계층에 있는 서로 관련되지 않은 두 cgroup은 동일한 작업을 갖지 않습니다. 특정 프로세스에 대해 특정 유형의 cgroup 하위 시스템을 제한하는 한 가지 방법일 수 있습니다. 첫 번째 계층을 생성할 때 시스템의 모든 작업은 적어도 하나의 cgroup(루트 cgroup)의 멤버이므로 cgroup을 사용할 때 모든 시스템 작업은 그림 3에 표시된 것처럼 항상 적어도 하나의 cgroup에 있습니다.
그림 3 cgroup 계층 구조 규칙 3
규칙 4: 시스템에서 분기된 모든 프로세스는 하위 프로세스(또는 스레드)를 생성합니다. 하위 프로세스는 상위 프로세스의 cgroup 멤버십을 자동으로 상속하지만 필요에 따라 다른 cgroup으로 이동할 수 있습니다. 이동 후 상위 프로세스와 하위 프로세스는 그림 4와 같이 완전히 독립적입니다.
그림 4 cgroup 계층 구조 규칙 4
우리는 프로세스의 관점에서 시작하고 결합 소스 코드의 데이터 구조는 cgroup 관련 데이터 간의 관계를 분석하는 데 사용됩니다. 우선, Linux에서 관리 프로세스의 데이터 구조는 task_struct이며, cgroup과 관련된 멤버는 다음과 같습니다. , 프로세스 관련 cgroup 정보를 저장합니다. cg_list는 동일한 css_set을 사용하는 프로세스 연결 목록입니다. css_set 구조는 다음과 같습니다.
구조의 요소 정보는 다음과 같습니다.
refcount는 css_의 참조 횟수입니다. 설정할 수 있는 세트 여러 프로세스에서 공유됩니다. 이러한 프로세스의 cgroups 정보가 동일한 한 사용하십시오. 예를 들어, 생성된 모든 계층에서 동일한 cgroup의 프로세스입니다.
hlist는 모든 css_set를 해시 테이블에 구축하는 데 사용되며 커널은 특정 css_set를 빠르게 찾을 수 있습니다.
구조의 cgroup 포인터는 cgroup 구조를 가리킵니다. 프로세스는 cgroup이 위치에 있기 때문에 하위 시스템의 리소스에 의해 제어됩니다. 특정 수준의 하위 시스템이 계층 구조에 연결됩니다.
cgroup의 구조를 살펴보면,
css_set과 cgroup의 관계를 명확히 하기 위해 중간 계층의 cg_cgroup_link 구조도 분석해야 합니다.
구조의 데이터는 다음과 같습니다.
cgrp_link_list는 cgroup->css_sets가 가리키는 연결 목록에 연결됩니다.
cgrp는 이 cg_cgroup_link와 관련된 그룹을 가리킵니다.
cg_link_list는 css_set->cg_links가 가리키는 연결 목록에 연결됩니다.
cg는 cg_cgroup_link와 관련된 css_set을 가리킵니다.
cgroup과 css_set이 실제로 다대다 관계임을 알 수 있습니다. 이 둘을 결합하려면 중간 구조를 추가해야 합니다. cg_group_link의 cgrp 및 cg 요소는 둘을 결합하는 부분입니다. cgrp_link_list 및 cg_link_list의 링크된 목록은 폴링을 용이하게 하기 위해 첨부된 cgroup 및 css_set 엔터티입니다.
cgroup의 계층적 규칙에서 프로세스 그룹이 동일한 수준에 있지 않은 cgroup에 속할 수 있음을 알 수 있습니다. 종합적으로 이해하면 css_set은 프로세스 루트 그룹의 각 하위 시스템과 관련된 정보를 저장합니다. . 서브시스템은 서로 다른 cgroup 수준에서 나오므로 css_set에 저장된 cgroup_subsys_state는 여러 cgroup에 해당할 수 있습니다. 한편, cgroup 레벨에는 cgroup이 위치한 레벨에 연결된 서브시스템에서 얻은 cgroup_subsys_state 세트도 저장되며, cgroup은 여러 프로세스를 가질 수 있으며 프로세스의 css_set이 반드시 동일할 필요는 없습니다. 프로세스가 여러 수준을 사용할 수 있기 때문에 cgroup도 여러 css_set에 대응해야 합니다. 그림 5에서는 다대다 후킹 관계를 자세히 설명합니다.
그림 5 프로세스 및 cgroup 다대다 관계 다이어그램
본 글에서는 cgroup의 개념을 바탕으로 cgroup과 프로세스 사이의 다대다 관계를 분해하고, 관련 변수의 Hooking에서 분석한다. 특정 코드 구현은 독자가 cgroup의 계층적 관계와 사용법을 더 잘 이해하는 데 도움이 되기를 바랍니다.
위 내용은 5분간의 기술적인 재미 | Linux Cgroup 계층 구조 규칙에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!