Artikel ini dapat digunakan, disalin, dan disebarluaskan. Cukup cantumkan sumber asli. Jika isinya mengandung kebenaran, semoga memberi kebaikan bagi kita yang memanfaatkannya. Jika ada yang salah, mohon kiranya penulis dimaafkan. Dan sangat baik, jika kesalahan tersebut dapat diberitahukan kepada penulis.
Yanmarshus, 3 Agustus 2009, yan[at]daunsalam[dot]net

Catatan Ringan Tentang Pengujian MySQL Secara Sederhana

Mengapa pengujian ini saya lakukan, tak jelas benar alasannya. Setidaknya bagi yang tersasar sampai di halaman ini, ada beberapa paragraf yang bisa dikunyah-kunyah. Kalau terasa enak, bisa dinikmati. Andai sebaliknya, mohon maaf jika pembaca budiman merasa rugi.

Pengujian ini sederhana. Melakukan insert sejumlah data ke dalam sebuah tabel pada database MySQL. Tabel yang menjadi tempat menyimpan data juga dalam bentuk sederhana. Dua field, satu berupa primary key autoincrement, satu field lagi adalah varchar. Insert data melalui sebuah script PHP. Untuk mengisi sejumlah data, dilakukan proses insert query dalam loop. Pengujian dilakukan 6 kali dengan concurrent connection yang berbeda.

Seperti apa barang yang terlibat dalam pengujian ini? Nah ini daftarnya :

Tidak ada pengaturan khusus pada file konfigurasi MySQL. Hanya mengisi opsi max_connections = 500. Kemudian pada file php.ini untuk interpreter PHP, timeout untuk mysql connection diset jadi -1 (tidak terbatas)

Ada dua buah tabel yang digunakan dalam pengujian ini. Satu tabel untuk tempat data yang diinsert. Satu tabel sebagai pencatat lamanya waktu yang digunakan dalam pengujian. Struktur tabel sebagai berikut :

CREATE TABLE data (
  id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  isi VARCHAR(100) NOT NULL DEFAULT '',
  PRIMARY KEY (id)
)

CREATE TABLE waktu (
  id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  apa CHAR(1) NOT NULL DEFAULT '',
  nomor TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
  ts INT(10) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY (id)
)

Keterangan field pada tabel waktu. Field apa berisi data untuk catatan waktu mulai atau waktu selesai. Apabila field apa diisi "m" artinya waktu mulai, dan jika diisi "s" adalah waktu selesai. Field nomor berisi informasi pengujian yang ke berapa. Field ts berisi timestamp dari waktu.

Berikut ini adalah script PHP yang digunakan untuk melakukan loop insert data ke dalam tabel data. File untuk script ini diberi nama myt.php

<?php

$pengujianke = $argv[1];
$jloop = $argv[2];

$dbid = mysql_connect("192.168.1.33","aku","aku") or die(mysql_error());
mysql_select_db("tes") or die(mysql_error());

// menunggu sampai ada file bendera
while (!file_exists("bendera")) usleep(200);

// catat waktu mulai melakukan loop
$sql = "INSERT INTO waktu (apa,nomor,ts) " .
       "VALUES('m','$pengujianke',UNIX_TIMESTAMP())";
$hsl = mysql_query($sql) or die(mysql_error());

// loop untuk mengisi data
for ($i = 0; $i < $jloop; $i++) {
    $sql = "INSERT INTO data (isi) VALUES('abcdefghijklmnopqrstuvwxyz')";
    $hsl = mysql_query($sql) or die(mysql_error());
}

// catat waktu selesai melakukan loop
$sql = "INSERT INTO waktu (apa,nomor,ts) " .
       "VALUES('s','$pengujianke',UNIX_TIMESTAMP())";
$hsl = mysql_query($sql) or die(mysql_error());

// proses loop selesai, tulis ke file bendera
exec ('echo "ok" >> bendera');

// menunggu sampai file bendera tidak ada
while (file_exists("bendera")) usleep(200);

?>

Untuk menjalankan script PHP di atas, dilakukan melalui sebuah shell script, seperti di bawah ini. File shell script ini diberi nama mytrun.sh

#! /bin/bash

