문제가 발생했습니다.
fork: Resource temporarily unavailable
nproc
그것이 문제라는 것을 알고 있습니다 . 어떤 사람들은 소프트 한도를 높이라고 제안하는 nproc
반면 다른 사람들은 하드 한도를 높이라고 제안합니다.
어느 것을 추가해야 하나요? 사용자에게 경고하기 위해 소프트 제한이 있고 결국 실제 제한이 하드 제한에 있습니까?
답변1
실제로는 그 반대입니다.
소프트 제한 값은 실제로 구현됩니다. 즉, 사용 시 제한을 관련 하드 제한 값으로 늘릴 수 있습니다(수퍼유저가 아니거나 CAP_SYS_RESOURCE
능력이 있다고 가정).
답변2
하드 제한과 소프트 제한을 각각 필수 제한과 임의 제한으로 생각하세요. 하드 제한은 시스템에 의해(예: 적절한 구성을 통해 limits.conf(5)
) 부과되며 수퍼유저(예: 루트)에 의해서만 증가될 수 있는 반면, 사용자는 해당 하드 제한 범위 내에서 자신의 재량에 따라 소프트 제한을 판단할 수 있습니다.
getrlimits(2)
매뉴얼 페이지 에서 :
소프트 제한은 해당 리소스에 대해 커널이 적용하는 값입니다. 하드 제한은 소프트 제한의 상한 역할을 합니다. 권한이 없는 프로세스는 소프트 제한을 0에서 하드 제한 범위의 값으로만 설정할 수 있고 (되돌릴 수 없게) 하드 제한을 낮출 수 있습니다.
따라서 리소스 제한에 도달하면 해당 소프트 제한을 늘릴 수 있는지 확인하고, 그렇지 않으면 하드 제한을 늘려야 합니다.
댓글에 대한 응답
그와 같은 일은 없다엄격한 제한만 있음. 한계는 setrlimit(2)
그것이 무엇을 의미하는지에 따라 설정됩니다 struct rlimit
. 여기에는 소프트 제한 멤버와 하드 제한 멤버( rlim_cur
및 각각 rlim_max
)가 있습니다. 소프트 제한이 명시적으로 정의되지 않은 경우 기본값은 해당 하드 제한일 가능성이 높지만 이는 제한 설정 프로세스에 따라 다릅니다. ( 초과하는 것을 setrlimits(2)
거부 하므로 일반적 으로rlim_cur
rlim_max
RLIM_INFINITY
아니요에 대한 유효한 기본값입니다 rlim_cur
. )