mysql

MySQL stres testleri için mysqlslap

Veritabanımızda performans testleri yapmak, tablolarda yaptığımız değişikliklerden elde ettiğimiz kazançlar ve negatif etkileri anlayabilmek için testler yapmaya ihtiyaç duyarız. Bu testleri kendi yazdığımız scriptler ile yapmaya çalıştığımızda genellikle bu çok basit ve yetersiz kalıyor. İşte bu noktada devreye “aklımı seveyim” modu geliyor. İlla herşeyi siz yapmak zorunda değilsiniz! Etrafınızdaki araçları iyi kullanırsanız amacınıza “çöplere” takılmadan […]

Veritabanımızda performans testleri yapmak, tablolarda yaptığımız değişikliklerden elde ettiğimiz kazançlar ve negatif etkileri anlayabilmek için testler yapmaya ihtiyaç duyarız. Bu testleri kendi yazdığımız scriptler ile yapmaya çalıştığımızda genellikle bu çok basit ve yetersiz kalıyor. İşte bu noktada devreye “aklımı seveyim” modu geliyor. İlla herşeyi siz yapmak zorunda değilsiniz! Etrafınızdaki araçları iyi kullanırsanız amacınıza “çöplere” takılmadan hızlıca erişirsiniz. Böylece ana konumuz olan “performans testlerine” hızlıca girebilicez…

Senaryomuz şöyle olsun;
Takım lideriniz kullandığınız “X” bir araç ile “abc” tablosunda “insert” lerin oldukça yavaş olduğu size bildirdi bunu nasıl çözersiniz?

Öncelikle siz bu senrayoyu yapabilmek için sunucudakine yakın insert denemeleri yapmalısınız bunun içinde bir bağlantıdan 100 insert değil 100 farklı bağlantıdan 1 – 10 vs.. sayıda insert denemesi oluşturmalısınız. Burda devreye aşağıda anlatacaklarımız giriyor.

mysqlslap‘ın yapabilecekleri;

1. Kendi üreteceği bir veritabanına sizin seçeceğiniz “engine” ile dump data girişi yapalabilir.
Bu sahte datanın ve oluşturulacak tablonun özelliklerini siz belirleyebiliyorsunuz. Mesela test yapılacak tablonun “MyISAM” olmasını veya “InnoDB” veya “MEMORY” olmasını siz belirliyorsunuz.

2. Farklı oturumlardan (session) dilediğiniz sayıda istekte bulunabilirsiniz. 
100 farklı kişi bağlanıp 10 istekte bulunsun diyebilirsiniz.

3. Seçtiğiniz bir veritabanına özel sorgu (query) gönderebilirsiniz.
“test” tablosuna yukarda 2. madde de belirtilen koşullarda şu sorgu çalışsın diyebilirsiniz. Bu “INSERT” olabilir “SELECT” olabilir. Burda bir kısıtlama yok istediğiniz şeyi yazabilirsiniz. Tamamen hayal gücünüze bağlı.
Mesela bir tabloya index koyu insert testi yapabilirsiniz. Sonra bu indexleri kaldırıp tekrar bakabilirsiniz. Teorik olarak okuyup duyduğunuz şeyleri pratikte en kolay şekilde test edebilirsiniz…

Bu işlemler sonucunda size bir rapor verilecek burda maksiumum, minumum ve ortalama sorguların çalıştırılma hızı yazıyor olacak.

Yukarda yazılanlar olayın teorik kısmıydı. Şimdi biraz pratik yapalım. İlk önce tamamen MySQL’i test etmeye yönelik deneme yapalım. Yani 1. madde.

$ mysqlslap --auto-generate-sql --host=localhost --password=root --socket=/Applications/MAMP/tmp/mysql/mysql.sock --concurrency=1 --iterations=1
Benchmark
 Average number of seconds to run all queries: 0.025 seconds
 Minimum number of seconds to run all queries: 0.025 seconds
 Maximum number of seconds to run all queries: 0.025 seconds
 Number of clients running queries: 1
 Average number of queries per client: 0

Yukardaki kodu çalıştırdığınızda yapılan işlemleri MySQL’in query log dosyaları kısmından görebilirsiniz.
Yukardaki komuta aşağıdakileri ekleyerek fieldleri atırmış oldum.

--number-int-cols=2 --number-char-cols=3

Default tablo şu iken

CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128))

Şimdi şu tablo oluşturuluyor

CREATE TABLE `t1` (intcol1 INT(32) ,intcol2 INT(32) ,charcol1 VARCHAR(128),charcol2 VARCHAR(128),charcol3 VARCHAR(128))

Kendi veritabanımızda özel query çalıştırmak istersek –create-schema ile db adını yazıp. –query parametresi ile sorgumuzu yazıyoruz.

$ mysqlslap --delimiter=";" --host=localhost --password=root --socket=/Applications/MAMP/tmp/mysql/mysql.sock --concurrency=10 --iterations=10 --create-schema=prd_db --query="INSERT INTO customer (email) VALUES (UUID());"

Bu rapora göre şimdi tablodan index vs.. kaldırıp tekrar “insert” hızını test edebilirsiniz.Ama aynı zamanda “SELECT” hızınıda kontrol edin. Böylece olayları daha iyi kavrayabilirsiniz.