Tại sao thay đổi net.inet.tcp.tcbhashsize trong FreeBSD?


8

Trong hầu hết mọi tài liệu điều chỉnh mạng FreeBSD tôi có thể tìm thấy:

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

Điều này thường được kết hợp với một số tuyên bố không hữu ích như "Điều chỉnh bảng băm khối điều khiển TCP" hoặc "Đặt giá trị này thành giá trị hợp lý." man 4 tcpcũng không giúp được gì nhiều:

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).

Tài liệu duy nhất tôi có thể tìm thấy chạm vào thứ bí ẩn này là phần phụ Tra cứu khối điều khiển giao thức bên dưới Lớp vận chuyển trong việc tối ưu hóa FreeBSD IP và TCP Stack , nhưng mô tả của nó nói nhiều hơn về các tắc nghẽn tiềm năng khi sử dụng nó. Có vẻ như được liên kết để khớp các phân đoạn TCP mới với ổ cắm nghe của họ, nhưng tôi không biết làm thế nào.

Chính xác thì Khối điều khiển TCP được sử dụng để làm gì? Tại sao bạn muốn đặt kích thước băm của nó thành 4096 hoặc bất kỳ số cụ thể nào khác?


+1, câu hỏi rất thú vị!
Janne Pikkarainen

AFAIK, tất cả thông tin để phân phối gói đến ổ cắm thích hợp chỉ có sẵn thông qua inpcb.
LưuTheRbtz

Câu trả lời:


3

Nó giống câu hỏi khoa học máy tính hơn. Đặc biệt nếu bạn muốn đào sâu vào các bảng bămcác ký hiệu big-O .

Câu trả lời là:
Nếu bạn đang xử lý nhiều phiên TCP trên sever, bạn thực sự muốn tìm kiếm các tham số tcp của kết nối trong thời gian O (1) thay vì O (n). FreeBSD sử dụng chuỗi để giải quyết các va chạm bảng băm. Vì vậy, nếu có nhiều kết nối, sẽ có rất nhiều va chạm và vì vậy thay vì tra cứu bảng băm O (1), bạn sẽ cần thực hiện tra cứu chuỗi tuyến tính với độ phức tạp O (n).

Tham số bạn đã đề cập - tcbhashsizevề cơ bản là số lượng thùng trong bảng băm.
Trên máy chủ của chúng tôi, nó được đặt thành các giá trị khá cao như 16384và thậm chí cao hơn. Với cài đặt đó, chúng tôi đang xử lý khoảng 60.000 kết nối trên mỗi máy chủ.

Bản thân mỗi mục trong bảng băm hiện tại trên x86_64 sử dụng 252 byte ( tcp_inpcb) + 688 byte ( tcpcb) bộ nhớ kernel cho mỗi mục (kích thước kmem là 512G trong amd64 kể từ 7.2+ IIRC). Nó có thể được xem qua vmstat -z.

Về cấu trúc của khối Điều khiển TCP, bạn có thể đọc các nguồn FreeBSD: tcp_var.h hoặc đọc TCP / IP Illustrated, Tập 2: Việc thực hiện của Gary R. Wright, W. Richard Stevens


Tất cả đều mờ nhưng bây giờ với tiêu đề C tối nghĩa này, mọi thứ đều rõ ràng;)
gparent 23/03 '

Tôi hiểu tại sao việc tăng số lượng thùng trong một hashtable sẽ giúp hiệu suất tra cứu trong các thùng đó, tôi không nhận ra đây thực sự là giá trị này đang làm. Nếu đây là một bảng các nhóm, thì tôi cho rằng TCPCB thực sự là nơi lưu trữ thông tin ổ cắm để các phân đoạn TCP có thể được khớp với máy thu thích hợp. Bạn có thể xác nhận điều này? Ngoài ra, một phần mục đích của các trang web này là để tổng hợp thông tin, vì vậy câu trả lời "Đọc nguồn" hoặc "Đọc sách" không hữu ích lắm.
sh-beta

Làm thế nào bạn đến với điều chỉnh 16384 của bạn? Lý do tại sao mà? Và bạn đang hy sinh cái gì cho giá trị đó (tôi giả sử bộ nhớ kernel, nhưng giá bao nhiêu?)? Nếu đó là một chiến thắng hiệu suất miễn phí, tôi muốn nghĩ rằng đó là mặc định. Chắc chắn nó có giá.
sh-beta

Theo tôi, giá trị này nên được đặt gần với số lượng kết nối đồng thời mà máy chủ này sẵn sàng xử lý. Tái bút Bạn có thực sự muốn trở thành một chuyên gia trong một số lĩnh vực mà không cần đọc nguồn / sách? =)
LưuTheRbtz

1
@SaveTheRbtz Tôi ghê tởm khái niệm này rằng, nếu bạn sử dụng công nghệ, bạn cần ngừng đặt câu hỏi hoặc trở thành chuyên gia về mã để bạn có thể đọc thuộc mục đích chính xác của từng cấu trúc và chức năng riêng lẻ trong ngăn xếp mạng. Mục đích của StackExchange là trao đổi kiến ​​thức. Tôi là một chuyên gia trong một số thứ chứ không phải những người khác. Dòng đó được xác định bởi công việc của tôi, nơi tôi phải lựa chọn cẩn thận nơi tôi dành thời gian. Nhưng điều đó không có nghĩa là tôi đơn giản chấp nhận điều chỉnh "lời khuyên" dường như đã được sao chép và dán một cách không suy nghĩ từ blog này sang blog khác.
sh-beta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.