Saya menjalankan situs yang agak sibuk, dan selama jam mengintip saya melihat lebih dari 10.000 koneksi terbuka ke server database saya di server web saya ketika menjalankan perintah netstat. 99% koneksi berada di TIME_WAIT
negara bagian.
Saya belajar tentang variabel mysql ini: wait_timeout
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout hari ini. Milik saya masih ditetapkan pada standar 28.800 detik.
Apakah menurunkan nilai ini aman?
Bukan pertanyaan saya biasanya memakan waktu lebih dari satu detik. Jadi rasanya konyol untuk menjaga koneksi tetap terbuka selama 480 menit.
Saya juga mendengar tentang menggunakan mysql_pconnect
alih-alih mysql_connect
, tetapi saya tidak membaca apa pun selain cerita-cerita horor tentang itu, jadi saya pikir saya akan menjauh dari itu.
wait_timeout
koneksi yang lebih pendek ditutup ketika perangkat lunak mengharapkannya tetap terbuka.Jawaban:
Menurunkan nilainya cukup sepele tanpa me-restart mysql
Katakanlah Anda ingin menurunkan batas waktu hingga 30 detik
Pertama, tambahkan ini ke my.cnf
Kemudian, Anda dapat melakukan sesuatu seperti ini
Semua Koneksi DB setelah ini akan habis dalam 30 detik
PERINGATAN
Pastikan untuk menggunakan mysql_close secara eksplisit. Saya tidak mempercayai Apache seperti halnya kebanyakan pengembang. Jika tidak, kadang-kadang, ada kondisi lomba di mana Apache menutup Koneksi DB tetapi tidak memberi tahu mysqld dan mysqld menahan koneksi itu terbuka sampai waktu habis. Lebih buruk lagi, Anda mungkin melihat TIME_WAIT lebih sering. Pilih nilai batas waktu Anda dengan bijak.
UPDATE 2012-11-12 10:10 EDT
CAVEAT
Setelah menerapkan saran saya yang diposting, buat skrip yang disebut
/root/show_mysql_netstat.sh
dengan baris berikut:Ketika Anda menjalankan ini, Anda akan melihat sesuatu seperti ini:
Jika Anda masih melihat banyak mysql
TIME_WAITs
untuk server web mana pun, berikut adalah dua langkah peningkatan yang harus dilakukan:ESCALATION # 1
Masuk ke server web yang melanggar dan restart apache sebagai berikut:
Jika perlu, lakukan ini ke semua server web
ESCALATION # 2
Anda dapat memaksa OS untuk membunuh TIME_WAIT untuk mysql atau aplikasi lain dengan yang berikut:
Ini akan membuat TIME_WAIT kehabisan waktu dalam 1 detik.
Untuk memberikan kredit saat kredit jatuh tempo ...
TIME_WAIT
muncul.sumber
Jika Anda mendapatkan banyak koneksi TIME_WAIT di Server MySQL maka itu berarti server MySQL sedang menutup koneksi. Kasus yang paling mungkin dalam hal ini adalah host atau beberapa host masuk daftar blokir. Anda dapat menghapus ini dengan menjalankan:
Untuk mendapatkan daftar jumlah koneksi yang Anda miliki per IP run:
Anda juga dapat mengonfirmasi hal ini terjadi dengan mengunjungi salah satu klien Anda yang mengalami masalah saat menyambungkan dan telnet ke port 3306. Ini akan menampilkan pesan dengan sesuatu seperti:
sumber
Jika Anda memiliki banyak koneksi TIME_WAIT ke server MySQL Anda, itu berarti Anda menjalankan banyak kueri terhadap DB, dan membuka / menutup koneksi untuk setiap permintaan.
Dalam hal ini, Anda harus menggunakan konektivitas terus-menerus ke server DB Anda, menggunakan ekstensi MySQLi.
http://php.net/manual/en/mysqli.persistconns.php
Jika Anda tidak dapat menggunakan MySQLi, Anda sebaiknya menggunakan parameter thread_cache_size di konfigurasi MySQL Anda.
sumber