MySQL andmebaasi jõudluse parandamine: Difference between revisions
(17 intermediate revisions by 2 users not shown) | |||
Line 10: | Line 10: | ||
A22<br /> | A22<br /> | ||
[mailto:sistomin@itcollege.ee sistomin@itcollege.ee] | [mailto:sistomin@itcollege.ee sistomin@itcollege.ee] | ||
==MySQL ja OOM killer== | |||
MySQL protsessi saab kaitsta OOM killerei eest järgneva korralduse abil. | |||
<source lang="bash"> | |||
echo "-1000" > /proc/$(pidof mysqld)/oom_score_adj | |||
</source> | |||
Vanemate kernelitega (enne 3.X võib pruukida oom_adj faili) | |||
<source lang="bash"> | |||
echo "-17" > /proc/$(pidof mysqld)/oom_adj | |||
</source> | |||
http://www.kernel.org/doc/Documentation/filesystems/proc.txt | |||
=InnoDB MySQL-is= | =InnoDB MySQL-is= | ||
Line 66: | Line 82: | ||
Kasutaja peaks kasutama <b>Thread_cache</b>: | Kasutaja peaks kasutama <b>Thread_cache</b>: | ||
"Kui palju threade peaks vahemällu jätma uuesti kasutamiseks. Kui klient katkestab ühenduse, siis kliendi threadid pannakse<br /> vahemällu kui seal pole rohkem | "Kui palju threade peaks vahemällu jätma uuesti kasutamiseks. Kui klient katkestab ühenduse, siis kliendi threadid pannakse<br /> vahemällu kui seal pole rohkem <b>Thread_cache_size</b> threade ennem. Kõik uued threadid on võetud vahemälust ja ainult siis kui vahemälu on tühi, siis luuakse uus thread. <br /> | ||
Muutuja väärtust saab tõsta, et parandada jõudlust kui kasutajal on palju uusi ühendusi.<br /> | Muutuja väärtust saab tõsta, et parandada jõudlust kui kasutajal on palju uusi ühendusi.<br /> | ||
*Kui Threads_created on suure väärtusega, siis peab kasutaja suurendama <b> | *Kui <b>Threads_created</b> on suure väärtusega, siis peab kasutaja suurendama <b>Thread_cache_size</b> muutuja väärtusi.<br /> | ||
Vahemälu koefitsenti saab arvutada järmiselt:<br /> | Vahemälu koefitsenti saab arvutada järmiselt:<br /> | ||
<b>Threads_created/Connections.</b><br /> | <b>Threads_created/Connections.</b><br /> | ||
Line 76: | Line 92: | ||
<b>Connections: 150023</b><br /> | <b>Connections: 150023</b><br /> | ||
Vahemälu suurus väärtusega 0 on vaikimiselt määratud my.cnf failis aga soovitatud suurus on 8.<br /> | |||
Seda saab kalkuleerida järgmise valemiga: <b>table_cache = opened table / max_used_connection</b><br /> | Seda saab kalkuleerida järgmise valemiga: <b>table_cache = opened table / max_used_connection</b><br /> | ||
*Viimseks tuleks vaadata: <b>tmp_table_size</b> ja <b>Handler_read_rnd / Handler_read_rnd_next</b><br /> | *Viimseks tuleks vaadata: <b>tmp_table_size</b> ja <b>Handler_read_rnd / Handler_read_rnd_next</b><br /> | ||
*Kui <b>Created_tmp_disk_tables</b> on liiga suure väärtusega, siis tuleks suurendada <b>tmp_table_size</b> muutujad.<br /> | |||
*Kui Created_tmp_disk_tables on liiga suure väärtusega, siis tuleks suurendada tmp_table_size muutujad.<br /> | |||
<b>Tmp_table_size:</b> 32M<br /> | <b>Tmp_table_size:</b> 32M<br /> | ||
<b>Created_tmp_disk_tables:</b> 3227<br /> | <b>Created_tmp_disk_tables:</b> 3227<br /> | ||
Line 88: | Line 103: | ||
<b>Created_tmp_files:</b> 4444<br /> | <b>Created_tmp_files:</b> 4444<br /> | ||
<b>Created_tmp_disk_tables</b> on arv varjatud ajutisi tabeleid, mis on loodud kettale samalajal käivitades lauseid ja<br /> <b>Create_tmp_tables</b> on mälu põhjal. Ilmselt on see halb kui peab minema ketta kallale mälu asemel. Umbes 2% <b>temp tables </b>lähvad kettale, mis | <b>Created_tmp_disk_tables</b> on arv varjatud ajutisi tabeleid, mis on loodud kettale samalajal käivitades lauseid ja<br /> <b>Create_tmp_tables</b> on mälu põhjal. Ilmselt on see halb kui peab minema ketta kallale mälu asemel. <br />Umbes 2% <b>temp tables </b>lähvad kettale, mis peaks olemas olema aga tõstes <b>tmp_table_size</b> väärtust oleks oluline jõudlusele.<br /> | ||
*Kui <b>Handler_read_rnd</b> on väärtuse poolest liiga suur, siis on ilmselt andmebaasis palju päringuid, mis vajavad MySQL-il | |||
skaneerida kõiki tabeleid või on andmebaasis JOIN lauseid, mis ei kasuta oma võtmeid korralikult.<br /> | |||
*Kui <b>Handler_read_rnd</b> on väärtuse poolest liiga suur, siis on ilmselt andmebaasis palju päringuid, mis vajavad MySQL-il | |||
skaneerida kõiki tabeleid või on andmebaasis JOIN | |||
<b>Handler_read_rnd:</b> 27712353<br /> | <b>Handler_read_rnd:</b> 27712353<br /> | ||
<b>Handler_read_rnd_next:</b> 283536234<br /> | <b>Handler_read_rnd_next:</b> 283536234<br /> | ||
Need väärtused on liiga suured, seega peab ilmselt parandama indexeid ja päringuid.<br /> | Need väärtused on liiga suured, seega peab ilmselt parandama indexeid ja päringuid.<br /> | ||
*Täielik mälu kasutus<br /> | *Täielik mälu kasutus<br /> | ||
Kasutatud MySQL-i mälu = <b>key_buffer</b> + <b>max_connections</b> * (<b>join_buffer</b> + <b>record_buffer</b> + <b>sort_buffer</b> + <b>thread_stack</b> + <b>tmp_table_size</b>)<br /> | Kasutatud MySQL-i mälu = <b>key_buffer</b> + <b>max_connections</b> * (<b>join_buffer</b> + <b>record_buffer</b> + <b>sort_buffer</b> + <b>thread_stack</b> + <b>tmp_table_size</b>)<br /> | ||
*Kui InnoDB mootor peaks olema peal:<br /> | *Kui InnoDB mootor peaks olema peal:<br /> | ||
Line 112: | Line 122: | ||
<b>Table_cache:</b><br /> | <b>Table_cache:</b><br /> | ||
Suurendades <b>Table_cache</b> parameetrit aitab suurendada jõudlust.<br /> | Suurendades <b>Table_cache</b> parameetrit aitab suurendada jõudlust.<br /> | ||
Siin peab ettevaatlik olema, et parameetri väärtus ei läheks väga suureks. Kõigil operatsioonisüsteemidel on olemas arvu limiit "Open file pointer" mida omab iga üksik protsess. | Siin peab ettevaatlik olema, et parameetri väärtus ei läheks väga suureks. Kõigil operatsioonisüsteemidel on olemas arvu limiit "Open file pointer" mida omab iga üksik protsess.<br /> | ||
Kui MySQL proovib avada palju faile, siis OS võib keelduda ja MySQL genereerib veateate vealogi sisse. | Kui MySQL proovib avada palju faile, siis OS võib keelduda ja MySQL genereerib veateate vealogi sisse. | ||
=Kasutatud kirjandus= | |||
[http://dev.mysql.com/doc/refman/5.5/en/innodb-configuration.html InnoDB Configuration]<br /> | |||
[http://cherry.world.edoors.com/Cw9QcpkgQwVQ OPTIMISING MYSQL]<br /> | |||
[http://dev.mysql.com/doc/refman/5.5/en/slow-query-log.html The Slow Query Log]<br /> | |||
[http://www.mysqlperformanceblog.com/?s=key_buffer_size MySQL Performance Blog]<br /> | |||
=Uued asjad mida uurida= | |||
http://www.mysqlperformanceblog.com/2008/11/24/how-percona-does-a-mysql-performance-audit/ | |||
http://linuxadminzone.com/speed-up-large-mysql-backup-dump-restore-process/ | |||
[[Category:Operatsioonisüsteemide administreerimine ja sidumine]] | [[Category:Operatsioonisüsteemide administreerimine ja sidumine]] |
Latest revision as of 14:21, 13 November 2012
Sissejuhatus
Selles peatükis keskendutakse MySQL-i andmbeaasi jõudluse parandamisega. Peamiselt kirjeldatakse konfiguratsiooni failis olevad
muutujad ja nende suurused. MySQL andmebaasi konfiguratsiooni fail asub kaustas:
/etc/mysql/my.cnf
Selles failis võib muuta mälu, tabelite ja internti ühenduste piiranguid ja teisi võimalike muutusi lisada.
Tehnilised näitajad: MySQL 5.5 versioon
Autor
Sergei Istomin
A22
sistomin@itcollege.ee
MySQL ja OOM killer
MySQL protsessi saab kaitsta OOM killerei eest järgneva korralduse abil.
echo "-1000" > /proc/$(pidof mysqld)/oom_score_adj
Vanemate kernelitega (enne 3.X võib pruukida oom_adj faili)
echo "-17" > /proc/$(pidof mysqld)/oom_adj
http://www.kernel.org/doc/Documentation/filesystems/proc.txt
InnoDB MySQL-is
InnoDB on talletamise mootor MySQL-i andmebaasi jaoks. InnoDB on oma funksionaalsuse poolest kõige eelistatum mootor, kuna InnoDB
mootor võimaldab teha andmete taastamist ja süsteemi kokkujooksmised salvestatakse logi failidesse.
InnoDB salvestab andmete read füüsiliselt primaarsete võtmete järjekorras.
Rohkem lugemist leiab järgmiselt lingilt:InnoDB vs MyISAM
Kaks peamist ketta baasil manageeritud ressursi talletamist on InnoDB-s tema tabelite andme- ja logi failid.
Kui kasutaja ei spetsifitseeri InnoDB konfiguratsiooni sätteid, siis MySQL loob isiklikult auto-extending 10MB andmete faili
nimega idbata1 ja kaks 5MB log faili nimega ib_logfile0 ja ib_logfile1 MySQL-i andmete kategoorias.
Et parandada jõudlust tuleks lisada InnoDB parameetritele kindlad väärtused, mis sobivad kasutaja raudvaraga kokku.
MySQL-i Optimeerimine
Kaks kõige tähtsamat muutujat my.cnf failis on: Table_cache and Key_buffer_size
- Kui Open_tables on väga suure mahuga, siis kindlasti on Table_cache muutuja väikse mahuga.
Ehk:
Table_cache: 64
Open_tables: 64
Opened_tables: 544468
Parameeter nimega table_cache on arv avatud tabeleid. MySQL on multi-threaditud ja võib joosta paljudel
päringutel samaaegselt ja iga üks nendest avab tabeli.
Seega kui kasutajal on paar tabelit, läheb temal vaja rohkem tabeleid opened_tables.
Opened_table väärtus on kõrge ja näitab vahemälus olevaid puudusi.
Muutes table_cache parameetri suurust parandab oluliselt jõudlust.
- Kui Key_reads on suure mahuga, siis key_buffer_size muutuja on ilmselt liiga väike.
Vahemälu jõudmise keskmist saab arvutada järmiselt:
Key_reads/Key_read_requests.
Key_buffer_size: 16M
Key_read_requests: 2973620399
Key_reads: 8490571
(cache hit rate = 0.0028)
Parameeter Key_buffer_size mõjutab indeksite puhvri suurust ja indexi käsitlemise aega.
Tavaliselt peaks Key_reads/Key_read_request koefitsent olema < 0.01.
Kindlasti tuleks kontrollida Key_writes_requests ja Key_writes
Key_writes/Key_writes_request peaks olema tavaliselt < 1 (0.5 väärtus sobib).
Teised tähtsad parameetrid
Järmisena tähtsad sätted on: Wait_timeout, max_connection ja thread_cache
Natukene seletust:
Tavaliselt on andmebaasis palju MySQL-i protsesse, mis niiöelda magavad sellepärast, et wait_timeout ei ole määratud suuruse
poolest väikseks. Kasutaja peaks kindlaks tegema, et wait_timeout on määratud väga väikesele väärtusele: 15 sekundit.
See tähendab, et MySQL katkestab kõik ühendused, mis ei olnud aktiivsed 15 sekundi jooksul.
Probleem seisneb selles, et järgmisena peaks tõstma max_connection parameetrit(igal kasutajal on oma väärtus), kuna paljud
ebaaktiivsed kasutajad ei hoiaks ühendused kinni ja ei blokeeriks välja uusi kliente ühendades andmebaasile.
Kasutaja peaks kasutama Thread_cache:
"Kui palju threade peaks vahemällu jätma uuesti kasutamiseks. Kui klient katkestab ühenduse, siis kliendi threadid pannakse
vahemällu kui seal pole rohkem Thread_cache_size threade ennem. Kõik uued threadid on võetud vahemälust ja ainult siis kui vahemälu on tühi, siis luuakse uus thread.
Muutuja väärtust saab tõsta, et parandada jõudlust kui kasutajal on palju uusi ühendusi.
- Kui Threads_created on suure väärtusega, siis peab kasutaja suurendama Thread_cache_size muutuja väärtusi.
Vahemälu koefitsenti saab arvutada järmiselt:
Threads_created/Connections.
Thread_cache_size: 0
Threads_created: 150022
Connections: 150023
Vahemälu suurus väärtusega 0 on vaikimiselt määratud my.cnf failis aga soovitatud suurus on 8.
Seda saab kalkuleerida järgmise valemiga: table_cache = opened table / max_used_connection
- Viimseks tuleks vaadata: tmp_table_size ja Handler_read_rnd / Handler_read_rnd_next
- Kui Created_tmp_disk_tables on liiga suure väärtusega, siis tuleks suurendada tmp_table_size muutujad.
Tmp_table_size: 32M
Created_tmp_disk_tables: 3227
Created_tmp_tables: 159832
Created_tmp_files: 4444
Created_tmp_disk_tables on arv varjatud ajutisi tabeleid, mis on loodud kettale samalajal käivitades lauseid ja
Create_tmp_tables on mälu põhjal. Ilmselt on see halb kui peab minema ketta kallale mälu asemel.
Umbes 2% temp tables lähvad kettale, mis peaks olemas olema aga tõstes tmp_table_size väärtust oleks oluline jõudlusele.
- Kui Handler_read_rnd on väärtuse poolest liiga suur, siis on ilmselt andmebaasis palju päringuid, mis vajavad MySQL-il
skaneerida kõiki tabeleid või on andmebaasis JOIN lauseid, mis ei kasuta oma võtmeid korralikult.
Handler_read_rnd: 27712353
Handler_read_rnd_next: 283536234
Need väärtused on liiga suured, seega peab ilmselt parandama indexeid ja päringuid.
- Täielik mälu kasutus
Kasutatud MySQL-i mälu = key_buffer + max_connections * (join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)
- Kui InnoDB mootor peaks olema peal:
max_memory_utilization = key_buffer_size + innoDB_buffer_pool_size + max_connections * (read_buffer_size + sort_buffer_size + binlog_cache_size) + max_connections * 2M
Siin tuleks tähelepanna max_connexion ja korrutamise teguri.
Ühenduse kasvamine = Mälu kasutamise suurendamist
Table_cache:
Suurendades Table_cache parameetrit aitab suurendada jõudlust.
Siin peab ettevaatlik olema, et parameetri väärtus ei läheks väga suureks. Kõigil operatsioonisüsteemidel on olemas arvu limiit "Open file pointer" mida omab iga üksik protsess.
Kui MySQL proovib avada palju faile, siis OS võib keelduda ja MySQL genereerib veateate vealogi sisse.
Kasutatud kirjandus
InnoDB Configuration
OPTIMISING MYSQL
The Slow Query Log
MySQL Performance Blog
Uued asjad mida uurida
http://www.mysqlperformanceblog.com/2008/11/24/how-percona-does-a-mysql-performance-audit/
http://linuxadminzone.com/speed-up-large-mysql-backup-dump-restore-process/