Kami memiliki beberapa sistem produksi yang baru-baru ini dikonversi menjadi mesin virtual. Ada aplikasi kami yang sering mengakses database MySQL, dan untuk setiap permintaan itu membuat koneksi, permintaan, dan memutus koneksi itu.
Itu bukan cara yang tepat untuk query (saya tahu), tetapi kami memiliki kendala yang sepertinya tidak bisa kami selesaikan. Bagaimanapun, masalahnya adalah ini: sementara mesin itu adalah host fisik, program berjalan dengan baik. Setelah dikonversi ke mesin virtual, kami melihat masalah koneksi yang terputus-putus ke database. Ada, pada satu titik, 24.000+ koneksi soket di TIME_WAIT (pada host fisik, yang paling saya lihat adalah 17000 - tidak baik, tetapi tidak menyebabkan masalah).
Saya ingin koneksi ini digunakan kembali, sehingga kita tidak melihat masalah koneksi, dan karenanya:
Pertanyaan:
Apakah boleh untuk menetapkan nilai tcp_tw_reuse ke 1? Apa bahaya yang jelas? Apakah ada alasan saya tidak boleh melakukannya?
Juga, apakah ada cara lain untuk mendapatkan sistem (RHEL / CentOS) untuk mencegah begitu banyak koneksi masuk ke TIME_WAIT, atau membuatnya digunakan kembali?
Terakhir, apa yang akan dilakukan dengan mengubah tcp_tw_recycle, dan apakah itu akan membantu saya?
Di muka, terima kasih!
Jawaban:
Anda dapat dengan aman mengurangi waktu henti, tetapi Anda mungkin mengalami masalah dengan koneksi yang tidak benar tertutup pada jaringan dengan kehilangan paket atau jitter. Saya tidak akan mulai menyetel pada 1 detik, mulai pada 15-30 dan mulai bekerja.
Juga, Anda benar-benar perlu memperbaiki aplikasi Anda.
RFC 1185 memiliki penjelasan yang baik di bagian 3.2:
sumber
Ini tidak menjawab pertanyaan Anda (dan terlambat 18 bulan), tetapi menyarankan cara lain untuk membuat porta aplikasi lama Anda menggunakan kembali port:
Alternatif yang berguna untuk pengaturan
tcp_tw_reuse
(atautcp_tw_recycle
) pada sistem adalah dengan memasukkan perpustakaan bersama (menggunakanLD_PRELOAD
) ke aplikasi Anda; perpustakaan itu kemudian dapat mengizinkan penggunaan kembali port. Ini membuat aplikasi lawas Anda memungkinkan penggunaan kembali port tanpa memaksakan ini pada semua aplikasi di sistem Anda (tidak perlu modifikasi aplikasi), sehingga membatasi dampak tweak Anda. Sebagai contoh,Pustaka bersama ini harus mencegat
socket()
panggilan, memanggil soket asli (), dan mengatur SO_REUSEADDR dan / atau SO_REUSEPORT pada soket yang dikembalikan. Lihatlah http://libkeepalive.sourceforge.net untuk contoh bagaimana melakukan ini (ini menghidupkan keepalives, tetapi menyalakan SO_REUSEPORT sangat mirip). Jika aplikasi lawas Anda yang berperilaku buruk menggunakan IPv6, ingatlah untuk mengubah jalur 55libkeepalive.c
dariuntuk
Jika Anda buntu, kirim saya email dan saya akan menulis kode dan mengirimkannya kepada Anda.
sumber
Saya pikir tidak apa-apa untuk mengubah nilai ini menjadi 1. Cara yang lebih tepat adalah dengan menggunakan perintah:
Tidak ada bahaya nyata yang saya ketahui, tetapi pencarian Google cepat menghasilkan tautan ini yang menegaskan bahwa itu
tcp_tw_reuse
adalah alternatif yang lebih baik daripadatcp_tw_recycle
, tetapi harus digunakan dengan hati-hati.sumber
Koneksi tidak dapat digunakan kembali jika mereka dalam TIME WAIT. Jika Anda tidak memiliki packet loss pada jaringan antara aplikasi dan MySQL, Anda dapat menurunkan batas waktu.
Namun solusi terbaik adalah menggunakan koneksi persisten ke database dan kumpulan koneksi.
sumber