RSS

Check Your CPU Performance

Background
Saat setelah kita membeli hardware atau laptop baru kemudian kita install suatu operating sistem didalamnya dan kemudian bisa di operasikan laptop kita. Terkadang kita sudah selesai sampai disitu saja. Padahal saat anda melakukan install operating system pada contoh kasus disini adalah linux. Maka anda juga harus mengecek apakah hardware yang anda beli sudah benar sesuai dengan brosur. Pada kasus ini saya ingin fokus pada CPU terlebih dahulu.

Checking
Untuk mengeceknya dalam linux dengan command cat /proc/cpuinfo
[root@localhost local]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model  : 69
model name : Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
stepping : 1
microcode : 0x17
cpu MHz  : 799.968
cache size : 3072 KB
physical id : 0
siblings : 4
core id  : 0
cpu cores : 2
apicid  : 0
initial apicid : 0
fpu  : yes
fpu_exception : yes
cpuid level : 13
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs  :
bogomips : 4788.94
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model  : 69
model name : Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
stepping : 1
microcode : 0x17
cpu MHz  : 799.968
cache size : 3072 KB
physical id : 0
siblings : 4
core id  : 0
cpu cores : 2
apicid  : 1
initial apicid : 1
fpu  : yes
fpu_exception : yes
cpuid level : 13
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs  :
bogomips : 4788.94
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:

processor : 2
vendor_id : GenuineIntel
cpu family : 6
model  : 69
model name : Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
stepping : 1
microcode : 0x17
cpu MHz  : 799.968
cache size : 3072 KB
physical id : 0
siblings : 4
core id  : 1
cpu cores : 2
apicid  : 2
initial apicid : 2
fpu  : yes
fpu_exception : yes
cpuid level : 13
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs  :
bogomips : 4788.94
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:

processor : 3
vendor_id : GenuineIntel
cpu family : 6
model  : 69
model name : Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
stepping : 1
microcode : 0x17
cpu MHz  : 800.062
cache size : 3072 KB
physical id : 0
siblings : 4
core id  : 1
cpu cores : 2
apicid  : 3
initial apicid : 3
fpu  : yes
fpu_exception : yes
cpuid level : 13
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs  :
bogomips : 4788.94
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management:
Disana tertulis bahwa model name CPU saya adalah Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz. Padahal dibrosur tertulis dengan embel-embel with Turbo Boost up to 2.7GHz. Kalo anda tidak melakukan pengecekan mendetail apakah benar laptop anda sudah memanfaatkan turbo boost tersebut maka anda bisa saja rugi karena anda tidak memanfaatkan feature tersebut. Pada contoh kasus saya disini, saya menginstall laptop saya dengan fedora release 20 dan kernel 3.19.8-100.fc20.x86_64. Kebetulan sekali pada kernel versi 3.19 itu secara default sudah menggunakan module intel_pstate untuk driver power scaling nya. Sehingga memudahkan kita untuk melakukan check turbo boost saya dengan command
[root@localhost local]# cat /sys/devices/system/cpu/intel_pstate/no_turbo 
0
kalo 0 itu berarti memakai turbo boost. kalo 1 maka kita tidak memakai turbo boost.

Testing
Kemudian cara melakukan testing pada laptop kita adalah
1. buka terminal baru dan ketikan command ini
watch -n 3 'grep "cpu MHz" /proc/cpuinfo'
Every 3.0s: grep "cpu MHz" /proc/cpuinfo                                                                                     Sun Aug 21 21:38:19 2016

cpu MHz         : 2020.968
cpu MHz         : 1707.656
cpu MHz         : 1700.062
cpu MHz         : 1699.968
Command diatas menunjukan bahwa cpu saya bisa menggunakan kemampuan kecepatanya melebihi 1.7GHz.
2. Karena ada satu cpu yang masih dibawah 1.7, maka kita coba simulasikan dengan mencoba melakukan looping forever komputer kita untuk memaksanya kerja 100% dengan command while :; do :; done coba tengok terminal sebelumnya salah satu core anda pasti akan menggunakan utilisasinya sampai 100%.

