왜 FreeBSD에서 net.inet.tcp.tcbhashsize를 변경해야합니까? TCP control-block hash table (read-only).

사실상 모든 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 또는 다른 특정 숫자로 설정하려는 이유는 무엇입니까?



답변

컴퓨터 과학 문제와 비슷합니다. 특히 해시 테이블큰 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


답변