Pertanyaan Apa yang membatasi jumlah koneksi maksimum pada server Linux?


Apa parameter kernel atau pengaturan lain mengontrol jumlah maksimum soket TCP yang dapat dibuka di server Linux? Apa pengorbanan yang memungkinkan lebih banyak koneksi?

Saya perhatikan saat memuat pengujian server Apache dengan ab bahwa cukup mudah untuk memaksimalkan koneksi terbuka di server. Jika Anda meninggalkan opsi ab -k, yang memungkinkan penggunaan kembali koneksi, dan mengirimnya lebih dari sekitar 10.000 permintaan maka Apache melayani 11.000 permintaan atau lebih dan kemudian berhenti selama 60 detik. Tampak pada output netstat menunjukkan 11.000 koneksi dalam negara TIME_WAIT. Rupanya, ini normal. Koneksi tetap terbuka secara default 60 detik bahkan setelah klien selesai menggunakannya Alasan reliabilitas TCP.

Sepertinya ini akan menjadi cara mudah untuk DoS server dan saya bertanya-tanya apa tuning dan tindakan pencegahan yang biasa untuk itu.

Inilah hasil tes saya:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

Inilah perintah netstat yang saya jalankan selama pengujian:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

85
2018-05-21 16:18






Jawaban:


Saya akhirnya menemukan pengaturan yang benar-benar membatasi jumlah koneksi: net.ipv4.netfilter.ip_conntrack_max. Ini ditetapkan menjadi 11.776 dan apa pun yang saya atur adalah jumlah permintaan yang dapat saya layani dalam pengujian saya sebelum harus menunggu tcp_fin_timeout detik untuk lebih banyak koneksi tersedia. Itu conntrack tabel adalah apa yang digunakan kernel untuk melacak status koneksi sehingga setelah penuh, kernel mulai menjatuhkan paket dan mencetak ini di log:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

Langkah selanjutnya adalah mendapatkan kernel untuk mendaur ulang semua koneksi tersebut di TIME_WAIT menyatakan daripada menjatuhkan paket. Saya bisa mendapatkan itu terjadi baik dengan menyalakan tcp_tw_recycle atau meningkat ip_conntrack_max menjadi lebih besar dari jumlah port lokal yang tersedia untuk koneksi oleh ip_local_port_range. Saya kira setelah kernel keluar dari port lokal, ini memulai koneksi daur ulang. Ini menggunakan lebih banyak koneksi pelacakan memori tetapi sepertinya solusi yang lebih baik daripada menyalakan tcp_tw_recycle karena dokumen menyiratkan bahwa itu berbahaya.

Dengan konfigurasi ini saya dapat menjalankan ab sepanjang hari dan tidak pernah kehabisan koneksi:

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

Itu tcp_max_orphans pengaturan tidak berpengaruh pada tes saya dan saya tidak tahu mengapa. Saya akan berpikir itu akan menutup koneksi TIME_WAIT menyatakan pernah ada 8192 dari mereka tetapi itu tidak melakukannya untuk saya.


62
2018-06-03 16:02



Di mana kita mengkonfigurasi params ini? - Codevalley
@Codevalley Itu mungkin tergantung pada sistem tetapi pada Ubuntu Server mereka masuk di /etc/sysctl.conf - Ben Williams


Anda benar-benar ingin melihat apa yang harus ditawarkan oleh sistem file / proc dalam hal ini.

Pada halaman terakhir itu, Anda mungkin menemukan hal-hal berikut yang menarik bagi Anda:

  • / proc / sys / net / ipv4 / tcp_max_orphans, yang mengontrol jumlah maksimum soket yang dipegang oleh sistem tidak melekat pada sesuatu. Budidaya ini dapat mengkonsumsi sebanyak 64kbyte memori non-swappable per orphan socket.
  • / proc / sys / net / ipv4 / tcp_orphan_retries, yang mengontrol jumlah percobaan ulang sebelum soket menjadi yatim piatu dan tertutup. Ada catatan khusus pada halaman itu tentang server web yang menarik bagi Anda ...

23
2018-05-21 18:15



