Apa parameter kernel atau pengaturan lain yang mengontrol jumlah maksimum soket TCP yang dapat dibuka di server Linux? Apa pengorbanan dari memungkinkan lebih banyak koneksi?
Saya perhatikan saat memuat pengujian server Apache dengan ab bahwa itu cukup mudah untuk memaksimalkan koneksi terbuka di server. Jika Anda mematikan opsi ab's -k, yang memungkinkan koneksi digunakan kembali, dan meminta 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
sumber
Anda benar-benar ingin melihat apa yang ditawarkan sistem file / proc dalam hal ini.
Pada halaman terakhir itu, Anda mungkin menemukan yang berikut ini menarik bagi Anda:
sumber
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 telah berubah, soket TCP / IP akan terbuka seperti deskriptor file. Jadi ini dan bagian selanjutnya di tautan itu mungkin yang Anda cari.
sumber
Coba atur yang berikut ini juga dengan mengatur tcp_fin_timeout. Ini harus menutup TIME_WAIT lebih cepat.
sumber
tcp_tw_recycle
berpotensi berbahaya.tcp_tw_reuse
lebih aman dan saya tidak melihat alasan untuk menggunakannya secara bersamaan.Stok apache (1) dulu ditentukan sebelumnya 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.
sumber
Anda dapat mengurangi waktu yang dihabiskan dalam status TIME_WAIT (Tetapkan net.ipv4.tcp_fin_timeout). Anda bisa 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.
sumber
Jumlah absolut soket yang dapat dibuka pada satu alamat IP adalah 2 ^ 16 dan didefinisikan oleh TCP / UDP, bukan kernel.
sumber
Alat pembandingan server HTTP HTTP, ab , dalam versi 2.4 memiliki opsi -s timeout . Lihat juga kesalahan ab (Apache Bench): apr_poll: Batas waktu yang ditentukan telah kedaluwarsa (70007) pada Windows .
Opsi ini memecahkan masalah Anda.
sumber