Warning
Apabila ternyata cpu anda ternyata selalu mentok pada angka tertentu. Maka anda harus berhati-hati sapa tau dia di setting untuk powesaving. Kalo masalah ini tinggal selera anda. Apakah anda ingin menggunakan laptop anda untuk keperluan yang performance ataukan untuk powersaving yang penting batrey tahan lama. tapi untuk melakukan pengecekanya adalah
1. Pastikan dulu anda menggunakan driver apa untuk management power scaling nya. Caranya adalah
[root@localhost local]# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver 
intel_pstate
2. Kemudian lihat cpu scalling yang digunakan
[root@localhost local]# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 
powersave
Perlu menjadi catatan bahwa untuk intel_pstate scaling governor powersave adalah setara dengan governare ondemand pada driver acpi-cpufreq. governor pada intel_pstate hanya menyediakan dua saja
[root@localhost local]# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 
performance powersave
Bagi anda yang masih menggunakan driver acpi-cpufreq anda perlu melihat table ini Governor Description ondemand Dynamically switch between CPU(s) available if at 95% cpu load performance Run the cpu at max frequency conservative Dynamically switch between CPU(s) available if at 75% load powersave Run the cpu at the minimum frequency userspace Run the cpu at user specified frequencies Table from:wiki.archlinux.org

Create Certificate Authority in Linux Part 1

Certificate Authority atau lebih dikenal dengan CA. Merupakan suatu metode yang dibutuhkan dalam melakukan komunikasi encrypsi berbasis ssl. SSL itu sendiri dalam prakteknya dikehidupan kita sehari-hari saat menggunakan internet adalah protokol HTTPS.

Kenapa Kita Butuh CA
CA merupakan salah satu pihak yang akan men trust certificate kita. Kalo temen-temen pernah jumpa ada beberapa https yang terkadang memberitahukan ke kita bahwa This Connection is Untrusted
dan ada juga yang dia langsung ke buka seperti milik dari google atau pihak-pihak yang sudah terpercaya seperti banking.
CA itu adalah suatu pihak yang akan mempercayakan applikasi kita kepada halayak banyak. Dari kasus diatas sudah jelas bahwa google dan instansi-instansi yang terpercaya memiliki trust yang sudah dijamin. Sedangkan yang memunculkan pesan, merupakan CA atau trust yang belum tentu terjamin.

Bagaimana kita mendapatkan CA yang terpercaya
CA yang terpercaya kita harus membayar jasa kepada CA yang sudah terpercaya. CA yang terpercaya tersebut adalah milik dari Godady, Symantex, DigiCert dll.

Bagaimana cara mereka bisa dipercaya oleh komputer kita
Cara mereka agar bisa terpercaya karena certificate mereka tersebar dimana-mana. Mereka sudah mempromosikan dan menanamnya di computer kita, OS ataupun browser yang kita gunakan. Atau bisa saya sebut sebagai endpoint. Oleh sebab itulah kenapa harus bayar juga untuk menggunakanya.

Bagaimana cara untuk men-trust kan applikasi kita
Applikasi kita butuh untuk menggenerate yang namanya CSR atau Certificate Sign Request. Setelah itu kita kirimkan csr kita ke pihak yang memiliki CA. Setelah itu csr kita akan dipakai untuk menggenerate certificate dengan menggunakan CA yang mereka miliki. Kemudian kita akan diberikan certificate yang sudah ter sign dengan CA yang kita inginkan. Setelah itu kita tinggal meletakanya kedalam applikasi yang kita inginkan. Contohnya adalah https pada applikasi web

Make Swagger with XML Config on Spring 3 MVC

Pada tulisan saya sebelumnya mengenai pembuatan Swagger dengan menggunakan javaConfig. Sekarang saya akan mencoba mengutak-atik dengan cara menggunakan XML Config. Untuk pom.xml sama seperti pada tulisan sebelumnya

Bean Servlet Config
Yang membedakan antara Java Config dengan XML Config adalah pada discpatcher servlet ini. Saya akan meletakan semua configurasi ada disini. Berikut settinganya


        
        
        
        
            
        
        
        
            
            
            
            
            
            
        
        
            
            
        

