Proses MySQL berjalan lebih dari 100% dari penggunaan CPU


10

Saya mengalami beberapa masalah dengan server LAMP saya. Baru-baru ini semuanya menjadi sangat lambat, meskipun jumlah pengunjung di situs web saya tidak banyak berubah. Ketika saya menjalankan topperintah, dikatakan bahwa proses MySQL telah mengambil alih 150-200% CPU. Bagaimana mungkin, saya selalu berpikir bahwa 100% adalah maksimum?

Saya menjalankan Ubuntu 9.04 edisi server dengan RAM 1,5 GB.

my.cnf pengaturan:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

Berikut ini adalah output dari MySQLTuner :

Output MySQLTuner

The topperintah:

output atas

Apa yang bisa menjadi penyebab masalah ini? Bisakah saya membuat perubahan pada saya my.cnfuntuk mencegah server hang?

Jawaban:


15
  1. Tingkatkan Kunci Penyangga (milik Anda saat ini 64MB, tetapi total indeks 116M, jadi masukkan setidaknya 128MB). Harus segera membantu.
  2. Jalankan mysqloptimize dan mysqlrepair di tabel Anda
  3. Menambah cache tabel / mengurangi jumlah tabel untuk meningkatkan hit rate cache tabel. Mungkin Anda memiliki beberapa tabel lama atau tidak terpakai yang bisa dihapus.

Opsi konfigurasi yang disarankan lainnya:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • log-queries-not-using-indexes

Periksa file log setelah beberapa waktu.


Terima kasih atas rekomendasinya, saya akan mencobanya dan memberi tahu Anda jika itu membantu.
Temnovit

tolong beri tahu saya, bagaimana Anda menghitung bahwa total indeks 116 juta?
Temnovit

mendapatkannya sendiri :)
Temnovit

5

Anda memiliki prosesor yang memiliki lebih dari satu inti, atau Anda memiliki banyak prosesor. Jika Anda memiliki dua inti dan suatu proses menggunakan 100% dari kedua inti, itu akan ditampilkan sebagai 200% di atas.

Demikian juga, ini sepertinya berfungsi sebagaimana mestinya - tidak ada yang salah dengan konfigurasi Anda. Jika Anda sering mengalami hang, dari apa yang Anda posting, Anda mungkin ingin melihat menambahkan indeks yang tepat ke tabel Anda (atau mengoptimalkan pertanyaan Anda).


5

Jalankan top -Huntuk melihat semua utas yang berjalan dan bukan hanya keseluruhan proses. Juga, jika Anda menekan 1tombol saat di atas, itu akan menunjukkan kepada Anda penggunaan CPU untuk masing-masing CPU / core.


Terima kasih, ini sangat membantu saya - telah menggunakan top selama bertahun-tahun dan tidak tahu itu memiliki kemampuan ini. Saya menemukan ada satu thread mysql "abadi" yang mengonsumsi 60% CPU pengguna sepanjang waktu, sementara utas kueri datang dan pergi di atas ini. Sekarang untuk mengetahui apa yang sebenarnya dilakukan utas ini ...
scipilot

1

Mysql memiliki banyak proses (utas) yang bekerja secara independen, satu, misalnya, bertanggung jawab untuk menulis data dari memori ke disk. Dengan banyak inti dalam CPU (dan / atau banyak CPU), lebih dari satu utas berfungsi, dan sehingga dapat menjalankan lebih dari 100% inti tunggal - pada tingkat sederhana, mungkin 75% dari masing-masing dua inti berjalan , memberi 150%.


1

Saya perhatikan ada masalah, tidak terkait dengan CPU. Jika Anda menggunakan apache dan MySQL di server yang sama, Anda dapat mencapai kondisi buruk ( RAM ) ketika aktivitas apache Anda meningkat.

MySQLTunner memberi tahu Anda bahwa dengan menggunakan 200 koneksi yang tersedia (pengaturan koneksi maksimal Anda), Anda akan mengisi RAM. Katakanlah Anda memiliki apache terbatas hingga 150 proses, Anda tentu tidak akan memiliki cukup RAM ketika MySQL dan apache akan mencoba menggunakan 150 koneksi (karena Apache juga pemakan RAM yang baik).

Jadi ini tentang RAM dan Anda mungkin belum menekan :-) Perintah teratas hanya menampilkan 15 proses apache (tapi Anda sedang memuat rata-rata 3/6/16 sehingga berarti badai itu 15 menit yang lalu dan sekarang dalam pergi).

Tentang masalah CPU, untuk melengkapi respon yang baik dari shakalandy , ini mungkin karena satu permintaan tunggal. Itu bisa berada di meja besar, atau melakukan banyak tugas indeks ulang, atau menggunakan banyak file sementara, indeks hilang (dihapus?), Dll. Satu-satunya cara untuk mendeteksinya adalah mengaktifkan log permintaan lambat (mungkin dengan tekanan tinggi, seperti 8s). Kemudian gunakan alat mysqlsla untuk menganalisis log kueri lambat ini, dan jalankan beberapa penjelasan pada kueri yang diidentifikasi.


Terima kasih, memang, mysql bukan satu-satunya proses di sekitar :)
Temnovit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.