
Setelah lama juga ga update blog, pengen nulis tentang teknis lagi seputar implementasi tweaking performance yang lagi dikerjakan. Sebenarnya pekerjaan ini sudah dimulai dari hampir setahun yang lalu dalam bentuk purwarupa (prototype). Tapi karena suatu hal prosesnya berhenti dan baru dilanjutkan sekarang ini (setidaknya olehku).
Untuk optimalisasi maksimal, sesuai dengan pengalaman dan keahlian, aku menggunakan sistem operasi FreeBSD + Apache Web Server + PostgreSQL + Mapserver + Openlayers + jQuery, yang notabene seluruhnya adalah produk FOSS (Free Open Source Software). Tantangan aplikasi selesai loading di bawah 10 detik secara keseluruhan dapat dijawab dengan loading di bawah 1 detik untuk 1 single user dan akses localhost (cat: kemampuan server memungkinkan untuk hal ini). Namun saat ini, kebutuhan korporasi yang mengharuskan standarisasi menggunakan Windows Server membuat tantangan lebih lanjut. Cukup menarik, cukup menantang. Karena tidak pernah fokus khusus sebelumnya soal performansi di bawah platform Window Server.
Hasilnya? Bug demi bug bermunculan!
Beberapa perbedaan dan sebisa mungkin diganti antara lain:
- Sistem Operasi Windows Server; menurut pendapat pribadi, Windows Server 2008 yang serba GUI jelas memakan resource yang jauh lebih besar dibandingkan FreeBSD yang tanpa GUI sehingga kemampuan hardware tidak dapat dioptimalisasi untuk kinerja mapserver sebagai fokus utama aplikasi
- IIS7 Web Server; pilihan jatuh kepada web server default karena pemikiran bahwa “seharusnya” aplikasi bawaan windows server akan jauh lebih bagus daripada aplikasi tambahan yang diinstal lagi seperti Apache Web Server
- MapServer & Geolibs; mapserver dan library tambahan yg dibutuhkan (proj dan gdal) diambil dari ms4w yang sudah di-compile dan diambil dari maptools. Berbeda dengan harus compiling source langsung, tentu versi ini tidak akan maksimal sesuai dengan spek server & library nya. Untuk compile langsung dari source di Windows, solusi ini sepertinya membuang waktu dan tenaga percuma karena belum tentu berhasil dan membutuhkan developer tools tambahan lainnya, ditambah keterbatasan skill untuk compiling source di windows
. Mapserver dan geolibs sudah dapat dijalankan dalam bentuk FastCGI di II7 (good!) - TileCache & Python; untuk proses caching tile map, tilecache dibutuhkan di backend. Tilecache ditulis dalam bahasa pemrograman Python. Untuk ini dilakukan Handler Mappings script python pada IIS7 dengan mode CGI.
OpenLayers sebagai client framework tidak ada perubahan (asumsi: development phase menggunakan Mozilla Firefox 3.5+ dan Google Chrome 9+, end user menggunakan Internet Explorer 8+) - Database Server; tidak menangani dan digunakan secara langsung tetapi tahap lanjut beralih dari PostgreSQL 9.0+ ke Microsoft SQL Server 2008/2010 yang telah didukung kemampuan database spasial (saat hal ini dikonfirmasi, MSSQL 2008 yang digunakan tidak terdapat tipe data geometri, artinya tidak ada kemampuan database spasialnya)
- GD Library; tidak dapat dikontrol karena Windows telah memiliki built-in library gd sendiri lengkap dengan driver2 nya. Solusi simpel, menggunakan library GD yang ada di ms4w untuk digunakan oleh mapservernya.
Seperti proses tahap awal caching, dilakukan dengan single user localhost dan/atau menggunakan script bawaan python, proses ini memang lambat dan membutuhkan waktu & resource yang sangat besar. Tetapi proses ini hanya sekali dilakukan dan selanjutnya script TileCache akan melakukan pengecekan apakah hasil tile sudah ada atau belum. Kalau belum, digenerate ulang, kalau sudah tinggal di-passthru aja (dilewatin, hanya sebagai transparent proxy). Wajar jika penggunaan resource seperti pada gambar di atas, bahkan CPU dan Memory Use mencapai hingga 100%.
Namun yang menarik terjadi setelah proses caching ini selesai. Hasil monitoring penggunaan resource tampak seperti gambar di atas. Penggunaan CPU mencapai 100%, ada kalanya pembacaan harddisk mencapai 1MB/s, dan memory 20%. Hasil penggunaan resource harddisk yg kadangkala >1MB/s (dan seharusnya sejalan dengan penggunaan Network yang >1MB/s juga) merupakan hal wajar karena setelah proses caching selesai, resource hanya digunakan untuk baca disk. Memory 20% juga hal wajar karena running service (web, dll) dan tidak digunakan dalam proses generate mapserver lagi. Namun penggunaan CPU yang 100%, itu yang kuanggap tidak wajar. CPU biasanya mencapai 100% kalau menjalankan mapserver (seiring dengan penggunaan memory) untuk caching peta.
Saat melihat detail proses yang running, mata langsung tertuju pada program Python yang berjalan, padahal baru single user dari network dan hanya melakukan zoom in/out yang cepat secara terus menerus (gimana kalau sampai >10 tester bayangkan!). Program python yang berjalan untuk running script Tilecache bisa mencapai hingga lebih dari 20 proses!!
Ingat, OpenLayers meminta data peta dari 1 user ke server hingga 10-20 tile dalam sekali rikues aplikasi (1 zoom level, tergantung besar viewport peta di aplikasi). Dari hasil debug mode, sebenarnya waktu untuk passthru 1 tile ke single client cuma butuh waktu sekitar 0.1 detik. Jadi maksimal peta muncul keseluruhan 1-2 detik saja.
Permasalahannya, berarti program python harus dibatasi (instance di IIS7) dan untuk zoom in/out harus dibuat delay sebelum rikues ke server. Namun pada kenyataannya, pada IIS7 tidak ada pengaturan MaxInstance untuk mode CGI!
Mapserver yang sebenarnya yang memakan resource paling besar, dijalankan menggunakan mode FastCGI Module dan mode ini dapat dikonfigurasi di IIS7, namun tidak pada mode CGI Module.
Solusi yang diajukan:
1) Pada client (aplikasi) zoom in/out diberikan delay. Pada OpenLayers, zoom in/out menggunakan mousewheel dapat dibatasi dengan cara berikut:
map = new OpenLayers.Map( 'map', {controls: [
new OpenLayers.Control.Navigation(
{mouseWheelOptions: {interval: 100}}
),
new OpenLayers.Control.PanZoom(),
//control lainnya
]
});
Fungsinya adalah memberikan delay 100ms (0.1 detik) berdasarkan load server yang dilihat untuk passthru tile tadi. Untuk lebih pasti, berikan saja 250ms atau sekitar 1/4 detik. User yang asumsinya masih manusia normal tentu tidak akan menyadari “keterlambatan” sedikit ini.
2) Pada server (IIS7) ini yang masih dalam identifikasi lebih lanjut. Dibutuhkan running python dalam mode yang dapat membatasi MaxInstance. Pada Apache web server, mode CGI/FastCGI secara default adalah 4. Dan pada IIS7, hanya mode FastCGI yang memiliki MaxInstance dan juga dengan default value 4. Ini yang penting. Python yang menjalankan script Tilecache harus dibatasi hanya 4 secara bersamaan dan diatur eksekusi bergantian oleh IIS.
Bertanya pada mbah Google juga tidak membawa hasil maksimal bagaimana cara running sebagai FastCGI Module. Hasil yang menjanjikan hanyalah mengganti (tepatnya sih menambah) library python sebagai ISAPI Module (WSGI).
Demikian hasil identifikasi sampai saat ini. Berarti permasalahan yang terjadi bukan karena diharuskan tweaking mapserver dan kawan-kawannya (itu yang menjadi tugas pokok ku), tetapi pada keterbatasan IIS7 yang tidak dapat membatasi MaxInstance CGIModule.
Kalau ada yang pernah mengalami dan sukses dengan solusinya, mohon bantuannya komen di bawah
1. Pingback by IIS7 – Python ISAPI « Geo « Eric Lontong
21/Nov/2011 at 16:29
[...] seputar soal performansi (tweaking) mapserver di platform Windows Server 2008, yang dibahas sebelumnya, tulisan kali ini fokus pada tuning TileCache yang menggunakan bahasa Python pada web server [...]