Configurasi diatas memerlukan sedikit manipulasi. Karena setelah saya cermati pada swagger version ini tidaklah support jika kita ingin melakukanya dengan cara XML Config.
  1. context:component-scan
    Component diatas melakukan scanning terhadap component-component atau annotation yang akan dibaca oleh spring. Pada program saya ini hanya pada package com.test.controller dan com.test.model yang memiliki annotation yang harus dibaca oleh Spring Framework. Controller digunakan untuk Business logic dan Model digunakan untuk data entity getter setter.
  2. mvc:annotation-driven
    Jika pada java config sintax ini digunakan untuk @EnableWebMvc. Karena pada program yang saya gunakan adalah REST yang akan melakukan Request dan response berupa json maka saya butuh ini.
  3. mvc:resources mapping
    Resource mapping digunakan untuk meletakan file-file static pada contoh disini digunakan untuk template dari swagger nya. Didalamnya hanya berupa file static seperti html, javascript, images dan css. Bisa didownload disini
  4. Bean id:swaggerConfig
    Karena kita akan melakukan configurasi menggunakan XML Config. Maka kita akan bermain dengan XML Bean. Class com.test.model.Swagger merupakan class yang digunakan untuk melakukan getter dan setter untuk class com.mangofactory.swagger.configuration.SpringSwaggerConfig. Oleh sebab itu kita perlu melakukan depedency injection com.mangofactory.swagger.configuration.SpringSwaggerConfig kedalam class ini.
  5. Bean id:swagConf
    Pada bean ini terdapat class com.mangofactory.swagger.configuration.SpringSwaggerConfig. Digunakan untuk autowired agar swagger kita bisa di configurasi dan class ini merupakan depedency dari com.test.model.swagger.
  6. Bean id:apiinf
    Pada bean ini kita akan melakukan configurasi dari Api info. Untuk contructor argument pertama digunakan untuk Title dari API Swagger, Argument yang kedua untuk description, yang ketiga untuk terms of service URL, yang keempat merupakan contact yang bisa dihubungi, yang kelima merupakan licence dari Applikasi ini, yang terakhir adalah alamat licence URL.
  7. Bean id:customImplementation
    CustomImplementation merupakan main configurasinya. Dengan adanya bean ini kita bisa melakukan configurasi swagger dengan Api Info yang kita inginkan. Inti dari bean ini sebenarnya adalah SwaggerSpringMvcPluggin. Akan tetapi karena class tersebut tidak support untuk XML Configuration oleh sebab itu pada bean ini saya perlu melakukan sedikit tricky dan saya jelaskan dibawah. Pada Constructor yang diinginkan adalah springSwaggerConfig. Kita sudah buat beanya diatas pada com.test.model.swagger. untuk mendapatkan springSwaggerConfig maka kita masukan contructor-arg nya #{SprngSwaggerConfig.getSpringSwaggerConfig()} artinya memanggil model getSpringSwaggerConfig pada class ber id SpringSwaggerConfig. Kemudia kita perlu set apiInfo nya dan kita pun sudah meng-custome nya dengan nama apiinf.


Tricky di Class com.test.configuration.ApiInfo
public class ApiInfo extends SwaggerSpringMvcPlugin {
    public ApiInfo(SpringSwaggerConfig springSwaggerConfig) {
        super(springSwaggerConfig);
    }
    public SwaggerSpringMvcPlugin getApiInfo(){
        return this;
    }
    public void setApiInfo(com.wordnik.swagger.model.ApiInfo api){
        apiInfo(api);
    }
}
Class disana saya melakukan extends terhadap SwaggerSpringMvcPlugin. Saya lakukan ini karena pada class SwaggerSpringMvcPlugin tidak ada getter dan setter untuk ApiInfo. Sehingga akan timbul pesan error jika kita coba jalankan.

Buat Class com.test.model.Swagger
public class Swagger {
    private SpringSwaggerConfig springSwaggerConfig;
    
