Salah satu issue besar yang acapkali menimpa server yg menggunakan MySQL, adalah berhubungan dengan error Too Many Connections. Setidaknya, apa yg gw omongkan di sini bukan hoax -- tanyakanlah itu pada admin Kaskus.us, admin MWN, admin diskusiweb, admin ekomit (hehehe, sumpah bukan gw) -- error Too Many Connection itu bener-bener menyebalkan. SANGAT-SANGAT-SANGAT-SANGAT-MENYEBALKAN.
Sebenarnya, apa sih error Too Many Connections itu? Dan kenapa bisa (sering bangedd) terjadi. Artikel gw kali ini akan mencoba membahasnya.
- terlalu banyak koneksi yang terjadi secara simultan --> cukup sering dijumpai oleh site-site yang emang ramai pengunjung.
- terjadi flooding paket cacat ke port yg dipakae MySQL --> ini bisa di-test dengan melakukan telnet ke 3306, coba aja lakukan beberapa kali : insyaAllah MySQL Server langsung down, ato bisa juga karena terjadi kegagalan koneksi berkali2.
- terlalu banyak koneksi yang udah obsolete, tapi belum di-release / di-free-kan.
Utk habit kedua, terdapat banyaknya paket cacat di pool MySQL, cara nanganinnya adalah dengan melakukan flush menggunakan tools mysqladmin. bikin batch-script yang isinya mysqladmin flush-hosts -- trus pasang sebagai handler di Web Server atau di program desktop (sesuaikan dengan environmentnya) kalo2 menemukan error di MySQL engine dengan kode error SQLSTATE = 08S01 (utk server error yg berhubungan dengan bad packet) atau 46000 (utk server error yg berhubungan dengan koneksi), atau ndeteksi dari kode error ODBC -2147467259 (ni value yg gw trap dari error ADODB makae MyODBC).
Utk habit ketiga, terlalu banyak koneksi yg udah obsolete, tapi belum di-release atau di free-kan -- ini adalah masalah budaya coding juga sih. Code yang jorok, akan meninggalkan banyak junk di cache server. Bagi para coder, mestinya *sadar dikit* tentang cara melakukan koneksi ke DBMS, apakah dengan cara persistent-connection atau non-persistent. Klo cara yang dipakae adalah persistent-connection (kelebihan klo makae teknik ini adalah *memungkinkan utk melakukan transaction-safe queries*) -- perhatikan benar di masalah threading (silakan liat artikel ini utk referensi : http://forums.devshed.com/php-development-5/mysql-pconnect-22495.html).
Utk me-manage dari sisi administrasi server mengenai persistent connection ini, ada 2 variabel server yg perlu diperhatikan.
1. max_connections --> seperti pembahasan pada habit pertama;
2. wait_timeout --> MySQL mengendalikan "umur" sebuah persistent connection melalui variabel ini, dimana nilai default-nya adalah 8 jam. Silakan ubah nilai variabel ini sesuai dengan server-load yg terjadi dalam produksi.
Sedangkan utk handle non-persistent connection, dimana ini adalah teknik umum yg dipakai (klo di PHP, makae mysql_connect() atau liat library yg disediakan oleh connector yg dipakae). Untuk kebersihan code, *always-selalu-musti* lakukan closing terhadap object koneksi klo proses querying selesai. lakukan mysql_close() segera ketika dibutuhkan.
Kekurangan mysql_connect() ini ketimbang mysql_pconnect() dalam persistent connection adalah ngga ada mekanisme utk memakai "existing non-persistent connection" -- jadi, bisa saja dalam satu modul aplikasi yg diakses oleh satu client menjalin 2-3-4-atau lebih koneksi, which is : ini pemborosan jumlah koneksi!
Be aware dengan non-persistent-connection! Kerapian code Anda menentukan kualitas aplikasi Anda sendiri!
Emm...,
Tapi yang namanya programmer itu juga manusia, punya rasa punya hati, -- juga punya khilaf. Kalo *seandainya* koneksi-koneksi non-persistent tersebut di-create asal dan ngga di-close, kan bakal banyak juga tuh koneksi nyangkut. MySQL mengantisipasi masalah ini dengan juga memberikan "umur" koneksi (sama seperti penanganan persistent-connection di atas), hanya saja, variabel server yang dipergunakan adalah interactive_timeout.
Anehnya, settingan default interactive_timeout ini JUGA 8 jam! sama seperti settingan default wait_timeout. Padahal koneksi non-persistent itu ditujukan utk keperluan transaksi query jangka pendek. Sangat-sangat-sangat-pendek, malah. Buka koneksi, kirim query, tunggu bentar, dapat hasil resultset, tutup. Bener-bener singkat, bukan?
Nah, saran gw, ubahlah interactive_timeout ini menjadi 3-5 menit lah (hehehe, jauh banged yak dari settingan standard 8 jam). Ini utk 'an-ti-si-sapi' bro... -- ada banyak sebab kenapa query bisa nyangkut n ngga ketutup walo pakae mysql_close() - terutama pada fase development - misal karena terjadi kegagalan atau kesalahan dalam melakukan query join, ato dapat error "MySQL Server Has Gone Away", atau cursor melakukan infinite loops, atau ... macam-macam dah. Dengan meminimalisasi interactive_timeout ke nilai waktu yang lebih representatif, kemungkinan terjadi error Too Many Connections bisa di-eliminir.
--
Apa yang paling menyebalkan klo kita dapetin error Too Many Connections?
Restart Server!! cuman itu solusinya.
*males bangedd deh...
_______________________
Rizky Prihanto
Software Architect PT Cinox Media Insani
7 comments:
Tulisan yang bagus, mantab. bahas lebih banyak lagi ya mas, gi belajar terus nih. php ma mysql
/etc/init.d/mysqld restart
mantabs, kalau settingan di innodb gimana mas ????
sedang mengalami :(
TErimakasih atas tulisan bagus n bermanfaatnya. :thumshup:
jiah...
emang bener bener MENYEBALKAN dah eni erot..
Eh, btw, ganti mysql.ini-nya dimana bro? Lha ane cuman punya akses ke phpmyadminnya aja e. Akses ke cpanelnya gak dapet. Gak dikasi sama momodnya. Klo ada apa apa wal dapet 'too many connections' lagi, cuman telpon 'eh tolong dong servernya di restart' (sesuai perintah postingan ini) *hadew*
Wah.. mantap penjelasannya...
bahasanya juga mantap...
cool
SIang Pak, bagus sekali sharing anda.
saya mau tanya, interactive_timeout jika di set ke 5 menit, jika dalam aplikasi terjadi TIME OUT, pakah akan flush release secara otomatis dalam jangka waktu 5 menit kemudian atau bagaimana ya pak? thx"
Ane sering alami ini gan, saat ini pun ane alami lagi too many ini, kemarin sih pas login koneksi internet lemot tapi karena butuh akhirnya aku terusin muter-muter sampai bisa login, ternyata gak bisa login malah muncul too many ini :(
Posting Komentar