Pernis kehabisan port terbuka, banyak koneksi SYN_SENT

8

Baru-baru ini kami mengalami masalah dengan pengaturan Varnish (3x) -> Apache (3x) kami, yang mengakibatkan lonjakan besar dalam SYN_SENTkoneksi.

Lonjakan itu sendiri disebabkan oleh jumlah lalu lintas baru yang mengenai situs (bukan DDOS dalam bentuk apa pun), dan sepertinya mesin Varnish kami mengalami masalah meneruskan lalu lintas ke server backend (penurunan lalu lintas Apache berkorelasi dengan lonjakan pada pernis ), menumpuk kolam port yang tersedia dengan SYN_SENT.

Keep-alive diaktifkan di Apache (15s).

Sisi mana yang salah? Jumlah trafik sangat signifikan, tetapi dalam jumlah berapa pun ia tidak akan menyebabkan pengaturan seperti itu (mesin frontend 3x Varnish, server Apache 3x backend) terhenti.

Tolong bantu.

Tangkapan layar Munin untuk koneksi melalui firewall ada di sini .

Pernis ~$ netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

      9 CLOSE_WAIT
     12 CLOSING
    718 ESTABLISHED
     39 FIN_WAIT1
   1714 FIN_WAIT2
     76 LAST_ACK
     12 LISTEN
    256 SYN_RECV
   6124 TIME_WAIT

/etc/sysctl.conf (Varnish)

net.ipv4.netfilter.ip_conntrack_max = 262144
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_fin_timeout = 30

Apache netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

     11 CLOSE_WAIT
    286 ESTABLISHED
     38 FIN_WAIT2
     14 LISTEN
   7220 TIME_WAIT

/etc/sysctl.conf (Apache)

vm.swappiness=10
net.core.wmem_max = 524288
net.core.wmem_default = 262144
net.core.rmem_default = 262144
net.core.rmem_max = 524288
net.ipv4.tcp_rmem = 4096 262144 524288
net.ipv4.tcp_wmem = 4096 262144 524288
net.ipv4.tcp_mem = 4096 262144 524288

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_keepalive_time = 30

net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.core.somaxconn = 2048


net.ipv4.conf.lo.arp_ignore=8
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

vm.swappiness = 0

kernel.sysrq=1
kernel.panic = 30
pengguna150997
sumber
1
Di mana letak firewall? Satu-satunya sistem dengan SYN_SENTstatistik tinggi adalah firewall; apakah Anda mengatakan bahwa sepertinya firewall adalah hambatannya?
Shane Madden
Firewall dengan SYN_SENT tinggi terletak di mesin Varnish.
user150997
statistik eth / conntrack lebih lanjut di sini: grab.by/iA2M
user150997
1
apa / / proc / sys / net / ipv4 / tcp_max_tw_buckets Anda dan tcp_max_syn_backlog Anda atur? (milik saya adalah 180000 yang merupakan 180k waktu tunggu dan 1024 (meningkat ketika lebih banyak memori hadir)). Juga, mengapa Anda mengaktifkan tw_recycle? Bukankah itu menyebabkan kesalahan? (Atau apakah itu daur ulang?)
Grizly
1
Anda mungkin ingin mempertimbangkan untuk mengatur net.ipv4.tcp_tw_recycle ke nol - terutama jika load balancing. Saya punya masalah dengan HAproxy pada konkurensi tinggi dengan ini diaktifkan. Juga, saya akan menonaktifkan iptables selama pengujian. Saya telah melihat beberapa hasil aneh dengan pelacakan koneksi ketika digunakan dalam lingkungan yang seimbang beban.
jeffatrackaid

Jawaban:

3

Masalah Anda mungkin dengan sysctl di server Apache.

Beberapa asumsi: Biasanya Varnish jauh lebih cepat dalam memproses setiap koneksi daripada server web (kecuali mungkin server Varnish Anda memiliki lebih sedikit CPU, dan server Apache Anda hanya menyajikan file statis yang di-cache dalam memori.) Saya akan menganggap proses koneksi Anda lebih cepat dalam Varnish dari Apache.

Oleh karena itu, sumber daya di server Apache Anda mungkin cukup, tetapi permintaan harus mengantri di suatu tempat, jika hanya sebentar. Saat ini mereka tidak mengantri dengan cara yang sehat di mana mereka akhirnya diproses.

Sepertinya permintaan Anda macet di Varnish dan tidak berhasil masuk ke server Apache.

Ada beberapa bukti untuk ini:

Perhatikan dalam grafik munin Anda, sebelum SYN_SENT didukung, permintaan dalam TIME_WAIT meningkat, kemudian setelah satu titik, mereka mulai menumpuk sebagai SYN_SENTS. Ini menunjukkan bahwa permintaan mulai dijawab lebih lambat, kemudian antrian kembali dan permintaan tidak dijawab sama sekali.

Ini menunjukkan kepada saya bahwa server Apache Anda tidak menerima koneksi yang cukup (di mana mereka kemudian dapat duduk dan mengantri untuk Apache untuk memprosesnya.)

Saya melihat beberapa batasan yang mungkin dalam file konfigurasi Anda:

Ketika Anda memiliki spike, Anda memiliki sekitar 30000 koneksi dalam status SYN_SENT di server Varnish Anda.

Namun, pada server Apache, max_syn_backlog Anda hanya 16384. Somaxconn Anda hanya 2048.

Perhatikan juga ukuran buffer memori jaringan Anda di server Apache sangat rendah. Anda telah menyesuaikannya di server Varnish hingga 16MB. Tetapi pada server Apache net.ipv4.tcp_rmem Anda hanya 524KB untuk mencocokkan net.core.rmem_max Anda.

Saya sarankan menaikkan semua parameter ini di server Apache.

Anda harus lebih fokus pada diagnostik di server Apache untuk mencari tahu apa yang sebenarnya terjadi, tetapi Anda mungkin tidak perlu melakukannya jika Anda meningkatkan nilai-nilai ini.

Anda mungkin tidak harus menyesuaikan net.ipv4.tcp_mem. Perhatikan bahwa unit untuk parameter ini ada di halaman, bukan byte, sehingga menyalin nilai yang sama dari net.ipv4.tcp_rmem atau net.ipv4.tcp_wmem (keduanya dalam byte) tidak masuk akal. Ini disetel otomatis oleh linux berdasarkan jumlah memori Anda sehingga jarang perlu penyesuaian. Sebenarnya ini mungkin masalah Anda, secara sewenang-wenang membatasi memori yang tersedia untuk antrian koneksi keseluruhan.

Lihat: http://russ.garrett.co.uk/2009/01/01/linux-kernel-tuning/

Perhatikan juga "vm.swappiness = 0" Anda diset dua kali, sekali sebagai 10, dan sekali lagi di bagian bawah sebagai 0, yang merupakan nilai efektif.

Walker Traylor
sumber
0

Di server Varnish, coba ubah 2 parameter ini:

net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1

tw_reuse akan memungkinkannya untuk menggunakan kembali koneksi di TIME_WAIT.

tw_recycle dapat menyebabkan masalah dengan load balancers dll.

Florin Asăvoaie
sumber