    @Autowired
    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig){
        this.springSwaggerConfig=springSwaggerConfig;
    }
    public SpringSwaggerConfig getSpringSwaggerConfig(){
        return this.springSwaggerConfig;
    }
}
Ini digunakan hanya untuk getter dan setter pada springSwaggerConfig yang dibutuhkan oleh framework spring untuk menghandle configurasi dari swagger.

Apache Tomcat Multiple Instance in One Machine Part 2

Lanjutan dari postingan yang pertama, Jika postingan yang pertama merupakan penjelasanya maka sekarang kita melakukan implementasinya.

Re-Structure Folder Apache Tomcat
Tentukan manakah yang akan dijadikan menjadi Tomcat induk atau CATALINA_HOME dan menjadi Tomcat anak atau CATALINA_BASE. Jika sudah, Maka didalam folder CATALINA_BASE make user semua directory tomcat exist begitu juga dengan CATALINA_HOME. Berikut beberapa hal yang perlu diperhatikan saat akan membuatnya
1. Copy Tomcat hasil downloadan menjadi CATALINA_HOME
2. Lakukan hal yang sama kepada CATALINA_BASE, dengan melakukan remove semua isi didalam webapps, logs, temp, lib, dan work.

Konfigurasi instances
Sebelum kita melakukan konfigurasi perlu diketahui juga bahwa jangan sampai apa yang akan kita konfigurasi akan bentrok dengan instances lain. Hal yang diperhatikan adalah
1. Port yang akan digunakan
Apache Tomcat secara default makan dia akan membuat 3 LISTEN Port yaitu, SHUTDOWN, HTTP dan Proxy AJP. Akan tetapi proxy AJP nantinya akan kita remove, Karena kita tidak menggunakanya. Shingga ada 2 port saja yang nantinya harus diperhatikan.
2. Lokasi dari CATALINA_HOME dan CATALINA_BASE
Jika sampai kita salah, Maka kita bisa men screw up applikasi yang kita gunakan.

Pada Windows/Linux
Setting Tomcat as a Master
1. Copy folder tomcat download ke lokasi yang diinginkan
2. Rubah namanya menjadi apache-tomcat-8.0.15-master
3. Remove beberapa folder yang tidak diinginkan seperti (work,webapps,log,temp dan conf) namun sisakan folder bin dan lib beserta isinya. Alasan mengapa kita perlu remove folder tersebut karena folder tersebut hanya akan di gunakan oleh tomcat instances bukan masternya.

Setting Tomcat as a Instance
1. Copy folder tomcat download ke lokasi yang diinginkan
2. Rubah namanya menjadi nama app anda. Misalkan app-sms
3. Remove isi folder bin dan lib. Karena folder tersbut sudah ada di dalam master.
4. Rubah configurasi app anda di dalam folder conf. Kemudian cari file yang namanya server.xml.

  
  
  
  
  
  
    
  
  
    
    
      
        
      
      
        
      
    
  

Rubah lah port yang saya beri tanda higlight diatas. Untuk port shutdown 8006 sedangkan port untuk komunikasi http port 8081 dan untuk redirectport adalah 8444.
5. buath file setenv.bat untuk windows dan setenv.sh untuk linux di dalam folder bin
Untuk di linux
#!/bin/bash
CATALINA_HOME=/opt/apache-tomcat-8.0.15-master
CATALINA_BASE=/opt/app-sms
export CATALINA_HOME CATALINA_BASE
Catalina home adalah untuk master dan catalina_base adalah untuk instance. Setelah itu kita buat script start-app.sh dan stop-app.sh.
Script start-app.sh
#!/bin/bash
. setenv.sh
JAVA_HOME=/usr/bin/java
JAVA_OPTS="-Xmx256m -Xms128m"
export JAVA_HOME JAVA_OPTS
$CATALINA_HOME/bin/catalina.sh start

Script stop-app.sh
#!/bin/bash
. setenv.sh
JAVA_HOME=/usr/bin/java
export JAVA_HOME
$CATALINA_HOME/bin/catalina.sh stop


