Jumlah koneksi maksimum dipengaruhi oleh batas-batas tertentu di kedua sisi klien & server, meskipun sedikit berbeda.
Di sisi klien:
Tingkatkan jangkauan port ephermal, dan kurangitcp_fin_timeout
Untuk mengetahui nilai default:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
Rentang port ephermal menentukan jumlah maksimum soket keluar yang dapat dibuat oleh suatu host dari alamat IP tertentu. Yang fin_timeout
menentukan waktu minimum soket ini akan tetap dalam TIME_WAIT
keadaan (tidak dapat digunakan setelah digunakan sekali). Default sistem yang biasa adalah:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Ini pada dasarnya berarti sistem Anda tidak dapat secara konsisten menjamin lebih dari (61000 - 32768) / 60 = 470
soket per detik. Jika Anda tidak senang dengan itu, Anda bisa mulai dengan meningkatkan port_range
. Mengatur rentang menjadi 15000 61000
sangat umum hari ini. Anda selanjutnya dapat meningkatkan ketersediaan dengan mengurangi fin_timeout
. Misalkan Anda melakukan keduanya, Anda akan melihat lebih dari 1500 koneksi keluar per detik, lebih mudah.
Untuk mengubah nilai :
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
Hal di atas tidak boleh diartikan sebagai faktor yang memengaruhi kemampuan sistem untuk membuat koneksi keluar per detik. Melainkan faktor-faktor ini memengaruhi kemampuan sistem untuk menangani koneksi bersamaan secara berkelanjutan untuk "aktivitas" yang besar.
Nilai Sysctl default pada kotak Linux khas untuk tcp_tw_recycle
& tcp_tw_reuse
akan
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
Ini tidak memungkinkan koneksi dari soket "bekas" (dalam kondisi menunggu) dan memaksa soket untuk bertahan selama time_wait
siklus penuh. Saya merekomendasikan pengaturan:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
Ini memungkinkan perputaran soket yang cepat di time_wait
negara bagian dan menggunakannya kembali. Tetapi sebelum Anda melakukan perubahan ini pastikan bahwa ini tidak bertentangan dengan protokol yang akan Anda gunakan untuk aplikasi yang membutuhkan soket ini. Pastikan Anda membaca pos "Mengatasi TCP TIME-WAIT" dari Vincent Bernat untuk memahami implikasinya. The net.ipv4.tcp_tw_recycle
pilihan adalah cukup bermasalah untuk server publik menghadap karena tidak akan menangani koneksi dari dua komputer yang berbeda di belakang perangkat NAT yang sama , yang merupakan masalah sulit untuk mendeteksi dan menunggu untuk menggigit Anda. Catatan yang net.ipv4.tcp_tw_recycle
telah dihapus dari Linux 4.12.
Pada Server Side:
The net.core.somaxconn
value memiliki peran penting. Ini membatasi jumlah permintaan maksimum yang di-antri ke soket pendengaran. Jika Anda yakin dengan kemampuan aplikasi server Anda, ubahlah dari default 128 menjadi sesuatu seperti 128 hingga 1024. Sekarang Anda dapat memanfaatkan peningkatan ini dengan memodifikasi variabel backlog mendengarkan dalam panggilan mendengarkan aplikasi Anda, ke integer yang sama atau lebih tinggi.
sysctl net.core.somaxconn=1024
txqueuelen
parameter kartu ethernet Anda juga memiliki peran untuk dimainkan. Nilai defaultnya adalah 1000, jadi tambah 5000 atau bahkan lebih jika sistem Anda dapat mengatasinya.
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
Demikian pula menaikkan nilai untuk net.core.netdev_max_backlog
dan net.ipv4.tcp_max_syn_backlog
. Nilai default masing-masing adalah 1000 dan 1024.
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
Sekarang ingat untuk memulai aplikasi sisi klien dan server Anda dengan meningkatkan FD FDIM, di shell.
Selain itu satu lagi teknik populer yang digunakan oleh programmer adalah mengurangi jumlah panggilan tulis tcp . Preferensi saya sendiri adalah menggunakan buffer di mana saya mendorong data yang ingin saya kirim ke klien, dan kemudian pada titik yang tepat saya menuliskan data buffered ke dalam soket yang sebenarnya. Teknik ini memungkinkan saya untuk menggunakan paket data besar, mengurangi fragmentasi, mengurangi pemanfaatan CPU saya baik di tanah pengguna dan di tingkat kernel.