Apa itu Zend Optimizer+ Di Zend Server?


Sebuah fakta yang tidak dapat dipungkiri adalah PHP kalah dari Java dalam hal kinerja bila dilihat dari sisi arsitektur kedua teknologi tersebut. Tapi beberapa mahasiswa yang baru belajar tampaknya sulit menerima fakta ini. Beberapa dari mereka yang kritis akan bertanya seperti “Startup server Java lebih lama dibanding PHP, kenapa Java bisa lebih kencang?” atau “Bukankah Java butuh lebih banyak memori dibanding PHP?” Apa yang mereka ungkapkan memang benar, tapi saat request dari pengguna web diproses, server berbasis Java memiliki peluang besar untuk menghasilkan respon lebih cepat. Mengapa demikian?

Alasan pertama, kode program Java di-compile terlebih dahulu menjadi bytecode (file class) oleh programmer-nya. Apa yang di-deploy ke server Java adalah hasil kompilasi (file class) dalam bentuk file jar, bukan kode program Java! Dengan demikian, server dapat langsung menjalankannya. Lalu bagaimana dengan PHP? Tidak ada compiler PHP yang perlu dipanggil oleh programmer PHP!! Programmer PHP langsung men-deploy aplikasi web dalam bentuk kode program PHP (file PHP). Oleh sebab itu, saat sebuah halaman PHP dibuka, maka kode program di file PHP tersebut perlu di-parse dan di-compile ke dalam bytecode sebelum bisa di-eksekusi oleh CPU.

Alasan kedua, server Java adalah sebuah container dimana seluruh objek yang masih berguna tetap ‘hidup’ dan dipakai lagi oleh objek lainnya. Berbeda dengan Java, file PHP akan kembali dikerjakan pada saat request diberikan dan setelah selesai dikerjakan, semuanya ‘lenyap’. Sebagai contoh, perhatikan kode program berikut ini:

<?php
class Counter {             
    public static $counter;     
}

print "Counter: " . ++Counter::$counter;    
?>

Keyword static menunjukkan bahwa property counter dapat diakses kapan saja selama class Counter ada. Bila saya menjalankan kode program PHP di atas berkali-kali, nilai $counter akan selalu 1. Hal ini karena setiap kali saya membuka halaman PHP tersebut, class Counter baru akan tercipta dan setelah mencapai akhir eksekusi, class Counter tersebut akan musnah. Satu-satunya cara untuk mempertahankan nilai adalah memakai session, teknologi caching seperti Memcache, atau menyimpan nilai ke database. Perilaku ini berbeda dengan Java: class Counter akan selalu ada di memori dan nilai counter tetap dapat diakses setiap saat (termasuk dari request berbeda). Sebagai konsekuensinya, server Java membutuhkan lebih banyak memori guna menampung object yang masih ‘hidup’.

Alasan ketiga, JVM yang dipakai untuk server Java biasanya memiliki fasilitas Just In Time (JIT) code generation. Saat bytecode Java di-eksekusi pertama kali, JIT akan melakukan analisa dan bila perlu akan mengubah bytecode tersebut menjadi instruksi mesin (native) yang dapat langsung dikerjakan oleh CPU. Hal ini menyebabkan lambatnya eksekusi bytecode untuk pertama kali, tetapi eksekusi selanjutnya menjadi jauh lebih cepat (setara dengan bahasa native di platform tersebut). PHP tidak memiliki fasilitas seperti ini. Untuk itu, Facebook mengembangkan HipHop Virtual Machine (HHVM) yang merupakan sebuah execution engine untuk PHP. HHVM adalah proyek open source yang dapat dilihat di https://github.com/facebook/hhvm dan telah dipakai oleh situs facebook.com sejak awal tahun 2013. HHVM memiliki JIT code generation. Facebook telah menciptakan ‘PHP virtual machine’ yang dapat dibandingkan dengan Java Virtual Machine (JVM)! Tapi ini adalah contoh kasus tidak lazim. Kebanyakan fans awam menggunakan PHP ‘biasa’ (Zend Engine) seperti pada konfigurasi XAMPP😉

Jadi, PHP akan selalu men-parse dan men-compile file PHP setiap kali ia dipanggil. Bila file PHP tersebut men-include file lainnya, maka file lain tersebut juga perlu di-parse dan di-compile. Bila saya memakai framework (seperti Zend Framework dan Symphony), kemungkinan akan ada banyak file yang harus di-include. Ini belum lagi ditambah fakta bahwa proses parsing dan kompilasi ke bytecode akan dikerjakan kembali setiap kali halaman diakses pengguna!!

Salah satu cara untuk menghindari hal tersebut adalah dengan memakai teknologi caching (sering juga disebut sebagai PHP accelerator) seperti Alternative PHP Cache (APC) dan Zend Optimizer+. Karena saya menggunakan Zend Server 6.2.0, saya sudah memperoleh fasilitas Zend Optimizer+. Sebagai informasi, Zend Optimizer+ sudah terintegrasi pada PHP 5.5 sehingga tidak perlu di-install secara terpisah lagi. Ia mengalami perubahan nama menjadi OPcache dimana informasi lebih lanjut dapat ditemukan di http://www.php.net/manual/en/intro.opcache.php.

Zend Optimizer+ akan menampung hasil kompilasi file PHP dalam bentuk bytecode di memori. Bila selanjutnya ada request ke file PHP tersebut, Zend Optimizer+ akan langsung mengerjakan bytecode yang sudah ada di memori tanpa harus melalui proses parsing dan kompilasi lagi.