Untuk di Windows
@echo off
set CATALINA_HOME=/opt/apache-tomcat-8.0.15-master
set CATALINA_BASE=/opt/app-sms
Simpan dengan nama setenv.bat.
@echo off
call setenv.bat
set JAVA_HOME=G:\Java\jdk1.7.0_79
call %CATALINA_HOME%\bin\startup.bat
Kemudian simpan dengan nama start-app.bat
@echo off
call setenv.bat
set JAVA_HOME=G:\Java\jdk1.7.0_79
call %CATALINA_HOME%\bin\shutdown.bat
Simpan dengan nama stop-app.bat.
Jika kita ingin melakukan troubleshoting terhadap script anda maka tinggal ganti kata start pada line "call "%EXECUTABLE%" start %CMD_LINE_ARGS%" menjadi "call "%EXECUTABLE%" run %CMD_LINE_ARGS%" pada file startup.bat yang ada di catalina home. Jika kita tidak menggantinya maka kita tidak akan tau errornya karena pada command prompt dia langsung menghilang tanpa menampilkan errornya apa.

Apache Tomcat Multiple Instance in One Machine Part 1

Pada Tulisan saya ini, Ingin berbagi untuk menjalankan beberapa instance dalam satu machine.

Pertanyaan pertama, Kenapa sih kita harus run multiple instance?
Alasan pertama, Jika applikasi yang kita buat merupakan applikasi yang berbeda dan independence. Contohnya kita memiliki applikasi yang namanya Content Management System dan applikasi yang kedua adalah applikasi sms. Bayangkan jika mereka dalam instance yang sama. Jika ada perubahan applikasi dan perlu untuk di restart. Maka salah satu applikasi yang seharusnya tidak mati, malah ikutan mati. Kalau bahasa mudahnya easy to maintaince.
Alasan yang kedua, Jika kita ingin melakukan management memory pada tiap-tiap applikasi. Jika dalam satu instance kita kurang tau tiap-tiap applikasi memakan berapa banyak memory. Dengan adanya pemisahan instance, kita dapat mengetahui applikasi yang mana yang telah memakan memory yang banyak di server kita. Berikut tampilanya
[takmgr@localhost bin]$ top
top - 16:20:31 up 17:06,  5 users,  load average: 0.20, 0.11, 0.07
Tasks:  87 total,   1 running,  86 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  1.3 sy,  0.0 ni, 94.5 id,  1.6 wa,  1.0 hi,  1.6 si,  0.0 st
KiB Mem :  1529248 total,    78936 free,   330540 used,  1119772 buff/cache
KiB Swap:  2326524 total,  2325620 free,      904 used.  1164836 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
32146 root      20   0   15720   8508   7500 S  0.3  0.6   0:01.14 sshd
32274 takmgr    20   0  404080 152832   9304 S  0.3 10.0   0:11.94 java
32385 takmgr    20   0  404240 152820   9276 S  0.3 10.0   0:12.50 java
32430 takmgr    20   0    8768   3564   3120 R  0.3  0.2   0:00.06 top
    1 root      20   0    8308   6432   3792 S  0.0  0.4   0:09.61 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.01 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:17.93 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    7 root      20   0       0      0      0 S  0.0  0.0   0:13.75 rcu_sched
    8 root      20   0       0      0      0 S  0.0  0.0   0:08.18 rcuos/0
    9 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
   10 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/0
