Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

mysql TIME_WAIT; terlalu banyak masalah koneksi

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyimpan desimal di MySQL?

  2. MySQL CHECK alternatif kendala

  3. Apakah mungkin menggunakan Crosstab/Pivot Query di MySQL?

  4. Menggunakan bulk_update_mappings di SQLAlchemy untuk memperbarui beberapa baris dengan nilai yang berbeda

  5. Pemicu MySQL dengan pernyataan SELECT