Untuk memeriksa apakah Zend Optimizer+ sudah diaktifkan, saya akan masuk ke dashboard Zend Server dengan membuka URL http://localhost:10081. Setelah memilih menu Configurations, Components, saya akan menemukan status loaded di Zend Optimizer+ seperti yang terlihat pada gambar berikut ini:

Melihat status Zend Optimizer+ di Zend Server

Melihat status Zend Optimizer+ di Zend Server

Pada halaman ini, saya juga dapat melakukan pengaturan lebih lanjut untuk Zend Optimizer+ dengan men-klik panan bawah di ujung kanan komponen tersebut, seperti yang terlihat pada gambar berikut ini:

Pengaturan Zend Optimizer+ di Zend Server

Pengaturan Zend Optimizer+ di Zend Server

Zend Optimizer+ akan bekerja secara transparan tanpa campur tangan pengguna. Namun, ia menyediakan API accelerator_reset() dan accelerator_get_status() yang dapat dipakai di kode program untuk melakukan reset dan memantau statistik. Sebagai contoh, berikut ini adalah kode program PHP yang menampilkan statistik untuk Zend Optimizer+:

<html>
<body>
<?php
    $stats = accelerator_get_status();

    print "<h3>Penggunaan Memori Untuk Zend Optimizer+</h3>";
    $memoriDipakai = round($stats['memory_usage']['used_memory'] / 1024 / 1024);
    $memoriBebas = round($stats['memory_usage']['free_memory'] / 1024 / 1024);
    $memoriWasted = round($stats['memory_usage']['wasted_memory'] / 1024 / 1024);
    $persenWasted = round($stats['memory_usage']['current_wasted_percentage'], 2);
    print "<p>Memori yang dipakai = $memoriDipakai MB</p>";
    print "<p>Memori yang invalid = $memoriWasted MB ($persenWasted %)</p>";
    print "<p>Memori bebas = $memoriBebas MB</p>";

    print "<h3>Statistik</h3>";
    print "<p>Jumlah script yang di-cache: {$stats['accelerator_statistics']['num_cached_scripts']}</p>";
    print "<p>Jumlah script yang dapat ditampung: {$stats['accelerator_statistics']['max_cached_scripts']}</p>";
    print "<p>Jumlah hit (cache yang dipakai): {$stats['accelerator_statistics']['hits']}</p>";
    print "<p>Jumlah miss (tidak ada dalam cache): {$stats['accelerator_statistics']['misses']}</p>";
    $hitRate = round($stats['accelerator_statistics']['accelerator_hit_rate'], 2);
    print "<p>Hit rate: $hitRate %</p>";
?>

</body>
</html>

Saat menjalankan file PHP di atas, saya akan memperoleh output seperti:

Penggunaan Memori Untuk Zend Optimizer+

Memori yang dipakai = 14 MB

Memori yang invalid = 0 MB (0 %)

Memori bebas = 50 MB

Statistik

Jumlah script yang di-cache: 622

Jumlah script yang dapat ditampung: 3907

Jumlah hit (cache yang dipakai): 18440

Jumlah miss (tidak ada dalam cache): 628

Hit rate: 96.71 %

Pada konfigurasi default, Zend Optimizer+ akan menggunakan memori sebesar 64 MB untuk menampung bytecode hasil kompilasi. Saya dapat mengubah nilai zend_optimizerplus.memory_consumption untuk meningkatkan jumlah memori yang dipakai bila perlu. Nilai hit rate menunjukkan indikator kinerja Zend Optimizer+, dimana nilai yang tinggi merupakan indikator kinerja yang baik.

Saya akan mencoba melihat peningkatkan kinerja yang diberikan oleh Zend Optimizer+ dengan mensimulasikan request dari 100 pengguna dimana masing-masing pengguna memberikan 10 request ke sebuah controller yang akan menampilkan sebuah view dengan memakai Twig. Seperti biasa, saya akan menggunakan Apache JMeter untuk mengukur waktu respon dari Zend Server. Tanpa Zend Optimizer+, saya memperoleh hasil seperti pada gambar berikut ini ini:

Hasil grafis tanpa Zend Optimizer+

Hasil grafis tanpa Zend Optimizer+

Hasil summary report terlihat seperti pada gambar berikut ini:

Hasil summary tanpa Zend Optimizer+

Hasil summary tanpa Zend Optimizer+

Kemudian, saya menjalankan ulang pengujian yang sama, tetapi kali ini dengan mengaktifkan Zend Optimizer+. Hasil grafis dari JMeter yang saya peroleh adalah:

Hasil grafis dengan Zend Optimizer+

Hasil grafis dengan Zend Optimizer+

Hasil summary report kali ini terlihat seperti pada gambar berikut ini:

Hasil summary dengan Zend Optimizer+

Hasil summary dengan Zend Optimizer+

Bila saya membandingkan nilai throughput kedua hasil di atas, saya akan menemukan selisih yang cukup jauh. Mengaktifkan Zend Optimizer+ meningkatkan throughput dari 11,3/sec menjadi 41,6/sec. Peningkatkan yang dicapai hampir mendekati 4 kali lipat. Tentunya peningkatan kinerja akan lebih terasa lagi bila terdapat semakin banyak file yang di-include (seperti saat memakai framework atau CMS).

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: