>  기사  >  운영 및 유지보수  >  5분간의 기술적인 재미 | Linux Cgroup 계층 구조 규칙에 대한 간략한 분석

5분간의 기술적인 재미 | Linux Cgroup 계층 구조 규칙에 대한 간략한 분석

WBOY
WBOY앞으로
2023-06-09 14:18:481981검색

五分钟技术趣谈 | Linux Cgroup层级规则简析

Part 01 cgroup 개요

cgroup은 Linux 커널에서 제공하는 일종의 물리적 리소스(예: CPU, 메모리, 장치 IO)입니다. 프로세스 또는 프로세스 그룹 등을 제어할 수 있습니다.) 제한, 격리 및 통계 메커니즘. cgroup의 사용자 공간 관리는 cgroup 파일 시스템을 통해 구현됩니다. Linux의 가상 파일 시스템 덕분에 파일 시스템의 세부 사항은 숨겨지고 사용자는 관련 제어 파일을 통해 이 기능의 사용을 깨닫게 됩니다.

cgroup은 Linux 커널의 리소스 가상화를 위한 기술 기반이자 LXC(Linux 컨테이너) 및 Docker 컨테이너의 기술 초석입니다. cgroup에는 다음과 같은 관련 개념이 있습니다.

  • Task: 프로세스의 다른 이름
  • Control 그룹: 특정 A 세트 팔로우 프로세스를 표준으로 나눈 것입니다. Cgroup의 리소스 제어는 제어 그룹 단위로 구현됩니다. 프로세스는 제어 그룹에 추가되거나 한 프로세스 그룹에서 다른 프로세스 그룹으로 마이그레이션될 수 있습니다. 프로세스 그룹의 프로세스는 제어 그룹 단위로 cgroup이 할당한 리소스를 사용할 수 있으며 제어 그룹 단위로 cgroup이 설정한 리소스 제한이 적용됩니다.
  • 계층 구조: 제어 그룹의 계층 관계는 하위 노드의 제어 그룹이 상위 노드의 리소스 설정 속성을 상속합니다.
  • 하위 시스템(하위 시스템): A 하위 시스템은 리소스 컨트롤러입니다. 예를 들어, CPU 하위 시스템은 그림 1과 같이 프로세스 CPU 사용 시간 할당을 제어할 수 있습니다. 서브시스템이 작동하려면 레벨에 연결되어야 합니다. 서브시스템이 특정 레벨에 연결된 후에는 이 레벨의 모든 제어 그룹이 이 서브시스템에 의해 제어됩니다.

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: 네임스페이스 하위 시스템.

Part 03 cgroup 계층 구조 규칙

cgroup 계층 구조와 결합하면 트리의 각 노드는 프로세스 그룹으로 이해될 수 있습니다. 여러 하위 시스템과 연관되어 있습니다. 트리에는 Linux 시스템의 모든 프로세스가 포함되지만 각 프로세스는 하나의 노드(프로세스 그룹)에만 속할 수 있습니다. 시스템에는 많은 cgroup 트리가 있을 수 있으며 각 트리는 서로 다른 하위 시스템과 연결되어 있습니다. 즉, 프로세스는 여러 프로세스 그룹에 속할 수 있지만 이러한 프로세스 그룹은 서로 다른 하위 시스템과 연결되어 있습니다. 현재 Linux는 최대 12개의 cgroup 트리를 구축할 수 있으며 각 트리는 하위 시스템과 연결됩니다. 물론 하나의 트리만 구축한 다음 이 트리를 모든 하위 시스템과 연결할 수도 있습니다. cgroup 트리가 어떤 서브시스템과도 연결되지 않은 경우 이는 트리가 프로세스만 그룹화한다는 의미이며, 그룹화를 기반으로 수행할 작업은 Systemd가 그러한 예입니다.

계층 구성에는 다음과 같은 네 가지 규칙이 있습니다.

규칙 1: 단일 계층은 하나 이상의 하위 시스템을 가질 수 있습니다. 그림 1에 표시된 대로 /cpu_memory_cg 수준은 cgroup1 및 cgroup2에 대해 CPU와 메모리라는 두 개의 하위 시스템을 설정합니다.

五分钟技术趣谈 | Linux Cgroup层级规则简析

그림 1 계층 구조 규칙 1

규칙 2: 하위 시스템이 이미 한 수준에 연결된 경우 다른 수준의 구조에 연결할 수 없습니다. 그림 2에 표시된 대로 레벨 A의 cpu_cg는 먼저 CPU 하위 시스템을 관리하고, 레벨 B의 cpu_mem_cg는 CPU 하위 시스템을 관리할 수 없습니다.

五分钟技术趣谈 | Linux Cgroup层级规则简析

그림 2 cgroup 계층 구조 규칙 2

