Logging merusak kinerja MySQL - tetapi, mengapa?

9

Saya cukup terkejut bahwa saya tidak dapat melihat jawaban untuk ini di mana pun di situs sudah, atau dalam dokumentasi MySQL ( bagian 5.2 tampaknya memiliki logging kalau tidak tertutup dengan baik!)

Jika saya mengaktifkan binlog, saya melihat hit kinerja kecil (subyektif), yang diharapkan dengan sedikit IO tambahan - tetapi ketika saya mengaktifkan log kueri umum, saya melihat hit kinerja yang luar biasa (dua kali lipat waktu menjalankan kueri, atau lebih buruknya), jauh melebihi apa yang saya lihat dengan binlog. Tentu saja saya sekarang mencatat setiap SELECT dan juga setiap UPDATE / INSERT, tetapi, daemon lain mencatat setiap permintaan mereka (Apache, Exim) tanpa berhenti.

Apakah saya hanya melihat efek dari dekat dengan "titik kritis" kinerja ketika datang ke IO, atau ada sesuatu yang secara mendasar sulit tentang logging kueri yang menyebabkan ini terjadi? Saya ingin dapat mencatat semua permintaan untuk membuat pengembangan lebih mudah, tetapi saya tidak dapat membenarkan jenis perangkat keras yang rasanya seperti kita perlu untuk mendapatkan kinerja kembali dengan permintaan log masuk umum.

Saya, tentu saja, mencatat permintaan lambat, dan ada peningkatan yang dapat diabaikan dalam penggunaan umum jika saya menonaktifkan ini.

(Semua ini ada di Ubuntu 10,04 LTS, MySQLd 5.1.49, tetapi penelitian menunjukkan ini adalah masalah yang cukup universal)

James Green
sumber

Jawaban:

9

Log kueri umum jauh lebih banyak IO daripada log biner. Selain fakta bahwa sebagian besar server SQL 90% membaca hingga 10% menulis, log biner disimpan dalam format biner daripada teks biasa yang menggunakan lebih sedikit ruang disk. (Berapa jauh lebih sedikit ruang? Aku tidak yakin. Maaf.)

Ada dua aspek mengapa Apache dan Exim dapat merekam setiap permintaan tanpa dampak kinerja yang signifikan. Yang pertama adalah bahwa mereka mencatat fakta bahwa permintaan terjadi tetapi apa yang mereka masukkan ke dalam log biasanya jauh lebih kecil dari permintaan yang sebenarnya. Permintaan HTTP seringkali dua kali lebih besar dari garis yang masuk dalam log dan bahkan email teks pendek yang pendek 10 atau 20 kali lebih besar dari garis log yang menyertainya. Email dengan lampiran 10MB masih hanya memiliki beberapa baris tertulis di log.

Bagian kedua dari ini adalah bahwa dalam aplikasi web normal biasanya ada puluhan query SQL yang terkait dengan satu halaman HTTP. Email cenderung datang dalam jumlah yang lebih kecil daripada permintaan HTTP. Server MySQL Anda mungkin mencoba untuk login lebih dari Apache atau Exim.

Lihatlah ukuran (tidak terkompresi) dari log biner dan umum MySQL Anda dan log Apache dan Exim Anda pada akhir hari. Saya yakin Anda menemukan log umum MySQL adalah yang terbesar dengan faktor setidaknya 5.

Ladadadada
sumber
1
Beberapa poin bagus - khususnya, ya, satu GET untuk aplikasi kita dapat menyebabkan 100-an SELECT, karena meskipun kita mencoba melakukan sebanyak yang kita bisa dalam satu permintaan kadang-kadang kita menukar kinerja / kebersihan ini untuk struktur yang lebih elegan, kode yang lebih mudah dibaca dan DB yang lebih bersih. (Sebagai tambahan, semua ini sebenarnya dimulai dari berbicara tentang mencatat konten POST serta URL dari GET, karena kami melihat params yang dilihat CGI.pm dalam satu kasus dan bukan yang lain, dan dari sana menjadi pencatatan / kinerja di umum). Bagaimanapun, sudah beberapa jam, jadi, jawaban diterima. Terima kasih!
James Green
4

Untuk menambah jawaban yang disediakan , Anda juga akan melihat performa yang baik jika Anda masuk ke perangkat yang sama dengan penyimpanan data MySQL Anda - jika itu disk yang sama, Anda akan membaca dan menulis ke beberapa lokasi sepanjang waktu, memperlambat seluruh proses.

Ini benar bahkan jika itu partisi yang berbeda pada disk fisik yang sama.

Jika masuk ke perangkat lain, itu akan meringankan beberapa masalah kinerja.

warren
sumber
1
Tidak relevan dengan situasi saya - ini adalah VM yang dihosting, dan DB berada pada volume logis terpisah ke / var, disediakan pada gilirannya dari array penyimpanan yang sama. Saya kira secara teori mereka bisa berada pada spindle yang sama, tapi rasanya seperti kebetulan yang luar biasa :-) Itu mengatakan, +1 samping, karena ini benar-benar relevan dengan seseorang dengan misalnya pengaturan Debian / Ubuntu default (DBs di / var / mysql, log in / var / log)!
James Green
@jimbo - terima kasih untuk alat peraga meskipun itu tidak secara langsung berlaku untuk situasi khusus Anda :)
warren