Mengapa Anda mengatur MaxKeepAliveRequests ke hal lain selain tidak terbatas?

11

Apache KeepAliveTimeoutada untuk menutup koneksi tetap hidup jika permintaan baru tidak dikeluarkan dalam periode waktu tertentu. Asalkan pengguna tidak menutup browser / tabnya, batas waktu ini (biasanya 5-15 detik) adalah yang akhirnya menutup sebagian besar koneksi yang tetap hidup, dan mencegah sumber daya server terbuang sia-sia dengan menahan koneksi tanpa batas.

Sekarang MaxKeepAliveRequestsarahan memberikan batasan pada jumlah permintaan HTTP yang KeepAliveakan dilayani oleh koneksi TCP tunggal (dibiarkan terbuka karena ). Mengatur ini 0berarti jumlah permintaan yang tidak terbatas diizinkan.

Mengapa Anda mengatur ini selain "tidak terbatas"? Asalkan klien masih secara aktif membuat permintaan, apa salahnya membiarkan mereka terjadi pada koneksi tetap-hidup yang sama? Setelah batas tercapai, permintaan masih masuk, hanya pada koneksi baru.

Cara saya melihatnya, tidak ada gunanya membatasi ini. Apa yang saya lewatkan?

Jonathon Reinhart
sumber

Jawaban:

4

Pada dasarnya, karena Apache tidak dibuat untuk itu. Masalahnya adalah penggunaan memori server. Dalam banyak konfigurasi, pembuatan konten dilakukan dalam proses yang sama dengan pengiriman konten, sehingga setiap proses akan tumbuh dengan ukuran hal terbesar yang ditangani. Bayangkan sebuah proses meluas ke 64mb karena skrip php yang berat, maka proses itu membengkak dan menyajikan file-file statis. Sekarang kalikan dengan 100. Juga, jika ada kebocoran memori di mana saja, proses akan tumbuh tanpa batas.

Pengaturan keepalive harus seimbang berdasarkan pada jenis konten Anda dan lalu lintas Anda. Secara umum, konfigurasi optimal memiliki MaxKeepAliveRequests tinggi (100-500), dan KeepAliveTimeout rendah (2-5) untuk membebaskan mereka dengan cepat.

Dirigible
sumber
2

Saya tahu ini adalah pertanyaan lama, tetapi saya telah melakukan beberapa debugging, dan sepertinya (dan ini tidak hanya berlaku untuk Apache) MaxKeepAliveRequestsberfungsi secara independen KeepAliveTimeout.

Artinya, arahan batas waktu hanya diperhitungkan terhadap koneksi yang terus-menerus tidak aktif (tidak ada yang membaca atau menulis) - jika Anda terus meminta di bawah batas waktu, Anda sebenarnya dapat melakukan jumlah permintaan tanpa batas melalui koneksi yang sama.

Ini mungkin tidak baik untuk beberapa alasan termasuk koneksi tcp yang berjalan lama dibunuh secara acak? Dalam kasus apa pun, klien http tidak sebodoh itu dan dapat menangani pengaturan "rendah" dengan MaxKeepAliveRequestscukup baik, misalnya, relatif mudah dalam bahasa pemrograman untuk mendeteksi jika koneksi tcp telah ditutup oleh server dan dengan demikian menghubungkan kembali ke sana. Selain itu, sebagian besar klien http akan memiliki batasan sendiri (mis. Browser akan menutup koneksi keep-live setelah sekitar 300 detik).

penjaga kehidupan
sumber
1

Salah satu alasannya adalah untuk penyeimbangan beban. Setelah koneksi persisten yang tetap hidup atau http 1.1 dibuat, penyeimbang beban tidak akan memindahkannya ke host baru sampai ditutup. Jika Anda memiliki satu klien yang membuat banyak permintaan melalui satu koneksi mereka, Anda mungkin tidak mendapatkan keseimbangan yang baik antar server.

dtauzell
sumber
Tapi mengapa itu penting? Bagi saya, sepertinya tidak diinginkan untuk menyebarkan koneksi satu pengguna ke beberapa server. Load balancing adalah menangani sejumlah besar pengguna, bukan koneksi dari satu pengguna. Bahkan - jika satu pengguna memalu layanan, Anda lebih suka itu terbatas pada server tunggal (di mana mereka secara efektif akan menilai-membatasi diri mereka sendiri).
Jonathon Reinhart
1
Poin bagus. Beberapa pemikiran: 1. orang lain di server itu akan dipalu juga. 2. Untuk load balancers yang bekerja di bawah level HTTP: ketika Anda mengeluarkan server dari kumpulan load balancer, server itu tidak akan menutup koneksi HTTP yang ada. Itu membuatnya sedikit lebih sulit untuk memindahkan orang ke server yang berbeda hanya dengan load balancer. Alasan 2 adalah bagaimana saya sampai di halaman ini ketika mencari untuk melihat apa yang orang katakan tentang parameter ini.
dtauzell
1
Alasan ketiga: jika server / aplikasi Anda berada dalam kondisi buruk dan menghapus pinning ini dapat membuat semua permintaan error sampai situasinya diperbaiki, sedangkan jika Anda membatasi berapa banyak mereka memiliki peluang untuk mendapatkan keseimbangan ke server baru .
dtauzell
Saya belum menemukan penyeimbang beban yang berfungsi seperti ini. Load balancer biasanya memiliki parameter "stickiness" yang menentukan apakah semua permintaan klien (ditentukan oleh IP misalnya) dalam sesi saat ini harus dialihkan ke hulu yang sama, atau menyebar di antara arus atas. Opsi mana yang berguna tergantung pada aplikasi yang berjalan di arus atas
Manuel
1

Sebagian, untuk menjaga agar satu pengguna tidak memonopoli semua slot koneksi. Tanpa batas, satu klien jahat atau yang ditulis dengan buruk dapat mengambil alih setiap koneksi yang tersedia dan bertahan selamanya. Ini bukan mitigasi yang bagus untuk itu, bagaimanapun, dibandingkan dengan sesuatu seperti batas koneksi per-IP.

Sebagian besar load balancing, tetapi secara khusus berkaitan dengan pemeliharaan. Jika Anda ingin membuat server offline, Anda menjatuhkannya ke 0 koneksi tetapi memungkinkan koneksi yang ada selesai untuk beberapa waktu. Menempatkan batas pada jumlah permintaan keepalive berarti bahwa pada akhirnya pengguna akan dengan anggun membuat koneksi baru dan dipindahkan ke server back-end baru. Mungkin beberapa cara untuk memberi sinyal ke server bahwa ia harus berhenti menerima keepalives sama sekali selama proses pembuangan akan lebih baik, tetapi sejauh yang saya tahu fitur seperti itu tidak ada.

Elliott
sumber