규칙 3: 시스템에 새 계층이 생성될 때마다 시스템의 모든 작업은 처음에 해당 계층의 기본 cgroup(루트 cgroup이라고 함)의 멤버입니다. 생성된 단일 계층의 경우 시스템의 각 작업은 해당 계층의 cgroup 멤버가 될 수 있습니다. 각 cgroup이 서로 다른 서브시스템 계층에 있는 한 작업은 여러 cgroup에 있을 수 있습니다. 작업이 동일한 계층에 있는 두 번째 cgroup의 멤버가 되면 해당 계층에 있는 첫 번째 cgroup에서 삭제됩니다. 즉, 동일한 계층에 있는 서로 관련되지 않은 두 cgroup은 동일한 작업을 갖지 않습니다. 특정 프로세스에 대해 특정 유형의 cgroup 하위 시스템을 제한하는 한 가지 방법일 수 있습니다. 첫 번째 계층을 생성할 때 시스템의 모든 작업은 적어도 하나의 cgroup(루트 cgroup)의 멤버이므로 cgroup을 사용할 때 모든 시스템 작업은 그림 3에 표시된 것처럼 항상 적어도 하나의 cgroup에 있습니다.

五分钟技术趣谈 | Linux Cgroup层级规则简析

그림 3 cgroup 계층 구조 규칙 3

규칙 4: 시스템에서 분기된 모든 프로세스는 하위 프로세스(또는 스레드)를 생성합니다. 하위 프로세스는 상위 프로세스의 cgroup 멤버십을 자동으로 상속하지만 필요에 따라 다른 cgroup으로 이동할 수 있습니다. 이동 후 상위 프로세스와 하위 프로세스는 그림 4와 같이 완전히 독립적입니다.

五分钟技术趣谈 | Linux Cgroup层级规则简析

그림 4 cgroup 계층 구조 규칙 4


파트 04cgroup 계층 관계 분석

우리는 프로세스의 관점에서 시작하고 결합 소스 코드의 데이터 구조는 cgroup 관련 데이터 간의 관계를 분석하는 데 사용됩니다. 우선, Linux에서 관리 프로세스의 데이터 구조는 task_struct이며, cgroup과 관련된 멤버는 다음과 같습니다. , 프로세스 관련 cgroup 정보를 저장합니다. cg_list는 동일한 css_set을 사용하는 프로세스 연결 목록입니다. css_set 구조는 다음과 같습니다.

五分钟技术趣谈 | Linux Cgroup层级规则简析

구조의 요소 정보는 다음과 같습니다.

refcount는 css_의 참조 횟수입니다. 설정할 수 있는 세트 여러 프로세스에서 공유됩니다. 이러한 프로세스의 cgroups 정보가 동일한 한 사용하십시오. 예를 들어, 생성된 모든 계층에서 동일한 cgroup의 프로세스입니다. 五分钟技术趣谈 | Linux Cgroup层级规则简析

hlist는 모든 css_set를 해시 테이블에 구축하는 데 사용되며 커널은 특정 css_set를 빠르게 찾을 수 있습니다.

    tasks는 이 css_set을 참조하는 모든 프로세스를 연결 목록에 연결합니다.
  • cg_links는 cg_group_link 구조체로 구성된 연결 목록을 가리킵니다.
  • subsys는 cgroup_subsys_state에 대한 포인터 집합을 저장하는 포인터 배열입니다. cgroup_subsys_state는 프로세스 및 특정 서브시스템과 관련된 정보입니다. 이 포인터를 통해 프로세스는 해당 cgroup 제어 정보를 얻을 수 있습니다.
  • 다음으로 cgroup_subsys_state 구조를 살펴보겠습니다.

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    구조의 cgroup 포인터는 cgroup 구조를 가리킵니다. 프로세스는 cgroup이 위치에 있기 때문에 하위 시스템의 리소스에 의해 제어됩니다. 특정 수준의 하위 시스템이 계층 구조에 연결됩니다.

    cgroup의 구조를 살펴보면,

    • sibling, children, parent는 같은 레벨의 cgroup을 트리로 연결하는 세 개의 연결 리스트입니다.
    • susys는 앞에서 설명한 하위 시스템 포인터 배열입니다.
    • root는 cgroup이 위치한 레벨에 해당하는 구조인 cgroupfs_root 구조를 가리킵니다.
    • root->top_cgroup은 현재 레벨의 루트 cgroup을 가리키며, 이는 Fantasy Sword 레벨에서 자동으로 생성된 cgroup입니다. cgroup->root->top_cgroup을 통해 계층 구조의 루트 cgroup을 얻을 수 있습니다.
    • css_sets는 css_set의 cg_links와 일치하는 cg_cgroup_link의 링크된 목록을 가리킵니다.

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    css_set과 cgroup의 관계를 명확히 하기 위해 중간 계층의 cg_cgroup_link 구조도 분석해야 합니다.

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    구조의 데이터는 다음과 같습니다.

    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에서는 다대다 후킹 관계를 자세히 설명합니다.

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    그림 5 프로세스 및 cgroup 다대다 관계 다이어그램

    Part 05 결론

    본 글에서는 cgroup의 개념을 바탕으로 cgroup과 프로세스 사이의 다대다 관계를 분해하고, 관련 변수의 Hooking에서 분석한다. 특정 코드 구현은 독자가 cgroup의 계층적 관계와 사용법을 더 잘 이해하는 데 도움이 되기를 바랍니다.

위 내용은 5분간의 기술적인 재미 | Linux Cgroup 계층 구조 규칙에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제