[takmgr@localhost bin]$ ps aux | grep tomcat
takmgr   32274  2.9  9.9 404080 152832 pts/3   Sl   16:14   0:12 /usr/local/src/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/opt/sendmail-app/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xmx256m -Xms100m -Djava.endorsed.dirs=/opt/apache-tomcat-7.0.65-master/endorsed -classpath /opt/apache-tomcat-7.0.65-master/bin/bootstrap.jar:/opt/sendmail-app/bin/tomcat-juli.jar -Dcatalina.base=/opt/sendmail-app -Dcatalina.home=/opt/apache-tomcat-7.0.65-master -Djava.io.tmpdir=/opt/sendmail-app/temp org.apache.catalina.startup.Bootstrap start
takmgr   32385 17.7  9.9 404240 152820 pts/3   Sl   16:19   0:12 /usr/local/src/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/opt/mail-app/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xmx256m -Xms100m -Djava.endorsed.dirs=/opt/apache-tomcat-7.0.65-master/endorsed -classpath /opt/apache-tomcat-7.0.65-master/bin/bootstrap.jar:/opt/mail-app/bin/tomcat-juli.jar -Dcatalina.base=/opt/mail-app -Dcatalina.home=/opt/apache-tomcat-7.0.65-master -Djava.io.tmpdir=/opt/mail-app/temp org.apache.catalina.startup.Bootstrap start
takmgr   32432  0.0  0.1   6300  2128 pts/3    S+   16:21   0:00 grep --color=auto tomcat
Baris yang dicetak tebal itu merupakan bagian memory.

Sedikit bocoran saja sebenarnya dalam melakukan pemisahan instance ini seperti halnya kita melakukan copy paste apache tomcat menjadi jumlah yang kita ingin tentukan(instance). Jadi sebelum kita melakukan peng-copyan alangkah lebih baiknya kita mengetahui isi dalam folder apache tomcat tersebut
Structure Directory Apache Tomcat
bin: Merupakan directory untuk mengeksekusi perintah start dan stop
conf: Merupakan directory untuk melakukan configurasi pada sisi tomcat instance-nya
webapps: Merupakan directory untuk deploy dan expand applikasi
work: Merupakan directory dari applikasi yang telah dicompile. sehingga kita bisa lihat dalamnya dari applikasi kita
logs: Merupakan kumpulan dari log-log si tomcat
lib: Merupakan directory kumpulan dari library-library yang dibutuhkan oleh tomcat/applikasi kita
temp: Merupakan directory yang digunakan untuk menyimpan data temporary

Check Current State Connection to Our Server Part 2

Jika pada tulisan yang pertama sudah dijelaskan pentingnya open connection dan menjaga system agar connection yang ada adalah benar-benar connection yang terpakai. Bukan connection yang menyampah gara-gara tidak ditutup dsb. Berikut script untuk memonitoringnya secara live pada console kita.
#!/bin/bash
netstat -anp | grep tcp | awk '{print $5" "$6" "$7}'| sort -n | uniq -c
simpan file tersebut dengan nama checkConnection.sh. Pada script yang saya tuliskan diatas saya mencoba untuk melakukan list sapa saja yang terkoneksi ke dalam server dan menghitungnya jika ada yang specific. Langkah selanjutnya running program tersebut dengan perintah
watch -n 1 'bash checkConnection.sh'
watch disitu dengan parameter -n 1 digunakan untuk menjalankan script tersebut setiap 1 detik. Sehingga bisa dibilang kita sudah memonitoring secara RealTime, Berikut penampakanya
Every 1.0s: bash checkConnection.sh

      1 0.0.0.0:* LISTEN 1390/mysqld
      1 0.0.0.0:* LISTEN 2061/cupsd
      1 0.0.0.0:* LISTEN 4006/sshd
      1 0.0.0.0:* LISTEN 705/rpcbind
      1 0.0.0.0:* LISTEN 998/rpc.statd
      1 :::* LISTEN 2061/cupsd
      1 :::* LISTEN 4006/sshd
      1 :::* LISTEN 705/rpcbind
      1 :::* LISTEN 991/httpd
      1 :::* LISTEN 998/rpc.statd
      1 74.125.200.191:443 ESTABLISHED 2376/firefox
      1 74.125.224.47:443 ESTABLISHED 2376/firefox
      1 114.125.1.144:443 ESTABLISHED 2376/firefox
      1 114.125.1.150:443 ESTABLISHED 2376/firefox
      1 127.0.0.1:22 ESTABLISHED 9705/ssh
      1 127.0.0.1:33774 ESTABLISHED 9706/sshd:

Check Current State Connection to Our Server Part 1

