왜 FreeBSD에서 net.inet.tcp.tcbhashsize를 변경해야합니까?


8

사실상 모든 FreeBSD 네트워크 튜닝 문서에서 다음을 찾을 수 있습니다.

# /boot/loader.conf
net.inet.tcp.tcbhashsize=4096

이것은 일반적으로 "TCP 제어 블록 해시 테이블 튜닝"또는 "이 값을 합리적인 값으로 설정"과 같은 도움이되지 않는 문장과 쌍을 이룹니다. man 4 tcp별로 도움이되지 않습니다.

tcbhashsize         Size of the TCP control-block hash table (read-only).
                    This may be tuned using the kernel option TCBHASHSIZE
                    or by setting net.inet.tcp.tcbhashsize in the
                    loader(8).

FreeBSD IP 및 TCP 스택 최적화의 전송 계층 아래에있는 프로토콜 제어 블록 조회 서브 섹션만으로도이 신비한 점을 발견 할 수 있습니다. 새로운 TCP 세그먼트를 청취 소켓에 연결하는 것과 관련이있는 것처럼 보이지만 어떻게 해야할지 모르겠습니다.

TCP 제어 블록은 정확히 무엇에 사용됩니까? 해시 크기를 4096 또는 다른 특정 숫자로 설정하려는 이유는 무엇입니까?


+1, 매우 흥미로운 질문입니다!
Janne Pikkarainen

AFAIK, 적절한 소켓으로 패킷을 전달하기위한 모든 정보는 inpcb오직 통해 만 가능 합니다.
SaveTheRbtz

답변:


3

컴퓨터 과학 문제와 비슷합니다. 특히 해시 테이블큰 O 표기법 을 파고 싶다면 .

대답은 다음과 같습니다.
서버에서 많은 TCP 세션을 처리하는 경우 실제로 O (n) 대신 O (1) 시간에 연결의 tcp 매개 변수를 조회하려고합니다. FreeBSD는 체인 을 사용 하여 해시 테이블 충돌을 해결합니다. 따라서 연결이 많으면 충돌이 많으므로 O (1) 해시 테이블 조회 대신 O (n) 복잡도를 가진 선형 체인 조회를 수행해야합니다.

언급 한 매개 변수- tcbhashsize기본적으로 해시 테이블의 버킷 수입니다.
우리 서버에서는 아주 높은 값으로 설정되어 16384있습니다. 이 설정으로 서버 당 약 60,000 개의 연결을 처리합니다.

현재 x86_64에있는 해시 테이블의 각 항목은 각 항목에 대해 252 바이트 ( tcp_inpcb) + 688 바이트 ( tcpcb)의 커널 메모리를 사용합니다 (kmem 크기는 7.2+ IIRC 이후 amd64에서 512G입니다). 를 통해 볼 수 있습니다 vmstat -z.

TCP 제어 블록의 구조에 대해서는 FreeBSD 소스를 읽을 수 있습니다 : tcp_var.h 또는 TCP / IP Illustrated, Volume 2 : The Gary R. Wright, W. Richard Stevens


그것은 모두 모호했지만 이제이 모호한 C 헤더로 모든 것이 명확합니다.)
gparent

해시 테이블에서 버킷 수를 늘리면 해당 버킷의 조회 성능에 도움이되는 이유를 이해하지만 실제로 이것이이 값이 무엇인지 알지 못했습니다. 이것이 버킷 테이블 인 경우 TCPCB가 실제로 소켓 정보가 저장되어 TCP 세그먼트를 적절한 수신자와 일치시킬 수 있다고 생각합니다. 이것을 확인할 수 있습니까? 또한 이러한 사이트의 목적 중 일부는 정보를 수집하는 것이므로 "소스 읽기"또는 "책 읽기"대답은 그다지 유용하지 않습니다.
sh-beta

16384의 튜닝에 어떻게 왔습니까? 왜 그런가요? 그리고 그 가치를 위해 무엇을 희생하고 있습니까 (커널 메모리를 가정하지만 얼마입니까?)? 그것이 무료 성능 승리라면, 그것이 기본값이라고 생각합니다. 확실히 비용이 든다.
sh-beta

제 생각에이 값은이 서버가 처리하고자하는 동시 연결 수에 다소 가깝게 설정되어야합니다. 추신. 소스 / 책을 읽지 않고 특정 분야의 전문가가되고 싶습니까? =)
SaveTheRbtz

1
@SaveTheRbtz 기술을 사용하는 경우 질문을 중단하거나 코드에 대해 전문가가되어 네트워크 스택에서 각 개별 구조체와 기능의 정확한 목적을 암송 할 수 있어야합니다. StackExchange의 목적은 지식을 교환하는 것입니다. 나는 다른 것들이 아니라 어떤 것의 전문가입니다. 그 라인은 내가 시간을 보내는 곳을 신중하게 선택해야하는 작업에 의해 결정됩니다. 그러나 이것이 단순히 블로그에서 블로그로 복사 및 붙여 넣기 된 것으로 보이는 "조언"튜닝을 받아들이는 것에 만족하는 것은 아닙니다.
sh-beta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.