Saya sedang memprogram server dan sepertinya jumlah koneksi saya terbatas karena bandwidth saya tidak sedang jenuh bahkan ketika saya telah mengatur jumlah koneksi ke "tidak terbatas".
Bagaimana saya bisa menambah atau menghilangkan jumlah koneksi maksimum yang bisa dibuka oleh kotak Linux Ubuntu saya sekaligus? Apakah OS membatasi ini, atau itu router atau ISP? Atau itu sesuatu yang lain?
linux
networking
linux-kernel
red0ct
sumber
sumber
Jawaban:
Jumlah koneksi maksimum dipengaruhi oleh batas-batas tertentu di kedua sisi klien & server, meskipun sedikit berbeda.
Di sisi klien: Tingkatkan jangkauan port ephermal, dan kurangi
tcp_fin_timeout
Untuk mengetahui nilai default:
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 dalamTIME_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 meningkatkanport_range
. Mengatur rentang menjadi15000 61000
sangat umum hari ini. Anda selanjutnya dapat meningkatkan ketersediaan dengan mengurangifin_timeout
. Misalkan Anda melakukan keduanya, Anda akan melihat lebih dari 1500 koneksi keluar per detik, lebih mudah.Untuk mengubah nilai :
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
akanIni tidak memungkinkan koneksi dari soket "bekas" (dalam kondisi menunggu) dan memaksa soket untuk bertahan selama
time_wait
siklus penuh. Saya merekomendasikan pengaturan: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. Thenet.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 yangnet.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.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.Demikian pula menaikkan nilai untuk
net.core.netdev_max_backlog
dannet.ipv4.tcp_max_syn_backlog
. Nilai default masing-masing adalah 1000 dan 1024.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.
sumber
(61000 - 32768) / 60 = 470 sockets per second
. Bisakah Anda jelaskan hal ini?Ada beberapa variabel untuk mengatur jumlah koneksi maksimal. Kemungkinan besar, Anda kehabisan nomor file terlebih dahulu. Periksa ulimit -n. Setelah itu, ada pengaturan di / proc, tetapi yang default ke puluhan ribu.
Lebih penting lagi, sepertinya Anda melakukan sesuatu yang salah. Koneksi TCP tunggal harus dapat menggunakan semua bandwidth antara dua pihak; jika tidak:
ping -s 1472
...)tc
iperf
Mungkin saya salah paham. Mungkin Anda melakukan sesuatu seperti Bittorrent, di mana Anda membutuhkan banyak koneksi. Jika demikian, Anda perlu mencari tahu berapa banyak koneksi yang sebenarnya Anda gunakan (coba
netstat
ataulsof
). Jika angka itu substansial, Anda mungkin:ulimit -n
. Namun, ~ 1000 koneksi (standar pada sistem saya) cukup sedikit.iostat -x
?Juga, jika Anda menggunakan router NAT tingkat konsumen (Linksys, Netgear, DLink, dll.), Berhati-hatilah bahwa Anda dapat melebihi kemampuannya dengan ribuan koneksi.
Saya harap ini memberikan bantuan. Anda benar-benar mengajukan pertanyaan jaringan.
sumber
Untuk memperbaiki jawaban yang diberikan oleh derobert,
Anda dapat menentukan berapa batas koneksi OS Anda dengan mengetikkan nf_conntrack_max.
Sebagai contoh: cat / proc / sys / net / netfilter / nf_conntrack_max
Anda dapat menggunakan skrip berikut untuk menghitung jumlah koneksi tcp ke kisaran port tcp yang diberikan. Secara default 1-65535.
Ini akan mengkonfirmasi apakah Anda memaksimalkan batas koneksi OS atau tidak.
Ini skripnya.
sumber
which awk
adalah teman Anda untuk menentukan jalur menuju awk, SunOS juga memiliki tautan ke sana :)which
bergantung pada program untuk berada dalamPATH
hal ini Anda hanya dapat menggunakanawk
alih-alih memberikan path lengkap. (yang mengatakan, saya tidak yakin apakah solusi dalam naskah mendekati kesempurnaan, tetapi ini bukan tentang naskah itu).awk
lokasi, tetapi mengasumsikan bahwa shell selalu/bin/bash
(tip pro: AIX5 / 6 bahkan tidak memiliki bash secara default).awk
deteksi bermanfaat? Secara pribadi saya hanya akan menganggap memiliki yang benarPATH
tetapi alternatif yang masuk akal bisa/usr/bin/env awk
dan/usr/bin/env bash
masing - masing. Untuk apa nilainya, itu salah lokasi pada sistem Linux saya. Ini/usr/bin/awk
bukan/bin/awk
Di level aplikasi, berikut adalah hal yang bisa dilakukan pengembang:
Dari sisi server:
Periksa apakah load balancer (jika ada), berfungsi dengan benar.
Ubah waktu tunggu TCP yang lambat menjadi 503 Respons Cepat Segera, jika Anda memuat penyeimbang berfungsi dengan benar, ia harus memilih sumber daya kerja untuk dilayani, dan lebih baik daripada menggantung di sana dengan pijatan kesalahan yang tidak terduga.
Misalnya: Jika Anda menggunakan server simpul, Anda dapat menggunakan toobusy dari npm. Implementasi sesuatu seperti:
Kenapa 503? Berikut adalah beberapa wawasan yang bagus untuk kelebihan: http://ferd.ca/queues-don-t-fix-overload.html
Kami juga dapat melakukan beberapa pekerjaan di sisi klien:
Cobalah untuk mengelompokkan panggilan dalam batch, mengurangi lalu lintas dan jumlah permintaan total klien dan server.
Cobalah untuk membangun lapisan tengah cache untuk menangani permintaan duplikat yang tidak perlu.
sumber