pengembangan-web-mp-pd.com

Apa yang membatasi jumlah maksimum koneksi pada server Linux?

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

Saya perhatikan saat memuat pengujian server Apache dengan ab cukup mudah untuk memaksimalkan koneksi terbuka di server. Jika Anda mematikan opsi ab's -k, yang memungkinkan koneksi digunakan kembali, dan minta dia mengirim lebih dari 10.000 permintaan, maka Apache melayani 11.000 permintaan pertama dan kemudian berhenti selama 60 detik. Pandangan terhadap output netstat menunjukkan 11.000 koneksi dalam status TIME_WAIT. Ternyata, ini normal. Koneksi tetap terbuka default 60 detik bahkan setelah klien selesai dengan mereka untuk alasan keandalan TCP .

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

Inilah hasil pengujian 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
91
Ben Williams

Saya akhirnya menemukan pengaturan yang benar-benar membatasi jumlah koneksi: net.ipv4.netfilter.ip_conntrack_max. Ini ditetapkan ke 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 agar lebih banyak koneksi tersedia. Tabel conntrack adalah apa yang digunakan kernel untuk melacak status koneksi sehingga setelah penuh, kernel mulai menjatuhkan paket dan mencetaknya di log:

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

Langkah selanjutnya adalah membuat kernel untuk mendaur ulang semua koneksi di TIME_WAIT nyatakan daripada menjatuhkan paket. Saya bisa mewujudkannya dengan menyalakan tcp_tw_recycle atau bertambah ip_conntrack_max menjadi lebih besar dari jumlah port lokal yang tersedia untuk koneksi oleh ip_local_port_range. Saya kira begitu kernel keluar dari port lokal itu mulai mendaur ulang koneksi. 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

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

66
Ben Williams

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

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

  • / proc/sys/net/ipv4/tcp_max_orphans , yang mengontrol jumlah soket maksimum yang dipegang oleh sistem bukan yang melekat pada sesuatu. Meningkatkan ini dapat mengkonsumsi memori non-swappable sebanyak 64 kbyte per soket Orphan .
  • / proc/sys/net/ipv4/tcp_Orphan_retries , yang mengontrol jumlah coba ulang sebelum soket menjadi yatim dan ditutup. Ada catatan khusus pada halaman itu tentang server web yang menarik bagi Anda ...
24
Avery Payne

Saya tidak berpikir ada yang bisa diatur untuk mengaturnya secara langsung. Ini termasuk dalam kategori penyetelan TCP/IP. Untuk mengetahui apa yang dapat Anda sesuaikan, cobalah 'man 7 tcp'. Sysctl ('man 8 sysctl') digunakan untuk mengatur ini. 'sysctl -a | grep tcp 'akan menunjukkan kepada Anda sebagian besar dari apa yang dapat Anda sesuaikan, tetapi saya tidak yakin apakah itu akan menampilkan semuanya. Selain itu, kecuali jika ini berubah, soket TCP/IP akan terbuka seperti deskriptor file. Jadi ini dan bagian selanjutnya di tautan itu mungkin yang Anda cari.

3
Kyle Brandt

Coba atur yang berikut ini juga dengan mengatur tcp_fin_timeout. Ini seharusnya menutup TIME_WAIT lebih cepat.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
2
Jauder Ho

Stok Apache (1) dulunya ditentukan untuk hanya mendukung 250 koneksi bersamaan - jika Anda menginginkan lebih, ada satu file header untuk dimodifikasi untuk memungkinkan sesi yang lebih bersamaan. Saya tidak tahu apakah ini masih berlaku dengan Apache 2.

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

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

2
rasjani

Anda dapat mengurangi waktu yang dihabiskan dalam status TIME_WAIT (Tetapkan net.ipv4.tcp_fin_timeout). Anda dapat mengganti Apache dengan YAWS atau nginx atau yang serupa.

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

1
Devdas

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

Opsi ini memecahkan masalah Anda.

0
Dzwiedziu-nkg

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

0
Jason Tan