Wednesday, March 22, 2017

Share global variable on forked process perl

Judulnya bahasa linggis, karena tidak tau ungkapan yang tepat dengan bahasa indonesia.

Jadi begini, si Amat membuat sebuah program perl untuk memproses begitu banyak list objek. Pada awalnya program si Amat berjalan sempurna, tidak ada masalah yang cukup berarti. Seiring berjalannya waktu, list objek yang akan diproses semakin banyak dan berukuran sangat besar, sehingga membuat program si Amat terkesan lemot dan tidak mampu menangani. Kemudian si Amat mencari tau bagian mana letak kesalahan yang terjadi. Si Amat tidak menemukan kesalahan program karena semua terlihat begitu normal, tidak ada pesan error dan tidak ada kejanggalan.

Kemudian si Amat mulai dihantui kata lemot dan tidak mampu setiap mengingat programnya. Dengan pikiran yang penuh tanya, si Amat mencari solusi dengan bertanya kepada simbahnya si google. Dalam pencerahan bersama mbah google diwejangkan bahwasanya bisa digunakan metode pemrosesan paralel. Semakin bertanya semakin banyak jawaban. Dalam percakapan yang panjang dikatakan ada model thread dan fork. 

Dicobalah kedua model itu oleh si Amat. Yang pertama adalah thread. Pada waktu percobaan dengan komputer pribadinya, program thread ini berjalan lancar. Si Amat menggunakan module threads kemudian mendeklarasikan variable global dengan keyword :shared (ex: %hash:shared;) untuk digunakan sebagai filter yang digunakan oleh programnya. Dengan keyword ini semua thread yang terbuat dapat mengirimkan nilai kepada variabel secara langsung. Cukup mudah dalam benaknya. Namun dalam implementasinya, si Amat menemukan masalah lain. Server yang dipakai untuk menjalankan program si Amat ini belum terinstall modul thread dan sysadmin tidak bisa diajak berkolaborasi.





Daripada merengek pada orang lain, si Amat masih mempunyai satu opsi lain yang bisa dicoba yaitu fork. 

Dalam percobaannya, si Amat menemui bahwa penciptaan proses anak dengan pemanggilan fork ini sangat mudah sekali. Cukup dengan menambah satu baris dengan perintah fork() kemudian baris berikutnya akan dieksekusi oleh proses anakan. Si Amat membuat sebuah program uji coba dengan fork untuk dijalankan sebagai tester di server untuk memastikan bahwa server dapat menjalankan fork.






Tanpa menyebutkan modul, fungsi fork dapat dijalankan di komputer pribadi maupun di server. Mengetahui hal tersebut, si Amat langsung mencoba membuat simulasi fork untuk pemrosesan beberapa data. 

Dalam proses pembuatan program si Amat menemui beberapa hal yang masih belum diketahuinya. Si Amat bermaksud membuat variabel penanda yang menentukan bahwa data telah pernah diproses untuk menghilangkan duplikasi. Dalam logikanya, program yang dibuat sudah memiliki alur yang benar, bahwa variabel penanda ini harus berada pada area global, sehingga semua sub fungsi bisa mengaksesnya secara langsung. 



Tidak ada yang terlihat janggal pada programnya. Variabel %hash sudah dideklarasikan secara global, kemudian dimaksudkan setiap child akan melakukan pengisian pada variabel %hash dengan mengincrement. Jika bernilai lebih dari 0 berarti data sudah pernah ada. Tetapi tidak seperti yang diharapkan, si Amat semakin kebingunan dengan output seperti berikut.



Tidak ada satupun data masuk pada variabel %hash yang berada pada skope global. Tidak ada duplikasi data terdeteksi, padahal secara kasat mata ada duplikasi yaitu data AAA terduplikasi dua kali. "Apa yang terjadi?" dalam benaknya. :))

Kembalilah si Amat pada pelukan simbahnya untuk mendapatkan jurus baru. Si Amat disuruh membaca mantra tentang IPC (Inter Process Communication) pada halaman dokumentasi perl. Si Amat melakukan kopi dan paste terhadap amalan yang ada pada halaman tersebut dengan harapan bisa meneruskan pembuatan programnya.


Si Amat melakukan sedikit modifikasi yang disesuaikan dengan kebutuhannya. Dia ingin menerapkan metodenya untuk melakukan deteksi duplikasi data pada pemrosesan paralel. Dengan sedikit pesan-pesan debugging si Amat mendapatkan apa yang diharapkan.



Pada tahap ini, si Amat telah sukses melakukan deteksi duplikasi dan variabel global menunjukan nilai yang valid. Terdapat 3 AAA dan 1 untuk lainnya. Namun masih ada ganjalan lagi yang membuat si Amat harus kembali mengunjungi simbahnya. Data yang akan diproses dalam realitanya tidak sejumlah 6 saja, bisa jadi puluhan ribu, bisa juga ratusan ribu. Dikatakan oleh simbahnya, bahwa ada limitasi dari system dimana program dijalankan, yaitu jumlah proses yang bisa dijalankan. Pada linux bisa diketahui dengan perintah ulimit -u. Jika jumlah yang ditunjukkan oleh perintah ulimit -u terpenuhi oleh proses program, maka tidak ada lagi proses yang bisa dijalankan. Misal perintah ls,ps, dkk pun tidak akan bisa berjalan karena resource penuh. Oleh karena itu, si Amat harus memikirkan, bagaimana melakukan limitasi jumlah proses anakan yang dibuat oleh fork. Mungkin akan diceritakan lagi oleh si Amat dilain waktu.