Saya ingin tahu bagaimana cara menetapkan batas atas jumlah memori yang digunakan MySQL di server Linux.
Saat ini, MySQL akan terus menggunakan memori dengan setiap permintaan baru yang diminta sehingga akhirnya kehabisan memori. Apakah ada cara untuk membatasi agar tidak lebih dari jumlah tersebut yang digunakan oleh MySQL?
Jawaban:
Penggunaan memori maksimum MySQL sangat bergantung pada perangkat keras, pengaturan Anda, dan database itu sendiri.
Perangkat keras
Perangkat keras adalah bagian yang jelas. Semakin banyak RAM semakin baik, disk lebih cepat ftw . Namun, jangan percaya surat berita bulanan atau mingguan itu. MySQL tidak berskala linier - bahkan pada perangkat keras Oracle. Ini sedikit lebih rumit dari itu.
Intinya adalah: tidak ada aturan umum tentang apa yang direkomendasikan untuk pengaturan MySQL Anda . Itu semua tergantung pada penggunaan saat ini atau proyeksi.
Pengaturan & database
MySQL menawarkan variabel dan sakelar yang tak terhitung jumlahnya untuk mengoptimalkan perilakunya. Jika Anda mengalami masalah, Anda benar-benar perlu duduk dan membaca manual (f'ing).
Adapun database - beberapa kendala penting:
InnoDB
,MyISAM
, ...)Kebanyakan tips MySQL tentang stackoverflow akan memberi tahu Anda tentang 5-8 yang disebut pengaturan penting. Pertama, tidak semuanya penting - misalnya mengalokasikan banyak sumber daya ke InnoDB dan tidak menggunakan InnoDB tidak masuk akal karena sumber daya tersebut terbuang percuma.
Atau - banyak orang menyarankan untuk menaikkan
max_connection
variabel - yah, sedikit yang mereka ketahui itu juga menyiratkan bahwa MySQL akan mengalokasikan lebih banyak sumber daya untuk memenuhi itumax_connections
- jika diperlukan. Solusi yang lebih jelas mungkin menutup koneksi database di DBAL Anda atau menurunkanwait_timeout
untuk membebaskan utas tersebut.Jika Anda memahami maksud saya - benar-benar ada banyak, banyak hal untuk dibaca dan dipelajari.
Mesin
Mesin tabel adalah keputusan yang cukup penting, banyak orang melupakannya sejak awal dan kemudian tiba-tiba menemukan diri mereka berkelahi dengan
MyISAM
meja berukuran 30 GB yang mengunci dan memblokir seluruh aplikasi mereka.Saya tidak bermaksud mengatakan MyISAM menyebalkan , tetapi
InnoDB
dapat diubah untuk merespons hampir atau hampir secepatMyISAM
dan menawarkan hal seperti penguncian barisUPDATE
sementaraMyISAM
mengunci seluruh tabel saat ditulis.Jika Anda bebas menjalankan MySQL di infrastruktur Anda sendiri, Anda mungkin juga ingin memeriksa server percona karena di antara termasuk banyak kontribusi dari perusahaan seperti Facebook dan Google (mereka tahu dengan cepat), itu juga termasuk drop- sebagai pengganti
InnoDB
, dipanggilXtraDB
.Lihat inti saya untuk pengaturan percona-server (dan -client) (di Ubuntu): http://gist.github.com/637669
Ukuran
Ukuran database sangat, sangat penting - percaya atau tidak, kebanyakan orang di Intarwebs tidak pernah menangani pengaturan MySQL yang besar dan menulis secara intens tetapi itu benar-benar ada. Beberapa orang akan mengolok-olok dan mengatakan sesuatu seperti, "Gunakan PostgreSQL !!! 111", tapi mari kita abaikan mereka untuk saat ini.
Intinya adalah: dilihat dari ukuran, keputusan tentang perangkat keras harus dibuat. Anda tidak dapat benar-benar membuat database 80 GB berjalan cepat pada RAM 1 GB.
Indeks
Bukan: semakin banyak, semakin meriah. Hanya indeks yang diperlukan yang harus ditetapkan dan penggunaan harus diperiksa
EXPLAIN
. Tambahkan ke bahwa MySQLEXPLAIN
sangat terbatas, tetapi ini adalah permulaan.Konfigurasi yang disarankan
Tentang ini
my-large.cnf
danmy-medium.cnf
file - saya bahkan tidak tahu untuk siapa itu ditulis. Gulung milik Anda sendiri.Tuning primer
Awal yang baik adalah tuning primer . Ini script bash (petunjuk: Anda harus linux) yang mengambil output dari
SHOW VARIABLES
danSHOW STATUS
dan membungkus menjadi rekomendasi semoga bermanfaat. Jika server Anda sudah berjalan lama, rekomendasinya akan lebih baik karena akan ada data untuk dijadikan dasar.Primer tuning bukanlah saus ajaib. Anda tetap harus membaca semua variabel yang disarankan untuk diubah.
Bacaan
Saya sangat merekomendasikan mysqlperformanceblog . Ini adalah sumber yang bagus untuk semua jenis tip terkait MySQL. Dan bukan hanya MySQL, mereka juga tahu banyak tentang perangkat keras yang tepat atau merekomendasikan penyiapan untuk AWS, dll. Orang-orang ini memiliki pengalaman bertahun-tahun.
Sumber daya hebat lainnya adalah planet-mysql , tentu saja.
sumber
tuning primer
, bagaimana cara membandingkannyamysqltuner
?Kami menggunakan pengaturan ini:
untuk server dengan spesifikasi sebagai berikut:
sumber
Penggunaan memori database adalah topik yang kompleks. The MySQL Kinerja Blog melakukan pekerjaan yang baik yang meliputi pertanyaan Anda, dan daftar banyak alasan mengapa hal itu sangat tidak praktis untuk memori "cadangan".
Jika Anda benar-benar ingin memaksakan batasan keras, Anda dapat melakukannya, tetapi Anda harus melakukannya di tingkat OS karena tidak ada pengaturan bawaan. Di linux, Anda dapat menggunakan ulimit , tetapi Anda mungkin harus memodifikasi cara MySQL memulai untuk menerapkannya.
Solusi terbaik adalah menurunkan server Anda, sehingga kombinasi dari pengaturan memori MySQL biasa akan menghasilkan penggunaan memori yang lebih rendah secara umum oleh instalasi MySQL Anda. Ini tentu saja akan berdampak negatif pada kinerja database Anda, tetapi beberapa pengaturan yang dapat Anda atur
my.ini
adalah:Saya akan mulai dari sana dan melihat apakah Anda bisa mendapatkan hasil yang Anda inginkan. Ada banyak artikel di luar sana tentang menyesuaikan pengaturan memori MySQL.
Edit:
Perhatikan bahwa beberapa nama variabel telah berubah di rilis 5.1.x MySQL yang lebih baru .
Sebagai contoh:
Sekarang:
sumber
mysqld.exe menggunakan 480 mb di RAM. Saya menemukan bahwa saya menambahkan parameter ini ke my.ini
yang mengurangi penggunaan memori dari 400.000+ kb menjadi 105.000 kb
sumber
di
/etc/my.cnf
:Kerja bagus di server dengan Memori 256MB.
sumber
table_definition_cache
= 0? Beberapa penjelasan akan menyenangkan. Dan pada dasarnya Anda tidak menyimpan kueri dalam cache ... efek yang sama jika Andaquery_cache_type = 0
:)Jika Anda mencari untuk mengoptimalkan kontainer mysql buruh pelabuhan Anda maka perintah di bawah ini dapat membantu. Saya dapat menjalankan kontainer buruh pelabuhan mysql dari 480mb default menjadi hanya 100 mbs
buruh pelabuhan menjalankan -d -p 3306: 3306 -e MYSQL_DATABASE = uji -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = uji -e MYSQL_PASSWORD = uji -v / mysql: / var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password
sumber