rm -f bendera
I=0
C=$2
while [ $I -lt $C ]; do
    /usr/local/bin/php -f /home/tes/myt.php $1 $3 &
    let I=$I+1
done
touch bendera
E="$C bendera"
while [[ $E != `wc -l bendera` ]]; do
    sleep 1
done

Shell script ini berguna untuk memanggil file PHP sebanyak yang diinginkan, sehingga menciptakan concurrent connection ke MySQL. Pada script PHP ada proses menunggu, sampai ada sebuah file yang diberi nama bendera. Jika file bendera sudah ada, baru loop insert dijalankan, untuk memastikan bahwa proses insert berjalan dalam keadaan MySQL sedang menerima sejumlah n koneksi secara bersamaan.
File bendera ini dibuat setelah n buah script PHP dijalankan.
Setelah loop selesai dikerjakan dalam script PHP, script tersebut mengisi status ke dalam file bendera. Kemudian juga ada proses menunggu sampai file bendera ini dihapus, baru script PHP berhenti, yang artinya juga memutuskan koneksi ke MySQL. File bendera dihapus oleh shell script setelah memeriksa bahwa jumlah OK dalam file bendera sama dengan jumlah script PHP dijalankan, yang artinya semua loop telah selesai dijalankan.

Sebelum pengujian dilakukan, tabel data dan waktu dalam keadaan kosong. Pengujian dilakukan dengan menjalankan script PHP pada laptop. Script PHP melakukan koneksi dan mengisi data ke MySQL yang ada pada komputer satu lagi.
Untuk melakukan pengujian dengan menjalankan file mytrun.sh seperti berikut
./mytrun.sh 1 100 10000
Artinya menjalankan tes pertama dengan 100 concurrent connection dan loop pengisian data sebanyak 10.000. Hasilnya adalah insert 1.000.000 data.
Menjalankan seperti berikut
./mytrun.sh 2 50 20000
Artinya menjalankan tes kedua dengan 50 concurrent connection dan loop pengisian data sebanyak 20.000. Hasilnya adalah insert 1.000.000 data.

Pengujian dilakukan sebanyak 6 kali, yaitu :
./mytrun.sh 1 100 10000
./mytrun.sh 2 50 20000
./mytrun.sh 3 20 50000
./mytrun.sh 4 10 100000
./mytrun.sh 5 5 200000
./mytrun.sh 6 1 1000000
Untuk pengujian ke-6 tidak dilakukan melalui laptop, tetapi di komputer yang sama dengan MySQL berjalan. Jadi proses insert langsung dengan 1 script PHP, loop sebanyak 1.000.000

Berikut ini adalah waktu yang diperlukan untuk masing masing pengujian. Setiap pengujian mengisi sebanyak 1.000.000 data. Angka insert/detik diperoleh melalui jumlah data dibagi waktu.

---------------------------------------------
pengujian ke  :  waktu(detik)  : insert/detik
---------------------------------------------
    1                425             2.352
    2                171             5.847
    3                101             9.900
    4                102             9.803
    5                 95            10.526
    6                 57            17.543
---------------------------------------------

Sebagai tambahan, secara tak sengaja, dan juga tanpa rencana dari awal, saya mengamati monitoring yang dilakukan oleh conky pada komputer dimana MySQL dijalankan. Pada saat concurrent connection dibuat sebanyak 100, processor hanya berjalan sekitar 20% sampai 30%. Tetapi ketika concurrent connection diturunkan pada 10, processor berjalan sampai 100%. Memory tidak mengalami perubahan signifikan di antara 6 percobaan tersebut, yaitu digunakan sekitar 140 MB. Bagian yang menarik adalah pada grafik kecepatan data yang melalui ethernet card. Silahkan dimaknai sesuai penglihatan pembaca sekalian.


untuk melihat gambar lebih besar, klik kanan pada gambar, lalu pilih view image
dengan catatan anda pakai firefox versi 2. kalau browser lain, cari sendiri caranya :-)


Seperti di awal tulisan ini, saya tidak tidak punya maksud spesial dengan pengujian yang tidak bisa dipertanggungjawabkan secara ilmiah ini :p Semoga data yang dihasilkan memberi manfaat. Kesimpulan? Silahkan dibuat dalam kepala masing-masing.