2014-10-16 4 views
13

나는 수천 개의 동시 웹 소켓 연결을 처리하는 웹 서버를 실행하고 있습니다. 이것이 가능하려면 Debian 리눅스에서 (기본 이미지는 google/debian : GCE에서 실행되는 wheezy입니다.), 열린 파일의 기본 숫자가 1000으로 설정되어있는 경우, 보통 ulimit을 원하는 숫자 (64,000)로 설정합니다. .Docker가 limits.conf를 무시합니다 ("너무 많은 열린 파일"오류를 해결하려고합니다).

내 응용 프로그램을 도킹 해제하고 배포 한 경우를 제외하고 이것은 훌륭하게 작동합니다. 한 가지 종류의 제한 도구가 한계 정의를 무시한다는 사실을 알았습니다.

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf" 
: 나는 사람들이이 일을하여 유사한 문제를 해결할 수 사실을 발견

MAX=64000 
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf" 
sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile" 
ulimit -c $MAX 

어떤 연구를하고 후 : 나는 (안 용기 자체에서, 호스트 시스템의 모든) 다음을 시도

그리고 docker 서비스를 재부팅/다시 시작하십시오.

그러나 위의 모든 오류가 발생합니다. 응용 프로그램이 컨테이너 내부에서 실행될 때 "너무 많은 열린 파일"오류가 발생합니다 (문제를 해결하는 다음 작업을 수행함).

ulimit 설정이 제대로 작동했는지 알기 위해 컨테이너 내부에 ulimit -a을 실행하려고 시도했지만 PATH의 일부인 실행 파일이 아닌 ulimit에 대한 오류가 발생합니다.

누구나이 사람을 만났거나 도커가 한계를 인식 할 수있는 방법을 제안 할 수 있습니까?

답변

9

나는 다음과 같은 구성으로이 문제를 mitgiate 할 수 있었다 :

나는 14.04 리눅스 고정 표시기 시스템과 호스트 시스템에 대한 우분투를 사용했다. 포함

  • 업데이트는 /etc/security/limits.conf : * - nofile 64000
  • 당신의 /etc/sysctl.conf에 추가 : fs.file-max = 64000
  • 당신이 필요로하는 호스트 시스템에서

  • restart sysctl : sudo sysctl -p
+4

Docker 데몬 서비스도 다시 시작하십시오! – cgp

1

도커로 작성하면 ulimits를 구성 할 수 있습니다.

https://docs.docker.com/compose/compose-file/#ulimits

당신은 매핑 소프트/하드 한계를 추가 할 수 있습니다.

하면 권한 옵션을 용기 실행할 수 있습니다 적합하지 않지만
ulimits: 
    nproc: 65535 
    nofile: 
    soft: 20000 
    hard: 40000 

(보안이 필요한 경우 대부분 데브 환경에 대한 빠른 비 최적의 솔루션을 권장하지 않음).

docker run --privileged 

참조하십시오

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

+0

이것은 끔찍한 생각입니다. –

2

컨테이너를 실행하는 동안 제한을 인수로 전달할 수 있습니다. 그렇게하면 호스트 한계를 수정하거나 컨테이너에 너무 많은 전력을 공급할 필요가 없습니다.방법은 다음과 같습니다.

docker run --ulimit nofile=5000:5000 <image-tag>