Ubuntu Server 10.04.1 x86
Saya memiliki mesin dengan layanan HTTP FCGI di belakang nginx, yang melayani banyak permintaan HTTP kecil untuk banyak klien yang berbeda. (Sekitar 230 permintaan per detik pada jam sibuk, ukuran respons rata-rata dengan header adalah 650 byte, beberapa juta klien berbeda per hari.)
Akibatnya, saya memiliki banyak soket, tergantung pada TIME_WAIT (grafik ditangkap dengan pengaturan TCP di bawah):
Saya ingin mengurangi jumlah soket.
Apa yang bisa saya lakukan selain ini?
$ cat / proc / sys / net / ipv4 / tcp_fin_timeout 1 $ cat / proc / sys / net / ipv4 / tcp_tw_recycle 1 $ cat / proc / sys / net / ipv4 / tcp_tw_reuse 1
Pembaruan: beberapa detail pada tata letak layanan aktual pada mesin:
client ----- TCP-socket -> nginx (load balancer reverse proxy) ----- TCP-socket -> nginx (pekerja) --domain-socket -> fcgi-software --single-persistent-TCP-socket -> Redis --single-persistent-TCP-socket -> MySQL (komputer lain)
Saya mungkin harus mengganti load-balancer -> koneksi pekerja ke soket domain juga, tetapi masalah tentang soket TIME_WAIT akan tetap ada - saya berencana untuk menambahkan pekerja kedua di mesin yang terpisah segera. Tidak akan dapat menggunakan soket domain dalam kasus itu.
sumber
Jawaban:
Satu hal yang harus Anda lakukan untuk memulai adalah memperbaiki
net.ipv4.tcp_fin_timeout=1
. Itu cara ke rendah, Anda mungkin tidak harus mengambil yang jauh lebih rendah dari 30.Karena ini di belakang nginx. Apakah itu berarti nginx bertindak sebagai proxy terbalik? Jika itu yang terjadi maka koneksi Anda 2x (satu ke klien, satu ke server web Anda). Apakah Anda tahu di mana ujung soket ini milik?
Pembaruan:
fin_timeout adalah berapa lama mereka tinggal di FIN-WAIT-2 (Dari
networking/ip-sysctl.txt
dalam dokumentasi kernel):Saya pikir Anda mungkin hanya perlu membiarkan Linux menjaga nomor soket TIME_WAIT melawan apa yang tampak seperti mungkin 32k tutup pada mereka dan ini adalah tempat Linux mendaur ulang mereka. 32k ini disinggung dalam tautan ini :
Tautan ini juga menunjukkan bahwa status TIME_WAIT adalah 60 detik dan tidak dapat disetel melalui proc.
Fakta menyenangkan acak:
Anda dapat melihat penghitung waktu pada timewait dengan netstat untuk setiap soket
netstat -on | grep TIME_WAIT | less
Reuse Vs Recycle:
Ini agak menarik, berbunyi seperti reuse mengaktifkan penggunaan kembali soket time_Wait, dan mendaur ulang memasukkannya ke mode TURBO:
Saya tidak akan merekomendasikan menggunakan net.ipv4.tcp_tw_recycle karena menyebabkan masalah dengan klien NAT .
Mungkin Anda mungkin mencoba untuk tidak mengaktifkan keduanya dan melihat efeknya (Coba satu per satu dan lihat bagaimana mereka bekerja sendiri)? Saya akan menggunakan
netstat -n | grep TIME_WAIT | wc -l
umpan balik yang lebih cepat daripada Munin.sumber
net.ipv4.tcp_fin_timeout
akan Anda rekomendasikan?30
atau mungkin20
. Cobalah dan lihatlah. Anda memiliki banyak muatan sehingga banyak jenis TIME_WAIT masuk akal.net.ipv4.tcp_fin_timeout
dari1
ke20
?netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
. Jadi @Alex, jika Munin tidak suka, mungkin menelusuri bagaimana memantau statistik ini. Mungkin satu-satunya masalah adalah bahwa Munin memberi Anda data buruk :-)tcp_tw_reuse relatif aman karena memungkinkan koneksi TIME_WAIT untuk digunakan kembali.
Anda juga dapat menjalankan lebih banyak layanan dengan mendengarkan port yang berbeda di belakang load-balancer Anda jika kehabisan port merupakan masalah.
sumber