Pada tulisan ini saya akan membahas mengenai State connection. Saya punya pengalaman saat teman saya tanya mengenai jumlah user yang dapat mengakses ke server kita. Sebenarnya ada banyak yang mempengaruhi hal tersebut. Salah satunya jumlah open connection yang telah di buka.

State Connection
Sebelum kita bahas lebih lanjut alangkah lebih baiknya perlu untuk mengetahui apa saja state connection yang diketahui oleh Linux dan bagaimana prosesnya
Pada sisi Server ada 5 phase yaitu LISTEN, SYN_RECD, ESTABLISHED, CLOSE_WAIT dan LAST_ACK. Listen berarti service kita telah menyala dan sedang Listen untuk menunggu request masuk. Kemudian Jika ada request masuk pertama-tama adalah menerima SYN paket dari client. Jika server dapat menerima maka server akan meresponse SYN+ACK. Pada kondisi ini server akan mencoba mengirimkan paket berulan-ulang jika Server tidak mendapatkan ACK dari client karena statusnya masih half open connection hal ini dikarenakan feature dari jaringan protocol TCP/IP untuk melakukan retransmission jika sapa tau terjadi kegagalan. Cara mengechek berapa jumlah system kita melakukan re-transmission adalah
cat /proc/sys/net/ipv4/tcp_synack_retries
Defaultnya adalah selama 5 kali dan akan diabaikan dan tidak dilanjutkan jika sudah 5 minutes tidak ada response. Apabila kondisinya Server mendapatkan pesan ACK maka pada phase ini dinamakan SYN_RECD. Kemudian proses komunikasi bisa dilakukan dengan ditandai ESTABLISHED. Secara default ESTABLISHED akan berakhir jika client memutuskan untuk menyelesaikan dengan mengirimkan paket FIN. Akan tetapi jika hal tersebut tidak terjadi maka kita harus menunggu selama 432000 seconds (selama 5 hari). Nilai itu adalah default dari linux, apabila masih tidak ada aktifitas maka firewall kita akan memutuskanya. Untuk melihatnya ada di
cat /proc/sys/net/netfilter/nf_contrack_tcp_timeout_established
Kemudian adalah phase CLOSE_WAIT. Pada phase ini server akan menunggu selama 60 seconds default dari linuxnya
cat /proc/sys/net/netfilter/ip_conntrack_tcp_timeout_time_wait
Jika kita sudah tau ternyata dalam proses komunikasi ada masa tunggunya maka anda bisa bayangkan jika didalam server kita sudah penuh dan tidak dapat membuat connection lagi. Maka server tersebut akan tidak dapat melayani layanan selama dari waktu tunggu tersebut. Mending kalo hanya suruh nunggu 2 menit untuk menuggu waktu time wait. Jika ternyata menunggu untuk waktu yang established. Maka bisa dibayangkan server kita akan available selama 5 hari.

Kenapa membuat connection dibatasi, siapa sih yang membatasi
Secara default setiap kali kita membuat connection kita butuh yang namanya file handle. Artinya kita akan membuat yang namanya file. Sekarang didalam linux ada batasan dalam pembuatan file.
[tri@localhost ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15446
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Bisa dilihat total open files hanyalah 1024. Dari sini sudah jelas kita hanya mempunyai kapasitas tidak lebih dari 1024 connection yang dapat mengakses Server kita dengan user tri. Kenapa saya bilang tidak lebih, saya ulangi kembali karena setiap kita membuat state baru seperti SYN_RECD, ESTABLISHED atau CLOSE_WAIT kita sedang melakukan open file. Oleh karena itu kita perlu memonitornya, Apalagi jika ada state connection yang sudah waktunya closed tapi dia masih hang in on disana. Contohnya adalah koneksi ke Database dan kita tidak melakukan close connection di programnya. Itu akan mempengaruhi jumlah user yang dapat mengakses ke server kita. Karena state connection nya dipakai percuma untuk koneksi ke database yang mana sudah tidak dibutuhkan lagi.
Please copy and share it, if it helps you
 
Copyright 2009 My Note All rights reserved.
Free Blogger Templates by DeluxeTemplates.net
Wordpress Theme by EZwpthemes
Blogger Templates