Jika klien terhubung ke MySQL-Server, biasanya akan membuka port lokal, contoh:
localhost:12345 -> mysqlserver:3306
Jika klien menutup koneksi, klien mendapat TIME_WAIT. Karena perutean TCP, sebuah paket mungkin datang terlambat di port sementara. Sambungan dalam TIME_WAIT hanya membuang paket-paket ini. Tanpa TIME_WAIT, port lokal mungkin digunakan kembali untuk koneksi lain dan mungkin menerima paket dari koneksi sebelumnya.
Pada aplikasi dengan frekuensi tinggi di web yang membuka koneksi mysql per permintaan, jumlah koneksi TIME_WAIT yang tinggi dapat diharapkan. Tidak ada yang salah dengan itu.
Masalah dapat terjadi, jika jangkauan port lokal Anda terlalu rendah, sehingga Anda tidak dapat membuka koneksi keluar lagi. Batas waktu yang biasa diatur ke 60 detik. Jadi masalah sudah bisa terjadi pada lebih dari 400 permintaan per detik pada rentang rendah.
Periksa:
Untuk memeriksa jumlah TIME_WAIT, Anda dapat menggunakan perintah berikut:
$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
Nilai setelah "tw", dalam hal ini 33365, menunjukkan jumlah TIME_WAIT.
Solusi:
sebuah. Penyetelan TIME_WAIT (contoh OS berbasis Linux):
Kurangi batas waktu untuk TIME_WAIT:
# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
Tingkatkan jangkauan port untuk port lokal:
# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
Pengaturan /proc/sys/net/ipv4/tcp_tw_recycle
dan /proc/sys/net/ipv4/tcp_tw_reuse
mungkin menarik juga. (Tapi kami mengalami efek samping yang aneh dengan pengaturan ini, jadi lebih baik hindari. Informasi lebih lanjut di jawab
)
b. Koneksi Persisten
Beberapa bahasa pemrograman dan pustaka mendukung koneksi persisten. Solusi lain mungkin menggunakan proxy yang diinstal secara lokal seperti "ProxySQL". Ini mengurangi jumlah koneksi baru dan koneksi tertutup.