Pythontr

husonet | Tarih: 09.02.2018

MariaDB ve MySQL için table_open_cache

MySQL ve MariaDB sistem kaynaklarını oldukça fazla tüketir table_open_cache de bunlardan biridir.

Bir çok sistemde olduğu MariaDB ve MySQL için cachleme değişkenleri verilere hızlı bir şekilde erişmemizi sağlar fakat bunları optimize etmeyi bilmek veritabanının kaynaklarını az tüketmesi için çok gereklidir. Biz bu optimizasyonlarıda sistem kaynaklarını az tüketmek için kendi sistemlerimize uyguluyoruz.


Bugün iki sistem değişkenin nasıl hesaplandığını inceleyeceğiz bunlar table_open_cache ve open_files_limit değişkenleridir. Şimdi sırasıyla table_open_cache değişkenini ele alalım.


table_open_cache


opened_tables sistem verisini kontrol ederek tablo önbelleğini artırmanız gerekip gerekmediğini kontrol edebilirsiniz. Açılan tablolarınızın değeri çok yüksekse ve genelde FLUSH TABLES'ı kullanmıyorsanız (tüm tabloları kapatmaya ve yeniden açmaya zorlarsınız),, o zaman table_open_cache değişkeninin değerini yükseltmelisiniz. MariaDB ve MySQL veritabanlarında table_open_cache'yi optimize etmek için birçok faktörü düşünmelisiniz. Bununla birlikte, bunlar bu değişkenin ayarlanıp ayarlanamayacağına karar vermek için genel prosedürdür.


open_tables ve opened_tables şu anki değerlerini tespit edelim
MariaDB [(none)]> show global status  like 'open%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Open_files | 19 |
| Open_streams | 0 |
| Open_table_definitions | 65 |
| Open_tables | 90 |
| Opened_files | 918 |
| Opened_plugin_libraries | 1 |
| Opened_table_definitions | 132 |
| Opened_tables | 233 |
| Opened_views | 52 |
+--------------------------+-------+
9 rows in set (0.01 sec)

Tablo önbellek isabet oranını tespit edelim
SELECT *, (Open_tables * Uptime / Opened_Tables) OpenTableFactor FROM (SELECT variable_value Uptime FROM information_schema.global_status WHERE variable_name = 'Uptime_since_flush_status') up, (SELECT variable_value Open_tables FROM information_schema.global_status WHERE variable_name = 'Open_tables') opn, (SELECT IF(variable_value=0,1,variable_value) Opened_tables FROM information_schema.global_status WHERE variable_name = 'Opened_tables') opnd;
+--------+-------------+---------------+-------------------+
| Uptime | Open_tables | Opened_tables | OpenTableFactor |
+--------+-------------+---------------+-------------------+
| 19486 | 73 | 1229 | 1157.427176566314 |
+--------+-------------+---------------+-------------------+
1 row in set (0.01 sec)


Yukarıda yazdığımız SQL i ara ara çalıştırdığımız zaman OpenTableFactor aniden düşerse (az bile olsa), daha düşük trafik kalıpları, yüksek kesintili konjenasyonlar ve benzeri şeyleri gösterebilir. OpenTableFactor asla değişmezse (biraz olsa bile), bu ayarları değiştirmek için bir fırsat sunabilir:


Diğer bir seçenek olarak isabet oranını aşağıdaki formulle hesaplayabilirsiniz.


Table cache hit rate = table_open_cache*100/Opened_tables.

Sonuç genel olarak% 50'den fazla olmalı. Bu nedenle, table_open_cache değerini yükseltmeniz gerekebilir; ancak, FLUSH TABLES kullanarak tüm açık tabloları kapatabilir ve Opened_tables değerleri sıfırlayabilirsiniz.


Ayrıca table_open_cache sistem değişkeninin tam ve düzgün şekilde ayarlandığından emin olamayabilirsiniz. Şimdi MySQL tablo_open_cache değişkenini optimize etmemiz ve bunun için mükemmel bir değer bulmamız gerekiyor. Artık table_open_cache değerini bulmak için aşağıdaki adımlara başlayalım:


Veritabanı toplam tablo sayısı
MariaDB [(none)]> SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE';
+----------+
| COUNT(*) |
+----------+
| 278 |
+----------+
1 row in set (0.02 sec)

Threads bağlantılarını görelim
MariaDB [(none)]> show global status like '%Threads_connected%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 9 |
+-------------------+-------+
1 row in set (0.01 sec)

Veritabanınızın en yoğun saatinde ortalama bir değer belirlemek daha net sonuçlara bizi ulaştırabilir.


table_open_cache ayar değerini hesaplanması


table_open_cache = total_tables*Threads_connected
= 278*9
= 2502

Kullanıcıların genelikle tüm tablolara erişmediğini göz önüne alarak hesaplanan değerin yuzde 50 sini belirlemek daha yerinde olur. Genel olarak tercih edilen formulde budur.


Table_open_cache = total_tables*Threads_connected*0.50

table_open_cache = total_tables*Threads_connected*0.50
= 278*9*0.50
= 1251

open_files_limit sistem değişkeni


table_open_cache ile birlikte open_files_limit sistem değişkenini de ayarlamamız gerekir.


Genel olarak table_open_cache değerinin iki katı olur.


open_files_limit= Table_open_cache*2

open_files_limit dinamik bir değişken değildir. Bu yüzden /etc/mysql/my.cnf dosyasında yada /lib/systemd/system/mariadb.service ayarlamalı ve Veritabanı'i yeniden başlatılmalıdır.


MySQL sistemler için
vim /etc/mysql/my.cnf
table_open_cache=1251
open_files_limit=2502

/etc/init.d/mysql restart


MariaDB sistemler için
vim /etc/mysql/my.cnf
table_open_cache=1251

vim /lib/systemd/system/mariadb.service
LimitNOFILE=2502

service mariadb restart