2009-05-29 3 views
6

동일한 서버에서 서버와 클라이언트를 모두 사용하는 로컬 Linux 서버에서 테스트를 수행하고 있습니다. 약 1024 개의 연결 후, 내가 연결 한 코드에서 연결이 거부됩니다. 처음에는 select에 대한 1024의 fd_set_max 한계라고 생각하고 select 대신 poll을 수행하도록 서버를 변경했으며 여전히이 숫자를 지나치지 않습니다. 내 ulimit -n은 2048로 설정되고 서버의 lsof를 모니터링하여 약 1033 개 (정확한 숫자인지 확실하지 않음)에 도달하고 실패합니다. 어떤 도움이라도 대단히 감사합니다.1024 연결 이후에 연결이 거부되는 이유는 무엇입니까?

답변

-1

좀 더 조사한 후에 내 서버 쪽에서 대기열 깊이가 20 인 것 같습니다. 그 이유를 생각하고 있습니다. 너희들도 그 문제를 그렇게 생각하니?

감사

+0

아마 정직하게 말하자면. 대기열 깊이는 미해결 (불완전한) 요청의 수를 나타냅니다. 이전 요청이 완료되기 전에 연결 요청으로 서버를 플러딩하는 경우 아마도; 동기식으로 요청을 작성하는 경우에는 그렇지 않습니다. –

+0

이것은 2000 명의 사용자를위한 자동화 된 작업량이며 사용자 연결은 동기화되지 않습니다. 그래서 대기열 깊이가 문제가 될 수 있다고 생각합니다. 내 서버 팀에게 깊이를 교체하고 테스트를 기다리라고 요청했습니다. – Gentoo

2

열린 파일 설명자에 대한 프로세스 제한에 도달했을 수 있습니다.

정확하게 이해할 수 있을지 잘 모르겠습니다. 서버 측과 클라이언트 측 모두 동일한 프로세스에 있습니까? 그런 다음 두 배의 파일 설명자를 사용합니다. 그것은 당신이 ulimit로 보는 것에 가깝습니다. 그렇지 않은 경우 문제가 서버 측에있을 수 있습니까? 서버 프로세스의 설명자가 부족하여 더 이상 을 수락 할 수 없습니다. 에 도달 한

EMFILE
파일 기술자의 프로세스 별 제한 :

accept man page 당신의 반환 값을 얻을해야한다고 언급하고있다.

ENFILE
열린 파일의 총 수에 대한 시스템 제한에 도달했습니다.

어떤 오류 코드가 있습니까? 분명히 에 성공적으로 연결 한 연결 만 추가 할 수 있습니다. 또는 을 선택하십시오.

나는 당신이 이미 ulimit를을 확인하는 방법을 알고 알고 있지만, 다른 사람은하지 않을 수 있습니다 :

ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 40448 
max locked memory  (kbytes, -l) 32 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 4096 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 40448 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 
+0

감사합니다 (대신 설문 조사()를 사용)를 사용하지 않을 수 있습니다, 저를 보자 조금 더 자세하게 설명하십시오. 따라서 서버와 클라이언트는 모두 시스템에서 두 개의 별도 프로세스입니다. 서버는 모든 새로운 클라이언트 프로세스를 추적하는 관리자 이상의 역할을합니다. 따라서 클라이언트 프로세스는 포트에서 수신 대기중인 서버에 자신을 등록합니다. ~ 1024 클라이언트가 등록되면 미래의 클라이언트가 연결을 거부합니다. 그리고 나는 ulimit -a를 확인했다. 그리고 soft limit는 2048, hard는 4096으로 설정했다. – Gentoo

+0

@Gentoo 서버의 수락 호출에 오류가 있습니까? 만약 그렇다면 어느 것입니까? – lothar

+0

@Gentoo 유감스럽게도 accept에서 서버 반환 값을 알아야합니다. 아마도 서버에서 strace를 사용하면이 문제에 대한 정보를 얻을 수 있습니다. – lothar

0

서버가 받아들이 각 연결에 대해 별도의 로그 파일을 여는 어떤 위험이 있습니까?

다른 그룹은 서버에 어떤 상한선이 있다고 말합니까?

한 파일에 최대 파일 크기를 1MB로 설정 한 약간의 코드가있었습니다 (좋은 몇 년 전). 처음에는 파일을 추가 할 때 파일 크기가 커졌지 만 시간이 지나고 파일 크기가 늘어남에 따라 파일 크기가 줄어들 었다는 것을 알았습니다. 서버에 비슷한 문제가있을 가능성이 있습니까? 최대 열린 파일 수를 1024와 같이 엄청나게 높게 설정합니다.

0

대부분 사소한 질문에 사과 :
"폴링으로 변경"이라고 말하면 서버를 다시 컴파일 했습니까? 서버가 동일한 계정으로 실행되고 있습니까? fork - 또는 어쩌면 스레드 서버입니까? 클라이언트에서 connect()로 전화 한 후 errno == ECONNREFUSED을 받습니까? SYN에 대한 응답으로 RSTtcpdump으로 표시되는지 확인해주세요. 클라이언트 포트 번호가 재사용됩니까? TIME_WAIT 상태의 연결이 있습니까?

3

서버가 accept()을 호출하는 것보다 빠르게 연결하는 경우 보류중인 연결 대기열이 가득 찰 수 있습니다. 최대 대기열 길이는 서버의 listen()으로 두 번째 인수로 설정되고 더 낮은 경우 sysctl net.core.somaxconn (일반적으로 128)의 값으로 설정됩니다.

+0

감사합니다 ..이 설정에 대해 몰랐습니다 .. 내가 일할 때 내 시스템을 확인합니다 ... – Gentoo

-1

귀하의 제한은 Linux 사용자 제한에 의한 것입니다. 지정되지 않은 경우 Linux 제한은 1024 개의 열린 파일입니다. 영구적는 /etc/security/limits.conf을 편집하고 16,535

NOFILE

사용자 소프트 NOFILE 16,535 사용자 하드 추가하거나 콘솔에서

ulimit를 -n 16535

감사

을 시도하는 변경하려면
+0

나는 부드럽기 때문에 이것을 2048로, 하드를 위해서 4096으로 이것을 이미 설정했다. – Gentoo

0

나는 당신이 처리 루틴을 오류에서 가까운 (sock_fd) 문으로 만든 주석을 보았다.

close() 또는 shutdown()을 사용하면 명시 적으로 소켓을 닫고 있습니까?

나는 추측하지 않을 것이다. 실제로 1024 개 이상의 동시 활성 연결이 있습니까? 이 작업을 수행하려면 pthread가 있어야합니다. 그 맞습니까?

0

나는 동일한 증상을 나타 냈습니다. ulimit -n을 늘린 후에도 1024 개의 연결을 처리 할 수 ​​없었습니다 ...

1024x734 이상의 소켓 FD를 처리 할 수없는 select를 사용했습니다. 따라서 실제로 제한을 늘릴 때

그래서 비슷한 문제를 가진 사람이 도움을 (... 내가 처음에 발견하지 못한)! 변경된 : 당신이 1024 개 이상의 소켓을 원하는 경우

을 당신은

  • 에 있습니다 증가 (ulimit를 -n) 열린 FDS를 위해 당신의 제한
  • 하고 선택() 귀하의 빠른 응답
관련 문제