Solusi 1:
Saya akhirnya menemukan pengaturan yang benar-benar membatasi jumlah koneksi:net.ipv4.netfilter.ip_conntrack_max
. Ini disetel ke 11.776 dan apa pun yang saya setel adalah jumlah permintaan yang dapat saya layani dalam pengujian saya sebelum harus menunggu tcp_fin_timeout
detik agar lebih banyak sambungan tersedia. conntrack
table adalah 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 mendaur ulang semua koneksi tersebut di TIME_WAIT
negara daripada menjatuhkan paket. Saya bisa mewujudkannya dengan mengaktifkan tcp_tw_recycle
atau meningkatkan ip_conntrack_max
menjadi lebih besar dari jumlah port lokal yang disediakan untuk koneksi oleh ip_local_port_range
. Saya kira begitu kernel keluar dari port lokal, ia mulai mendaur ulang koneksi. Ini menggunakan lebih banyak koneksi pelacakan memori tetapi sepertinya solusi yang lebih baik daripada mengaktifkan 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 pengujian saya dan saya tidak tahu mengapa. Saya akan berpikir itu akan menutup koneksi di TIME_WAIT
nyatakan sekali ada 8192 dari mereka tetapi tidak melakukan itu untuk saya.
Solusi 2:
Anda benar-benar ingin melihat apa yang ditawarkan sistem file /proc kepada Anda dalam hal ini.
- Panduan Penyetelan TCP di Departemen Energi AS
- Parameter Penyetelan TCP untuk berbagai OS:es
- "Mengelola Linux dengan cepat" dari IBM
- Dokumentasi di LinuxInsight.com vis-a-vis /proc/sys/net/ipv4
Di halaman terakhir tersebut, Anda mungkin menemukan 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. Meningkatkan ini dapat menghabiskan sebanyak 64kbyte memori yang tidak dapat ditukar per soket anak yatim .
- /proc/sys/net/ipv4/tcp_orphan_retries, yang mengontrol jumlah percobaan ulang sebelum soket ditinggalkan dan ditutup. Ada catatan khusus di laman itu tentang server web yang menarik minat Anda secara langsung...
Solusi 3:
Saya tidak berpikir ada merdu untuk mengaturnya secara langsung. Ini termasuk dalam kategori penyetelan TCP/IP. Untuk mengetahui apa yang dapat Anda setel, coba '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 ini telah berubah, soket TCP/IP terbuka seperti deskriptor file. Jadi bagian ini dan selanjutnya di tautan itu mungkin yang Anda cari.
Solusi 4:
Coba atur yang berikut ini juga atur tcp_fin_timeout. Ini akan menutup TIME_WAIT lebih cepat.
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
Solusi 5:
Stock apache(1) biasanya sudah ditentukan sebelumnya untuk hanya mendukung 250 koneksi bersamaan - jika Anda menginginkan lebih, ada satu file header untuk dimodifikasi untuk memungkinkan lebih banyak sesi bersamaan. Saya tidak tahu apakah ini masih berlaku dengan Apache 2.
Selain itu, Anda perlu menambahkan opsi untuk mengizinkan lebih banyak deskriptor file terbuka untuk akun yang menjalankan Apache - sesuatu yang gagal ditunjukkan oleh komentar sebelumnya.
Perhatikan pengaturan pekerja Anda dan jenis waktu tunggu keepalive yang Anda miliki di dalam Apache itu sendiri, berapa banyak server cadangan yang Anda jalankan sekaligus, dan seberapa cepat proses tambahan ini dimatikan.