Mengapa mengubah net.inet.tcp.tcbhashsize di FreeBSD?

8

Di hampir setiap dokumen penyetelan jaringan FreeBSD saya dapat menemukan:

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

Ini biasanya dipasangkan dengan beberapa pernyataan tidak membantu seperti "penyetelan tabel hash blok kontrol-TCP" atau "Setel ini ke nilai yang masuk akal." man 4 tcpjuga tidak banyak membantu:

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

Satu-satunya dokumen yang dapat saya temukan yang menyentuh pada hal yang misterius ini adalah sub-bagian Pencarian Blok Kontrol Protokol di bawah Transport Layer dalam Mengoptimalkan IP FreeBSD dan TCP Stack , tetapi uraiannya lebih tentang potensi kemacetan dalam menggunakannya. Tampaknya terkait dengan mencocokkan segmen TCP baru dengan soket pendengaran mereka, tapi saya tidak yakin bagaimana caranya.

Untuk apa sebenarnya Blok Kontrol TCP digunakan? Mengapa Anda ingin mengatur ukuran hash ke 4096 atau nomor tertentu lainnya?

sh-beta
sumber
+1, pertanyaan yang sangat menarik!
Janne Pikkarainen
AFAIK, semua informasi untuk mengirimkan paket ke soket yang sesuai hanya tersedia melalui inpcb.
SaveTheRbtz

Jawaban:

3

Ini lebih seperti pertanyaan ilmu komputer. Terutama jika Anda ingin menggali tabel hash dan notasi O besar .

Jawabannya adalah:
Jika Anda menangani banyak sesi TCP pada sever Anda benar-benar ingin mencari parameter tcp koneksi dalam waktu O (1) alih-alih O (n). FreeBSD menggunakan rantai untuk menyelesaikan tabrakan tabel hash. Jadi jika ada banyak koneksi akan ada banyak tabrakan dan jadi alih-alih O (1) pencarian tabel hash Anda harus melakukan pencarian rantai linier dengan O (n) kompleksitas.

Parameter yang Anda sebutkan - tcbhashsizepada dasarnya adalah jumlah ember di tabel hash.
Di server kami diatur ke nilai yang cukup tinggi seperti 16384dan bahkan lebih tinggi. Dengan pengaturan itu kami menangani sekitar 60.000 koneksi per server.

Setiap entri dalam tabel hash dengan sendirinya saat ini di x86_64 menggunakan 252 byte ( tcp_inpcb) + 688 byte ( tcpcb) memori kernel untuk setiap entri (ukuran kmem adalah 512G di amd64 sejak 7.2+ IIRC). Itu dapat dilihat melalui vmstat -z.

Tentang struktur blok Kontrol TCP Anda dapat membaca sumber FreeBSD: tcp_var.h atau membaca TCP / IP Illustrated, Volume 2: Implementasi Oleh Gary R. Wright, W. Richard Stevens

SaveTheRbtz
sumber
Semuanya buram tapi sekarang dengan header C yang tidak jelas ini semuanya jelas;)
gparent
Saya mengerti mengapa menambah jumlah bucket dalam hashtable akan membantu kinerja pencarian dalam bucket tersebut, saya tidak menyadari bahwa inilah sebenarnya yang dilakukan nilai ini. Jika ini adalah daftar ember, maka saya kira TCPCB benar-benar adalah tempat informasi soket disimpan sehingga segmen TCP dapat disesuaikan dengan penerima yang tepat. Bisakah Anda mengkonfirmasi ini? Juga, bagian dari tujuan situs-situs ini adalah untuk mengumpulkan informasi, jadi jawaban "Baca sumber" atau "Baca buku" tidak terlalu berguna.
sh-beta
Bagaimana Anda sampai pada penyetelan 16384 Anda? Kenapa begitu? Dan apa yang Anda korbankan untuk nilai itu (saya anggap memori kernel, tapi berapa banyak?)? Jika itu adalah kemenangan kinerja gratis, saya suka berpikir itu akan menjadi default. Tentunya itu membutuhkan biaya.
sh-beta
Menurut pendapat saya nilai ini harus ditetapkan agak dekat dengan jumlah koneksi bersamaan server ini bersedia untuk menangani. PS. Apakah Anda benar-benar ingin menjadi ahli di beberapa bidang tanpa membaca sumber / buku? =)
SaveTheRbtz
1
@SaveTheRbtz Saya membenci gagasan ini bahwa, jika Anda menggunakan teknologi, Anda harus berhenti bertanya atau menjadi begitu ahli dalam kode sehingga Anda dapat melafalkan tujuan yang tepat dari masing-masing individu struct dan fungsi dalam tumpukan jaringan. Tujuan dari StackExchange adalah bertukar pengetahuan. Saya ahli dalam beberapa hal dan bukan yang lain. Garis itu ditentukan oleh pekerjaan saya di mana saya harus hati-hati memilih di mana saya menghabiskan waktu saya. Tapi itu tidak berarti saya puas dengan hanya menerima "saran" tuning yang tampaknya telah disalin dan ditempelkan dari blog ke blog.
sh-beta