Profile Guided Optimization (PGO) Dengan Menggunakan PHP
Pada artikel berikut ini kita akan mengeksplorasi penggunaan Profile Guided Optimization (PGO) dengan PHP dan manfaat yang dapat diberikannya untuk aplikasi Anda.
Saya akan memandu Anda melalui langkah-langkah berikut:
- Kompilasi PHP tanpa PGO dan buat profil instalasi Symfony dasar
- Kompilasi PHP dengan PGO dan buat profil instalasi Symfony dasar
Apakah Anda seorang developer yang ingin mengoptimalkan aplikasi PHP Anda atau hanya tertarik untuk mempelajari lebih lanjut tentang teknik pengoptimalan kinerja, artikel ini memiliki sesuatu untuk Anda. Mari pelajari dan jelajahi dunia PGO dengan PHP.
Apa itu Profile Guided Optimization (PGO)?
Pertama-tama kita perlu memahami apa arti PGO. PGO adalah teknik yang digunakan untuk meningkatkan kinerja aplikasi dengan menggunakan data profil yang dihasilkan selama runtime aplikasi. Teknik ini sering digunakan dalam kompiler untuk menghasilkan kode yang dioptimalkan berdasarkan data profil yang dikumpulkan sebelumnya. Teknik ini tidak terlalu terkait dengan PHP, teknik ini dapat digunakan dalam berbagai bahasa lain seperti: C/C++, Java, Python, dan banyak lainnya.
Mengkompilasi PHP tanpa PGO
Awalnya kami akan mengkompilasi PHP tanpa mengaktifkan PGO untuk mengumpulkan info profile untuk aplikasi PHP dalam keadaan saat ini. Untuk melakukannya, saya akan menggunakan server developeran tempat saya menginstal CentOS 7.
1. Saya akan melakukan benchmark pada PHP 8.2.2 jadi saya akan mengkloning versi PHP 8.2.2 menggunakan perintah berikut ini:
git clone --branch php-8.2.2 https://github.com/php/php-src.git /tmp/php-src-without-pgo;
2. Buat file konfigurasi:
cd /tmp/php-src-without-pgo
./buildconf --force
3. Jalankan perintah konfigurasi:
cd /tmp/php-src-without-pgo
./configure --with-openssl
4. Kompilasi PHP (saya menggunakan argument -j4 karena saya memiliki 4 CPU dan saya ingin memparalelkan kompilasi):
cd /tmp/php-src-without-pgo
make -j4
5. Uji apakah binari PHP yang baru dikompilasi sehat — cara ini opsional untuk fase pembandingan, tapi wajib jika Anda ingin menginstal binari PHP dalam produksi.
cd /tmp/php-src-without-pgo
make test
6. Jalankan server PHP dengan menjalankan aplikasi demo
Saya menggunakan aplikasi demo Symfony yang dapat Anda temukan di sini: https://github.com/symfony/demo yang merupakan website sederhana yang diimplementasikan dengan Symfony. Karena tujuan artikel ini bukan untuk menginstal Symfony tapi untuk melihat manfaat kompilasi PHP PGO, saya tidak membahas detil tentang langkah menginstal aplikasi ini. Alih-alih Symfony, ini bisa berupa instalasi aplikasi PHP lainnya (Laravel, Wordpress, dll)
cd /var/www/symfony_demo # replace this with the path of your PHP application
/tmp/php-src-without-pgo/sapi/cli/php -S 0.0.0.0:8000 -t ./public/ # replace ./public with the root directory of your PHP app.
7. Benchmark pertama
Untuk pembandingan instalasi PHP yang saya gunakan siege, Anda bisa menemukan lebih banyak tentang alat ini di sini: https://linux.die.net/man/1/siege
Saya menjalankan perintah berikut untuk menghasilkan traffic di aplikasi PHP selama satu menit dengan 10 permintaan bersamaan.
Perintah dijalankan dari server yang berbeda karena saya tidak mau alat pengepungan menghasilkan beban di server. Saya sudah menginstal aplikasi PHP dan memengaruhi hasil benchmark.
siege -t 1 -c 10 http://ip_of_my_application:8000/en/blog/posts/lorem-ipsum-dolor-sit-amet-consectetur-adipiscing-elit
Dan mendapatkan hasil di bawah ini
Yang penting untuk disebutkan di sini adalah Anda harus menjalankan benchmark beberapa kali dan memastikan Anda memiliki pengaturan parameter yang sama pada setiap proses. Saya telah menjalankan Benchmarks ~10 kali dan mendapatkan rata-rata 3,7 rps.
Mengkompilasi PHP dengan PGO
Sekarang kita akan mengkompilasi PHP dengan mengaktifkan PGO, dan menjalankan kembali benchmark menggunakan biner PHP yang baru.
1. Kloning versi PHP yang sama seperti di bagian pertama, tetapi di direktori yang berbeda
git clone --branch php-8.2.2 https://github.com/php/php-src.git /tmp/php-src-with-pgo;
2. Bangun konfigurasi
cd /tmp/php-src-with-pgo
./buildconf --force
3. Jalankan perintah konfigurasi
cd /tmp/php-src-with-pgo
./configure --with-openssl
4. Kompilasi PHP dengan mengaktifkan PGO (saya menggunakan argumen -j4 karena saya memiliki 4 CPU dan saya ingin memparalelkan kompilasi)
Langkah ini akan mengkompilasi PHP dengan mengaktifkan PGO sehingga akan melengkapi kumpulan profil dalam binari PHP.
cd /tmp/php-src-with-pgo
make prof-clean -j4 # Make sure you cleanup so you don't have any leftovers from previous compilation
make prof-gen -j4
5. Jalankan server PHP dengan menjalankan aplikasi demo PHP
cd /var/www/symfony_demo # replace this with the path of your PHP application
/tmp/php-src-with-pgo/sapi/cli/php -S 0.0.0.0:8000 -t ./public/ # replace ./public with the root directory of your PHP app.
6. Hasilkan beberapa traffic dalam aplikasi
Sekarang kita telah mengaktifkan PGO, kita harus menghasilkan beberapa traffic terlebih dahulu sehingga kode instrumen yang dikompilasi pada langkah 5 akan mengumpulkan informasi tentang track kode yang paling sering digunakan.
siege -t 1 -c 10 http://ip_of_my_application:8000/en/blog/posts/lorem-ipsum-dolor-sit-amet-consectetur-adipiscing-elit
7. Kompilasi binari yang dioptimalkan
cd /tmp/php-src-with-pgo
make prof-clean -j4
make prof-use -j4
8. Mulai server PHP dengan biner PHP yang baru dioptimalkan
/tmp/php-src-with-pgo/sapi/cli/php -S 0.0.0.0:8000 -t ./public/ # replace ./public with the root directory of your PHP app.
9. Jalankan benchmark lagi menggunakan siege
siege -t 1 -c 10 http://ip_of_my_application:8000/en/blog/posts/lorem-ipsum-dolor-sit-amet-consectetur-adipiscing-elit
Hasilnya adalah sebagai berikut:
Saya telah menjalankan Benchmarks ~10 kali dan mendapatkan rata-rata 4,2 rps.
Kesimpulan
Kesimpulannya, hasil benchmark menunjukkan peningkatan jumlah permintaan per detik (RPS) saat PHP Profile Guided Optimization (PGO) digunakan dibandingkan saat tidak digunakan.
Benchmarks dengan PGO nonaktif menghasilkan RPS rata-rata 3,7 sedangkan Benchmarks dengan PGO aktif menghasilkan RPS rata-rata 4,2, jadi kami mendapat peningkatan ~14%. Ini menunjukkan dampak positif yang dapat diberikan PGO terhadap kinerja aplikasi PHP.