리눅스는 포크 폭탄으로부터 보호 할 수단이 있습니까?


12
#include <unistd.h>
int main(int argc, char* argv[]) {
  while(1)
  {
    fork();
  } 
}

리눅스 에서이 프로그램을 실행하고 터미널에서 아무것도 출력하지 않으면 OS가 죽어 버린 것 같습니다. 리눅스는 메모리가 부족한 프로그램에 대한 보호 수단을 가지고 있습니까?


2
많은 배포판이 큰 스왑 파티션을 만들기 위해 제공하는 나쁜 조언을 따르지 않으면 영향이 훨씬 적을 것으로 생각됩니다 ...
R .. GitHub 중지

1
"65k에 도달 한 후 새로운 프로세스를 작성하지 않음"이 대책으로 간주됩니까? ;)
Bobby

답변:


18

이것은 포크 폭탄으로 알려져 있습니다.

리눅스는 메모리가 부족한 프로그램에 대한 보호 수단을 가지고 있습니까?

실제로는 아닙니다. 각 포크는 자체 가상 주소 공간과 메모리 사용량으로 새로운 프로세스를 생성합니다. 따라서 각 사본은 상대적으로 작습니다. 결국 시스템의 모든 물리적 + 스왑 메모리를 사용하게되고 메모리 부족 (OOM) 킬러가 개별 프로세스를 종료하기 시작합니다. 그러나 포크 폭탄은 여전히 ​​빠른 프로세스를 만듭니다 (더 빠르지 않은 경우).

이를 방지하는 한 가지 방법은 다음을 사용하여 사용자 프로세스 수를 제한하는 ulimit -u것입니다.


2
주목해야 할 것은 ulimit배쉬에만 적용 된다는 것 입니다. 다른 쉘은 동일한 내장 명령을 가지지 만 다른 이름을 가질 수 있습니다.
Jay

@Jay : 페어 포인트. 나는 대답에서 고마워요!
Oliver Charlesworth 2016 년

1
사용자 당 메모리 / 파일 설명자를 제한하는 것으로 충분합니다. 사용자 당 메모리를 제한하는 것은 항상 좋은 생각입니다. 프로세스가 종료 (oom) 될 때 워치 독은 알림을 보내 BOFH가 시스템에서 모든 속한 프로세스로 '불량'사용자를 부팅 할 수 있도록해야합니다

난 당신이 또한 로그인 매개 변수를 통해 몇 가지 제한을 설정할 수 있다고 생각
p_l

10

예, 시스템에서 기본적으로 활성화되어 있지 않을 수 있습니다. setrlimit사용자 당 프로세스의 수를 포함하여 - 시스템 호출은 시스템 제한을 정의합니다.

커널 API에서 먼저 살펴 보자 ( "linux"를 언급 했으므로) : setrlimit의 맨 페이지를 사용하면 다음과 같은 작업을 수행 할 수있다.

#include <sys/resource.h>
...

struct rlimit  r;

rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);

사용자 당 최대 프로세스 수 ( RLIMIT_NPROC)를 40 (소프트 한계) 및 50 (하드 한계)으로 설정합니다.

이제 쉘에서 bash를 사용하면 ulimit내장 명령을 사용할 수 있습니다 .

ulimit -u
29089

제한을 인수로 전달하여 제한을 설정할 수 있습니다.

ulimit -u 100

ulimit --help 설정할 수있는 몇 가지 다른 제한이 있음을 보여줍니다 (관심 할 수있는 것은 사용자가 사용하는 최대 파일 설명자 수임).


7

사용자 레벨 또는 시스템 레벨에서 사용할 것인지에 따라 다릅니다. 사용자 수준에서 ulimit(또는 다른 쉘에 해당하는 명령) 가장 쉬운 솔루션입니다.

그러나 시스템 수준에는 악의적 인 사용자 (또는 ulimit를 사용하지 않는)가 시스템을 중지하지 못하게하는 메커니즘이 있습니다. Linux cgroups 메커니즘은 그룹별로 리소스를 제한 할 수 있습니다. pam_systemd사용자 그룹이 특정 그룹에 있도록 ( 기계적으로) 강제 할 수 있습니다 . 이것은 CPU 스케줄러와 같은 다른 이점도 있습니다.


1
+1 : cgroup은 정말 새롭고 대부분의 사람들은 아직 잘 모르고 있습니다. 우리는 어디서 더 배울 수 있습니까?
Ken Bloom

1
@KenBloom : 1. 탐색하여 /sys/fs/cgroup/2. Google에서 검색하여 3. 탐색하여 make menuconfig4. 탐색 하여 /usr/src/linux/Documentation/cgroups5. 시스템 문서를 읽음. 더 이상 도울 수는 없지만 그 리소스 만 사용했습니다. 데스크톱에서 cgroup을 사용하여 리소스를 제어했습니다.
Maciej Piechotka 2016 년

6

ulimit -ubash 쉘에서 사용 하여 "최대 사용자 프로세스"에 대한 한계를 설정하십시오.

C 쉘에서 limit명령 을 사용합니다 .

이를 위해 시스템 호출이 필요한 경우 호출을 사용 setrlimit하여을 설정하십시오 RLIMIT_NPROC.


1

여기에 가장 최근의 답변이 3 년이 넘었으므로, 최신 커널 (4.3 이후)은 새로운 "PIDs 서브 시스템"을 통해 포크 폭탄을 방지하기 위해 명시 적으로 지원하고 있음을 지적하고 싶습니다. ( https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865chttps://git.kernel.org/cgit/linux/kernel/git 참조 /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.