Mysql Optimizasyonu Ayarları

ByCrauSeRs

Kıdemli Üye
22 Eyl 2007
2,641
9
THT KaLıcı KonutLarı
Optimizasyon ayarlarınızı yapmadan önce my.cnf u yedeklemeyi unutmayınız.

Kod:
Mysql Optimizasyonu Ayarları 

Yoğun siteler için mysql sunuclarında dikkat etmemiz gereken değişkenler var. Ancak bu değişkenlerle oynarken sistemin kullandığı ram oldukça yükselebilir swap’e geçebilir böylelikle makinayı kilitleyebiliriz. Azar azar artırıp testler yaparak değişkenlerin değerlerini analiz edip gerekli değişiklikleri yapmak gerekir. 

Performasn artırmak için işimize en çok yarayacak değişkenler: 

table_cache 
key_buffer_size 
query_cache_size 
tmp_table_size 
max_connections 
wait_timeout 
thread_cache_size 
table_cache 

Hali hazırda kullanılan değerleri mysql komut satırından SHOW STATUS komutu ile yada komut satırından 

mysqladmin –i10 processlist extended-status 

komutu ile listeleyebiliriz. İhtiyacımıza göre bu değerleri /etc/my.cnf den set edebiliriz. 

1) Eğer opened_tables değeriniz yüksekse mutemelen table_cache değeriniz oldukça düşüktür. 

table_cache 64 
Open_tables 64 
Opened_tables 544468 

table_cache tüm thread’lerdeki açık tablo sayısıdır. Mysql multi-threaded olduğundan tablodaki birçok sorguyu aynı anda çalıştırıyor olabilir ve bunların her biri yeni bir tablo açacaktır. Bu nedenle bir kaç tablomuz olmasına rağmen daha fazla open_table ihtiyacımız olacaktır. 

opened_tables değerinin yüksek olması bize daha fazla cache ihtiyacımız olduğunu gösterir. 
Performansı artırıcı en öenemli şeylerden bir tanesi table_cache değerini yükseltmek olacaktır. 

2) Eğer key_reads değeriniz yüksekse muhtemelen key_buffer_size değeriniz çok düşüktür. Cache hit oranı Key_reads ve key_read_requests değerleriyle hesaplanabilir. 

key_buffer_size 16M 
Key_read_requests 2973620399 
Key_reads 8490571 
(cache hit rate = 0.0028) 

key_buffer_size, index buffer larının boyutunu ve okuma işlemi için index handle etme hızını etkiler. Mysql manuelinde de belirttiği gibi 

Key_reads/Key_read_request oranı 0.01 değerinden düşük olmalıdır. 

Ayrıca key_writes ve key_writes_request değerlerine de dikkat etmek gerekir. 

key_writes/key_writes_request oranı 1 den küçük olmalıdır. 

3) Wait_timeout, max_connection, thread_cache değerleri 

Sleeping modunda uyuyan birçok process mevcut çünkü default olarak wait_timeout değeri oldukça yüksek. wait_timeout değerini iyice düşürürsek örneğin 30 saniyeye böylelikle mysql 30 saniye boşta kalan bağlantıları kapayacaktır. 

Yoğun sunucularda Max_connection değerini de yükseltmemiz gerekecektir. Şu anda benim sunucumuzda set ettiğim değer 750. Idle client ların boşu boşuna boşuna tuttukları bağlantılar, yeni bağlantı isteği yapan client ları engelleyebilir. Max_connection değerini artırarak bundan kaçınabiliriz. 

Mysql multi-threaded olduğundan sunucu yeni threadler yaratacaktır. Bu da CPU zamanından oldukça çalacaktır. Bu problemin önüne geçmek için Thread_cache değişkeninden faydalanabiliriz. 

Mysql manuelinde de belirttiği gibi 

Kaç adet thread ‘i tekrar kullanım için cahce de tutmalıyız? Bir client disconnect olduğunda client ‘ın thread leri eğer thread_cache_size değeri kadar thread önceden kalmadıysa cache de tutulur . Tüm yeni thread ler en önce cache den alınır. Ve yanlız cache boş olduğunda yeni bir thread yaratılır. Eğer çok sayıda yeni bağlantı isteği (connection attemp) oluyorsa bu değişken performans artırımı için kullanılabilir. (Normalde iyi bir thread implementasyonunuz varsa çokda kayda değer bir peformasn kazanımı sağlamaz). Connections ve Threads_created değerlerini kıyaslayarak varolan thread cache inizin verimini gözlemleyebilirsiniz. 