tcp_max_orphans menarik tetapi sepertinya tidak berfungsi. Ketika saya mencoba untuk mengukur stopkontak yatim selama tes saya, saya melihat 11.651 dari mereka sementara tcp_max_orphans adalah 8.092. # netstat --inet -p | grep "localhost: www" | sede 's / \ + / / g' | potong -d '' -f 1-4,6-7 | sortir | uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
Lihatlah pengaturan tcp_orphan_retries - gagasannya, soketnya "dimusnahkan" lebih cepat ... - Avery Payne
Saran @Jauder Ho + tcp_orphan_retries terdengar seperti kemungkinan menang untuk situasi Anda. - Avery Payne


Saya tidak berpikir ada yang bisa diatur secara langsung. Ini termasuk dalam kategori penyetelan TCP / IP. Untuk mencari tahu apa yang dapat Anda atur, coba 'man 7 tcp'. Sysctl ('man 8 sysctl') digunakan untuk mengatur ini. 'sysctl -a | grep tcp 'akan menunjukkan sebagian besar dari apa yang dapat Anda atur, tetapi saya tidak yakin apakah itu akan menunjukkan semuanya. Juga, kecuali ini telah berubah, TCP / IP soket terbuka terlihat seperti deskriptor file. Begitu ini dan bagian selanjutnya di tautan itu mungkin yang Anda cari.


3
2018-05-21 17:31





Coba atur yang berikut ini juga pengaturan tcp_fin_timeout. Ini harus menutup TIME_WAIT lebih cepat.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2
2018-05-21 19:38



Hati-hati di sini! Berpengalaman dengan cara yang sulit. "Ini dapat menyebabkan frame yang menurun dengan load-balancing dan NAT, hanya gunakan ini untuk server yang hanya berkomunikasi melalui jaringan lokal Anda." - wiki.archlinux.org/index.php/Sysctl - Henk
@Henk Saya rasa begitu tcp_tw_recycle yang berpotensi berbahaya. tcp_tw_reuse lebih aman dan saya tidak melihat alasan untuk menggunakannya secara bersamaan. - Vladislav Rastrusny


Apache stok (1) digunakan untuk datang yang telah ditetapkan untuk hanya mendukung 250 koneksi konkuren - jika Anda ingin lebih, ada satu file header untuk memodifikasi untuk memungkinkan sesi yang lebih bersamaan. Saya tidak tahu apakah ini masih berlaku dengan Apache 2.

Selain itu, Anda perlu menambahkan opsi untuk mengizinkan banyak deskriptor file yang terbuka untuk akun yang menjalankan Apache - sesuatu yang sebelumnya gagal ditunjukkan oleh komentar sebelumnya.

Perhatikan pengaturan pekerja Anda dan seperti apa keepalive timeout yang Anda miliki di dalam Apache itu sendiri, berapa banyak server cadangan yang Anda jalankan sekaligus, dan seberapa cepat proses ekstra ini terbunuh.


2
2018-05-21 21:21





Anda dapat mengurangi waktu yang dihabiskan di negara TIME_WAIT (Set net.ipv4.tcp_fin_timeout). Anda bisa mengganti Apache dengan YAWS atau nginx atau yang serupa.

Pengorbanan koneksi lebih umumnya melibatkan penggunaan memori, dan jika Anda memiliki proses forking, banyak proses anak yang membasahi CPU Anda.


1
2018-05-21 16:26



tcp_fin_timeout bukan untuk pengaturan waktu TIME-WAIT, yang tidak dapat diubah di luar membangun kembali kernel, tetapi untuk FIN, seperti namanya. - Alexandr Kurilin


Jumlah absolut soket yang dapat dibuka pada satu alamat IP adalah 2 ^ 16 dan ditentukan oleh TCP / UDP, bukan kernel.


0
2018-05-30 16:42



Tidak, bukan itu. Anda dapat membuka lebih banyak, karena port lokal tidak harus unik selama alamat jauh berbeda. Selain itu, OP mengatakan per server, dan Anda dapat memiliki> 1 alamat per server. - MarkR


Alat pembandingan server HTTP Apache, ab, dalam versi 2.4 memiliki file -s timeout pilihan. Lihat juga ab (Apache Bench) error: apr_poll: Batas waktu yang ditentukan telah kedaluwarsa (70007) pada Windows.

Pilihan ini memecahkan masalah Anda.


0
2018-02-08 17:56