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.
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.
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)
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:
MariaDB [(none)]> SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'; +----------+ | COUNT(*) | +----------+ | 278 | +----------+ 1 row in set (0.02 sec)
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 = 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
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.
vim /etc/mysql/my.cnf table_open_cache=1251 open_files_limit=2502
/etc/init.d/mysql restart
vim /etc/mysql/my.cnf table_open_cache=1251
vim /lib/systemd/system/mariadb.service LimitNOFILE=2502
service mariadb restart
Yorumlar