Linux가 제한을 올바르게 적용하지 않습니까?

Linux가 제한을 올바르게 적용하지 않습니까?

테스트 시스템에 대한 실험으로 /etc/security/limits.conf시스템에 로그인했을 때 16개의 프로세스가 실행 중이었습니다(모두 내 uid에 ruid, euid 및 suid가 있음).

먼저 하드 제한과 소프트 제한을 20으로 설정해 보았습니다. 로그아웃한 후에는 프로세스를 생성할 수 없기 때문에 다시 로그인할 수 없습니다. 30개로 제한을 늘렸는데 여전히 들어갈 수 없습니다. 프로세스 제한을 50개로 늘리면 들어갈 수 있지만 zsh일부 오류가 발생합니다. 나는 2개의 프로세스를 더 만들 수 있다는 것을 알았고 그게 전부였습니다.

내 질문은 제한을 N(이 경우 20)으로 설정하면 작동하지 않는 이유입니다.정확히N 프로세스를 제한으로 강제하시겠습니까? 사용자가 한도에 가까워지면 한도가 적용되나요? 그렇지 않으면 여전히 한도 미만의 공간이 있는데 왜 더 많은 프로세스를 생성할 수 없는지 이해할 수 없습니다.

표준 Debian에서 Linux 4.19 실행(systemd 기반)

편집하다:

프로세스를 계산하기 위해 다음을 시도했습니다.

ps ux: 14개의 프로세스가 생성됩니다.

더 나은 측정을 위해

cat /proc/*/status | grep Uid | grep 1000 | wc -l: 16개의 프로세스를 생성합니다.

예상되는 차이는 oneliner에서 사용하는 추가 프로세스로 인해 발생합니다.

(my uid)의 출력은 grep 1000다음과 같습니다.

Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000
Uid:    1000    1000    1000    1000

이는 모든 것이 실제, 유효, 저장 및 fsuid 1000(나)으로 실행되고 있음을 보여줍니다.

저는 프로세스를 신뢰하고 자체적으로 계산하기 때문에 정확히 13개의 프로세스가 있다고 생각합니다 ps. 따라서 프로세스는 13개가 되어야 합니다. 그렇죠?

답변1

에 따르면 man 2 setrlimit:

   RLIMIT_NPROC
         This is a limit on the number of extant process (or, more precisely on  Linux,  threads)

틀림없이 이것은 다소 반직관적입니다. 어떤 경우든 로그인 프로세스는 많은 수의 스레드를 생성할 수 있으며 스레드 수가 약 20 또는 30으로 설정되면 이러한 스레드가 제한을 초과합니다.

로그인 테스트를 해보니그 다음에제한을 낮추고 오류가 발생할 때까지 간단한 단일 스레드 프로세스를 분기합니다. 한도는 예상대로 작동합니다.

관련 정보