Linux 시스템 관리자로서 프로세스와 스레드의 개념과 이에 상응하는 실무 기술을 이해하고 숙달하는 것은 매우 중요합니다. 이는 시스템 리소스를 더 잘 관리하는 데 도움이 될 뿐만 아니라 시스템의 운영 효율성과 안정성도 향상시킵니다. 이 기사에서는 Linux 프로세스 및 스레드에 대한 심층적인 이해를 제공하고 몇 가지 실용적인 팁과 도구를 공유합니다.
프로세스는 특정 데이터 수집에 대해 특정 독립적 기능을 갖춘 프로그램의 실행 활동입니다. 운영 체제의 동적 실행의 기본 단위입니다. 기존 운영 체제에서는 프로세스가 기본 할당 단위이자 기본 실행 단위입니다.
프로세스
프로세스는 특정 데이터 수집에 대해 특정 독립적 기능을 갖춘 프로그램의 실행 활동입니다. 운영 체제의 동적 실행의 기본 단위입니다. 기존 운영 체제에서는 프로세스가 기본 할당 단위이자 기본 실행 단위입니다. 프로세스 개념에는 두 가지 주요 사항이 있습니다. 첫째, 프로세스는 엔터티입니다. 각 프로세스에는 일반적으로 텍스트 영역, 데이터 영역 및 스택 영역을 포함하는 자체 주소 공간이 있습니다. 텍스트 영역은 프로세서에 의해 실행되는 코드를 저장하고, 데이터 영역은 프로세스 실행 중에 사용되는 변수와 동적으로 할당된 메모리를 저장하고, 스택 영역은 활성 프로시저 호출을 위한 명령과 로컬 변수를 저장합니다. 둘째, 프로세스는 "실행 프로그램"입니다. 프로그램은 무생물입니다. 프로세서가 프로그램에 생명을 불어넣을 때만(운영 체제에 의해 실행됨) 이를 프로세스라고 부릅니다.
스레드
스레드는 운영체제가 작업 스케줄링을 수행할 수 있는 가장 작은 단위입니다. 프로세스에 포함되며 프로세스에서 실제 작동하는 단위입니다. 스레드는 프로세스에서 단일 순차 제어 흐름을 의미하며 여러 스레드가 프로세스에서 동시에 실행될 수 있으며 각 스레드는 서로 다른 작업을 병렬로 수행합니다. Unix System V 및 SunOS에서는 경량 프로세스라고도 하지만 경량 프로세스는 커널 스레드를 더 많이 참조하고 사용자 스레드는 스레드라고 합니다. 프로세스와 스레드 간의 관계 동일한 프로세스의 여러 스레드는 가상 주소 공간, 파일 설명자, 신호 처리 등과 같은 프로세스의 모든 시스템 리소스를 공유합니다. 그러나 동일한 프로세스의 여러 스레드에는 자체 호출 스택, 자체 레지스터 컨텍스트 및 자체 스레드 로컬 저장소가 있습니다.
Linux의 스레드 및 프로세스
리눅스 커널에서는 프로세스와 스레드가 모두 작업이지만 구별해야 합니다. 여기서 pid는 프로세스 ID이고 tgid는 스레드 그룹 ID입니다. 어떤 프로세스에서든 메인 스레드만 있으면 pid는 그 자체이고, tgid는 그 자체이며, group_leader는 여전히 그 자신을 가리킵니다. 그러나 프로세스가 다른 스레드를 생성하면 상황이 변경됩니다. 스레드에는 자체 pid가 있고, tgid는 프로세스 메인 스레드의 pid이고, group_leader는 프로세스의 메인 스레드를 가리킵니다. 따라서 tgid를 사용하면 Taste_struct가 프로세스를 나타내는지 아니면 스레드를 나타내는지 알 수 있습니다. 관계는 다음과 같습니다:
스레드 및 프로세스의 커널 매개변수 정보
ulimit 제한, Linux에서 ulimit -a를 실행하면 다양한 리소스에 대한 ulimit 제한이 표시됩니다.
"최대 사용자 프로세스"는 프로세스가 생성할 수 있는 최대 스레드 수입니다. 이 매개변수를 수정할 수 있습니다.
으아악2. 매개변수 sys.kernel.threads-max 제한. 이 매개변수는 운영 체제에서 전역적으로 스레드 수를 제한합니다. 다음 명령을 통해 해당 값을 볼 수 있습니다. 스레드 최대 방법 보기:
으아악이 값을 수정하는 방법:
으아악3. 매개변수 sys.kernel.pid_max 제한. 이 매개변수는 운영 체제에서 전역적으로 스레드 수를 제한합니다. 다음 명령을 통해 해당 값을 볼 수 있습니다. 32비트 운영 체제에 대해 이야기하겠습니다. 최대값은 32768이며 64비트 시스템에서 pid_max의 최대값은 2^22입니다. Linux 커널이 시스템을 초기화할 때 시스템의 CPU 수에 따라 pid_max 값을 설정합니다. 예를 들어, 머신의 CPU 수가 32보다 작거나 같으면 pid_max는 32768(32K)로 설정됩니다. 머신의 CPU 수가 32보다 크면 pid_max는 N으로 설정됩니다. *1024(N은 CPU 수) pid_max 확인 방법:
으아악이 값을 수정하는 방법:
으아악참고: 여러 스레드도 pid를 차지하므로 thread-max는 pid_max보다 작거나 같아야 합니다.
컨테이너 스레드 수 제한
Linux 시스템의 경우 컨테이너는 프로세스 모음입니다. 컨테이너의 애플리케이션이 너무 많은 프로세스를 생성하거나 버그가 있으면 포크 폭탄과 유사한 동작이 발생합니다. 이런 방식으로 동일한 노드에 있는 다른 컨테이너가 작동할 수 없을 뿐만 아니라 호스트 자체도 작동할 수 없게 됩니다. 따라서 각 컨테이너에 대해 최대 프로세스 수를 제한해야 하며 이 기능은 pids Cgroup 하위 시스템에 의해 완료됩니다. Java 애플리케이션은 많은 예약된 작업을 처리해야 하기 때문에 예약된 작업이 스레드를 가져오는 경우가 있습니다. 그러나 코드의 버그로 인해 스레드가 제때에 재활용되지 않고 컨테이너에서 계속 스레드가 생성되어 호스트의 프로세스 테이블 공간이 소진되어 결국 전체 Linux 서비스에서 "java.lang.OutOfMemoryError" 오류를 보고하게 되었습니다. : 네이티브 스레드를 생성할 수 없습니다." 오류가 발생하여 다른 서비스에 영향을 미칩니다. 생성 과정에서 "리소스를 일시적으로 사용할 수 없습니다"라는 오류 메시지가 나타납니다. 개발자가 버그를 수정할 수 있도록 허용하는 것 외에도 이러한 종류의 문제에는 시스템 수준에서 스레드 수를 제한해야 합니다.
cgroup
Pids는 cgroup에서 격리됩니다. docker/kubelet 구성을 변경하면 총 PID 수를 제한하여 총 스레드 수를 제한할 수 있습니다.
docker, 컨테이너가 시작될 때 –pids-limit 매개변수를 설정하여 컨테이너 수준에서 총 PID 수를 제한하세요
kubelet, SupportPodPidsLimit 기능을 활성화하고 –pod-max-pids 매개변수를 설정하고 노드의 각 Pod에 대한 총 PID 수를 제한하세요
원칙은 다음과 같습니다. 컨테이너가 생성된 후 컨테이너를 생성하는 서비스는 제어 그룹인 /sys/fs/cgroup/pids 아래에 하위 디렉터리를 생성합니다. 이 하위 디렉터리는 제어 그룹에서 가장 중요한 파일인 pids입니다. 최대. Kubelet 또는 docker는 이 파일에 값을 기록하며, 이 값은 이 컨테이너에 허용되는 최대 프로세스 수입니다. Kubernetes의 각 노드는 컨테이너 생성 및 삭제와 같이 노드에 있는 컨테이너의 상태 및 수명 주기를 담당하는 Kubelet이라는 서비스를 실행합니다. 공식 Kubernetes 문서 Process ID Limits And Reservations에 따르면 Kubelet 서비스의 –pod-max-pids 구성 옵션을 설정할 수 있습니다. 이 노드에서 생성된 후속 컨테이너는 결국 Cgroups pid 컨트롤러를 사용하여 컨테이너.
요약
이 기사의 소개와 분석을 통해 우리는 개념, 차이점, 상태 전환 및 이것이 Linux 프로세스 및 스레드의 시스템 리소스에 미치는 영향을 이해합니다. 동시에 프로세스 튜닝, 탐지 도구, 관리 도구 등 몇 가지 실용적인 팁과 도구도 공유했습니다. 이러한 도구와 기술은 시스템 리소스를 더 잘 관리하고 시스템의 운영 효율성과 안정성을 향상시키는 데 도움이 될 뿐만 아니라 작업 효율성과 경쟁력도 향상시킵니다. 따라서 Linux 프로세스와 스레드의 중요성과 실용적인 기술을 습득하는 것이 매우 필요합니다.
위 내용은 Linux 프로세스 및 스레드의 중요성과 실무 기술을 습득하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!