Terlalu banyak proses MySQL

12

Saya mencoba untuk membantu seorang teman dengan servernya setelah dia memberi tahu saya bahwa MySQL-nya menggunakan terlalu banyak memori ... Ternyata tidak hanya menggunakan banyak memori, tetapi ada terlalu banyak proses mysql yang berjalan!

Inilah hasil dari ps auxww|grep mysql: http://pastebin.com/kYrHLXVW

Jadi pada dasarnya ada 13 proses MySQL, dan hanya ada 1 klien yang terhubung menurut mysqladmin ...

Setelah beberapa saat, masing-masing dari proses ini memakan hingga 50mb memori sehingga akhirnya menghabiskan banyak memori ...

Saya menggunakan template config my-medium.cnf langsung dari / usr / share / mysql ... Saya me-restart server mysql tetapi, segera setelah dimulai, ke-13 prosesnya kembali ... Saya tidak tahu apa masalah bisa ... ide / saran apa pun akan sangat dihargai!

pengguna24994
sumber

Jawaban:

16
mysql     9804  0.0  0.6 58556 22960 pts/0   S    12:43   0:00  \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9807  0.0  0.6 58556 22960 pts/0   S    12:43   0:00      \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9808  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9809  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
mysql     9810  0.0  0.6 58556 22960 pts/0   S    12:43   0:00          \_ /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/myhostname.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
[ ... repeated output truncated ... ]

Mereka tidak menggunakan ram 13 * 50mb - Mereka mungkin menggunakan sesuatu seperti total 70MB . Ingat bahwa linux akan membagikan halaman memori yang tidak dimodifikasi di antara proses-proses, jadi jika server Anda baru saja dimulai, sebagian besar memori itu akan dibagikan. Bahkan, karena mysql di-threaded, kemungkinan memori yang dialokasikan per thread akan lebih sedikit. Jika Anda khawatir tentang penggunaan memori setiap proses mysql, lihat /etc/mysql/my.cnf, dan lihat variabel di bagian mysqld:

  • key_buffers
  • thread_stack
  • thread_cache_size
  • max_connections
  • query_cache_limit
  • query_cache_size

Berhati-hatilah, bahwa itu adalah variabel yang sangat kuat untuk disetel, dan Anda dapat dengan mudah mematikan kinerja mysql Anda dengan menyetelnya terlalu rendah, atau membuang memori yang dapat digunakan di tempat lain dengan menyetelnya terlalu tinggi.

Satu titik awal yang mudah untuk mengetahui cara terbaik untuk menyetel contoh mysql Anda adalah dengan menjalankan aplikasi Anda sebentar, kemudian jalankan skrip mysqltune dari sini , yang akan menganalisis penghitung kinerja Anda, kemudian menghasilkan rekomendasi tentang apa yang harus Anda ubah di konfigurasi server Anda.

Jason
sumber
1
Saya tidak tahu mysqltune, terima kasih sangat berguna. Juga, orang dapat menggunakan htopuntuk mewarnai utas kami dan melihat memori aktual yang digunakan per proses.
mveroone
3

Linux menunjukkan utas sebagai proses terpisah. MySQL memulai satu utas per koneksi. Berlari psdengan f. Sebagai contoh, ps auxfwakan ditampilkan bagaimana kaitannya benang.

Ada berapa koneksi ke MySQL? Jalankan show full processlist;di klien MySQL. Dari apa yang Anda perlihatkan, saya bahkan tidak yakin ada yang salah.

Warner
sumber
Inilah hasilnya: pastebin.com/raw.php?i=XNCsG6KS Server baru saja dimulai Tidak yakin apakah itu membantu ... Dengan skrip init maksud Anda konten /etc/init.d/mysql?
user24994
Itu terlihat sangat normal bagi saya.
Warner
Menurutnya show full processlistada 2 koneksi ke database. Salah satunya menjadi localhost yang menjalankan show full processlist, yang lain juga saya, via phpmyadmin. Seharusnya tidak ada lagi koneksi karena situs tersebut belum
aktif
Jumlah koneksi akan tergantung pada kinerja aplikasi Anda dan tidak harus terkait langsung dengan jumlah pengguna. MySQL menggunakan memori berdasarkan pengaturan cnf. Apa yang membuat Anda berpikir melakukan kesalahan?
Warner
Maaf, saya kira itu tidak begitu jelas dalam pertanyaan saya haha, sangat mungkin bahwa tidak ada yang salah terjadi! Saya baru memperhatikan bahwa mysql menggunakan banyak memori (sekitar 13 * 50mb, jadi 650mb ram) dan belum ada lalu lintas ke situs ... Hanya saya yang bermain-main di phpmyadmin. Jadi saya kira pertanyaan saya lebih "Apakah ada yang salah?" bukannya "Apa yang salah" :)
user24994
1

Anda mungkin ingin mencoba MySQLTuner yang menurut saya sangat membantu, ini akan menyarankan kepada Anda yang mana dari variabel konfigurasi yang harus Anda coba sesuaikan.

icc97
sumber
Untuk pembaca baru, skrip MySQLTuner ditempatkan di sini: mysqltuner.pl
Jesper Grann Laursen