동일한 서버에서 서버와 클라이언트를 모두 사용하는 로컬 Linux 서버에서 테스트를 수행하고 있습니다. 약 1024 개의 연결 후, 내가 연결 한 코드에서 연결이 거부됩니다. 처음에는 select에 대한 1024의 fd_set_max 한계라고 생각하고 select 대신 poll을 수행하도록 서버를 변경했으며 여전히이 숫자를 지나치지 않습니다. 내 ulimit -n은 2048로 설정되고 서버의 lsof를 모니터링하여 약 1033 개 (정확한 숫자인지 확실하지 않음)에 도달하고 실패합니다. 어떤 도움이라도 대단히 감사합니다.1024 연결 이후에 연결이 거부되는 이유는 무엇입니까?
답변
좀 더 조사한 후에 내 서버 쪽에서 대기열 깊이가 20 인 것 같습니다. 그 이유를 생각하고 있습니다. 너희들도 그 문제를 그렇게 생각하니?
감사
열린 파일 설명자에 대한 프로세스 제한에 도달했을 수 있습니다.
정확하게 이해할 수 있을지 잘 모르겠습니다. 서버 측과 클라이언트 측 모두 동일한 프로세스에 있습니까? 그런 다음 두 배의 파일 설명자를 사용합니다. 그것은 당신이 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
감사합니다 (대신 설문 조사()를 사용)를 사용하지 않을 수 있습니다, 저를 보자 조금 더 자세하게 설명하십시오. 따라서 서버와 클라이언트는 모두 시스템에서 두 개의 별도 프로세스입니다. 서버는 모든 새로운 클라이언트 프로세스를 추적하는 관리자 이상의 역할을합니다. 따라서 클라이언트 프로세스는 포트에서 수신 대기중인 서버에 자신을 등록합니다. ~ 1024 클라이언트가 등록되면 미래의 클라이언트가 연결을 거부합니다. 그리고 나는 ulimit -a를 확인했다. 그리고 soft limit는 2048, hard는 4096으로 설정했다. – Gentoo
@Gentoo 서버의 수락 호출에 오류가 있습니까? 만약 그렇다면 어느 것입니까? – lothar
@Gentoo 유감스럽게도 accept에서 서버 반환 값을 알아야합니다. 아마도 서버에서 strace를 사용하면이 문제에 대한 정보를 얻을 수 있습니다. – lothar
서버가 받아들이 각 연결에 대해 별도의 로그 파일을 여는 어떤 위험이 있습니까?
다른 그룹은 서버에 어떤 상한선이 있다고 말합니까?
한 파일에 최대 파일 크기를 1MB로 설정 한 약간의 코드가있었습니다 (좋은 몇 년 전). 처음에는 파일을 추가 할 때 파일 크기가 커졌지 만 시간이 지나고 파일 크기가 늘어남에 따라 파일 크기가 줄어들 었다는 것을 알았습니다. 서버에 비슷한 문제가있을 가능성이 있습니까? 최대 열린 파일 수를 1024와 같이 엄청나게 높게 설정합니다.
대부분 사소한 질문에 사과 :
"폴링으로 변경"이라고 말하면 서버를 다시 컴파일 했습니까? 서버가 동일한 계정으로 실행되고 있습니까? fork
- 또는 어쩌면 스레드 서버입니까? 클라이언트에서 connect()
로 전화 한 후 errno == ECONNREFUSED
을 받습니까? SYN
에 대한 응답으로 RST
이 tcpdump
으로 표시되는지 확인해주세요. 클라이언트 포트 번호가 재사용됩니까? TIME_WAIT
상태의 연결이 있습니까?
서버가 accept()
을 호출하는 것보다 빠르게 연결하는 경우 보류중인 연결 대기열이 가득 찰 수 있습니다. 최대 대기열 길이는 서버의 listen()
으로 두 번째 인수로 설정되고 더 낮은 경우 sysctl net.core.somaxconn
(일반적으로 128)의 값으로 설정됩니다.
감사합니다 ..이 설정에 대해 몰랐습니다 .. 내가 일할 때 내 시스템을 확인합니다 ... – Gentoo
귀하의 제한은 Linux 사용자 제한에 의한 것입니다. 지정되지 않은 경우 Linux 제한은 1024 개의 열린 파일입니다. 영구적는 /etc/security/limits.conf을 편집하고 16,535
NOFILE
사용자 소프트 NOFILE 16,535 사용자 하드 추가하거나 콘솔에서
ulimit를 -n 16535
감사
을 시도하는 변경하려면나는 부드럽기 때문에 이것을 2048로, 하드를 위해서 4096으로 이것을 이미 설정했다. – Gentoo
나는 당신이 처리 루틴을 오류에서 가까운 (sock_fd) 문으로 만든 주석을 보았다.
close() 또는 shutdown()을 사용하면 명시 적으로 소켓을 닫고 있습니까?
나는 추측하지 않을 것이다. 실제로 1024 개 이상의 동시 활성 연결이 있습니까? 이 작업을 수행하려면 pthread가 있어야합니다. 그 맞습니까?
나는 동일한 증상을 나타 냈습니다. ulimit -n을 늘린 후에도 1024 개의 연결을 처리 할 수 없었습니다 ...
1024x734 이상의 소켓 FD를 처리 할 수없는 select를 사용했습니다. 따라서 실제로 제한을 늘릴 때
그래서 비슷한 문제를 가진 사람이 도움을 (... 내가 처음에 발견하지 못한)! 변경된 : 당신이 1024 개 이상의 소켓을 원하는 경우
을 당신은
- 에 있습니다 증가 (ulimit를 -n) 열린 FDS를 위해 당신의 제한
- 하고 선택() 귀하의 빠른 응답
- 1. localhost에 대한 연결이 거부되는 이유는 무엇입니까?
- 2. jsessionid가없는 리소스에 액세스가 거부되는 이유는 무엇입니까?
- 3. 데이터베이스에 연결이 열려있는 이유는 무엇입니까?
- 4. IIS 5에서 SSL 인증서를 설치할 때 액세스가 거부되는 이유는 무엇입니까?
- 5. 이 HTTP 스트림으로 인해 내 앱이 거부되는 이유는 무엇입니까?
- 6. MySQL 데이터베이스를 만들 때 내 권한이 거부되는 이유는 무엇입니까?
- 7. 자바 메일 오류 : java.net.ConnectException : 연결이 거부되었습니다 : 연결
- 8. AbstractQueue와 AbstractList의 연결이 끊어지는 이유는 무엇입니까?
- 9. Windows에서이 rsync 연결이 갑자기 닫히는 이유는 무엇입니까?
- 10. 클라이언트 GKSession이 denyConnectionFromPeer 이후에 연결되었다고 생각합니다.
- 11. Json 결과 이후에 구문 오류가 발생하는 이유는 무엇입니까?
- 12. .switchClass 이후에 div가 선택 가능하지 않은 이유는 무엇입니까?
- 13. Firefox에서 location.hash 이후에 스타일 효과가 남아있는 이유는 무엇입니까?
- 14. mysqli :: multi_query가 일정량의 행 이후에 정지하는 이유는 무엇입니까?
- 15. 포스트 백 이후에 페이지의 요소 위치가 변경되는 이유는 무엇입니까?
- 16. onDoubleTap 이후에 항상 android onLongPress가 실행되는 이유는 무엇입니까?
- 17. 연결이 닫혀 있는지 확인하십시오!
- 18. 연결이 끊어진 클라이언트 소켓을 다시 연결
- 19. 연결이 끊어진 후 MySql에 자동으로 다시 연결
- 20. 연결이 끊긴 네트워크 드라이브 다시 연결
- 21. SSL을 통한 연결 중에 LDAP 연결이 실패합니다.
- 22. 1024 CPU 용 커널 스케줄링
- 23. 은 1024 비트 rsa 보안
- 24. 화면 해상도의 페이지 너비 1024+
- 25. 연결이 바뀌면 소켓 연결이 끊어지지 않습니다.
- 26. 파일 집합의 연결이 파트의 합보다 큰 이유는 무엇입니까?
- 27. PHP에서 함수 이름 연결이 작동하지 않는 이유는 무엇입니까?
- 28. (Mac OS X) android 에뮬레이터 네트워크의 연결이 끊어지는 이유는 무엇입니까?
- 29. 데이터베이스 연결 풀링을 사용하지 않는 이유는 무엇입니까?
- 30. JPA에 "너무 많은 연결"이있는 이유는 무엇입니까?
아마 정직하게 말하자면. 대기열 깊이는 미해결 (불완전한) 요청의 수를 나타냅니다. 이전 요청이 완료되기 전에 연결 요청으로 서버를 플러딩하는 경우 아마도; 동기식으로 요청을 작성하는 경우에는 그렇지 않습니다. –
이것은 2000 명의 사용자를위한 자동화 된 작업량이며 사용자 연결은 동기화되지 않습니다. 그래서 대기열 깊이가 문제가 될 수 있다고 생각합니다. 내 서버 팀에게 깊이를 교체하고 테스트를 기다리라고 요청했습니다. – Gentoo