Threads_created değeri yüksekse thread_cache_size değişkeninin artırmayı düşünebiliriz. 
Cache hit rate , threads_created/Connections ile hesaplanabilir. 

Threads_created/Connections. 
thread_cache_size 0 
Threads_created 150022 
Connections 150023 

thread_cache_size değeri my-large.cnf de 8 mb olarak önerilmiş. Biz alttaki formülü uygulayabiliriz. 

table_cache = opened table / max_used_connection 

4) tmp_table_size and Handler_read_rnd / Handler_read_rnd_next 

Created_tmp_disk_tables değeri yüksekse tmp_table_size değişkeninin değerini artırmayı düşünebilirsiniz. Böylelikle temporary (geçici) tabloları diskte oluşmaktansa memory üzerinde oluşmasını sağlamış oluruz. 

tmp_table_size 32M 
Created_tmp_disk_tables 3227 
Created_tmp_tables 159832 
Created_tmp_files 4444 

Created_tmp_disk_tables değeri statement lar çalıştırılırken disk üzerinde yaratılan temporary tabloların sayısıdır. Created_tmp_tables ise memory üzerinde yaratılanlardır. 
Memory de yaratmak varken disk üzerinde yaratmak kötü bir durum. tmp_tables ın %2 kadarı diske giderse o kadar da kötü değil aslında. Yinde de tmp_table_size değerini artırmak fena fikir değil. 

Handler_read_rnd çok yüksekse muhtemelen Mysql in tüm tabloları taramasını gerektirecek çok sayıda sorgunuz var ya da key ‘leri doğru dürüst kullanamayan Join ‘leriniz var demektir. 
Handler_read_rnd 27712353 
Handler_read_rnd_next 283536234 

Örneğin üstteki değerler yüksek. Indexlerimizi ve sorgularımızı gözden geçirmemiz gerekiyor olabilir. 

Son olarak değerleri çok yüksek değerlere almamanı gerekir. Sistemin çkmesine neden olabilirsiniz. Azar azar artırarak denemeler yapmalı , değişkenlerde gödrdüğünüz değerlere göre analiz yapmalısınız. 

Örneğin Max_conneciton değeri artırıldığında ram kullnımı oldukça artacaktır. Max_connections hesabı için 

Used MySQL memory = key_buffer + max_connections * (join_buffer + sort_buffer + thread_stack + tmp_table_size) 

Bir de table_cache değerini artırırken dikaktli olmak gerekir. Çoğu işletim sistemi “open file descriptors” sayısını limitler. Mysql bir çok dosyayı açmak istediğinde işletim sistemi bu işlemi red edebilir. 

Tüm bu bilgileri öğrenmemi sağlayan InterWorx ‘dan Pascal’a teşekkürler. 

Tüm bu bilgilerin ışığında benim sunucumda yaptığım ve gayet memnun kaldığım ayarlar. 

Benim mysql sunucum için yaptığım ayarlar : 

# The MySQL server 
[mysqld] 
key_buffer = 384M 
max_allowed_packet = 8M 
table_cache = 1024 
sort_buffer_size = 2M 
read_buffer_size = 2M 
read_rnd_buffer_size = 8M 
myisam_sort_buffer_size = 64M 
thread_cache_size = 8 
query_cache_size = 32M 


optimizasyon 
2 adet Xeon 2.8 cpu bulunan 2 gb ram sunucuda denenmiştir .
 

burgutex

Yeni üye
17 Haz 2009
1
0
çok güzel bir çalışma olmuş teşekkürler... bir sorum olacak. benim bir forum hazırlığım var; vBulletin. Oldukça bol konu başlığı açtım. Belli bir zamanın sonunda database hatası veriyor. database oluşturmada belirli bir limit var mı kb cinsinden? phpmyAdmin üzerinden tablo onarımlarını filan denedim. SQL sorunsuz çalıştırıldı diyor. Ancak optimizasyon seçeneğinde mysql uçuyor. Eğer database depolama limiti varsa (storage limit) ek bir database eklememizin olanağı var mı? teşekkür ederim.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.