adsense

21.07.2014

Weblogic Patch Geçme

Weblogic Application Server sektörün önde gelen uygulama sunucularından, ancak bu; Weblogic'te de bug bulunmadığı anlamına gelmiyor. "Bug varsa çözümü de mutlaka vardır" sözünden (bu sözü şimdi uydurduk) yola çıkarak bu yazımızda karşılaştığımız bi bug için nasıl patch atcağımızı anlatmaya çalışacağız.

Weblogic 12.1.1 versiyonunda karşılaşılan aşağıdaki hatayı araştırdığımızda bunun Weblogic'in bir bug ı olduğunu görüyoruz (gördük de diyebiliriz:) daha önce karşılaşılmayan bir hata ise Oracle'a SR açılarak patch yazılması istenebilir.)

WARNING: Input Action on WSDL operation AbortedOperation and @Action on its associated Web Method abortedOperation did not match and will cause problems in dispatching the requests.

İlgili hata için patch dosyasını (13606167 numaralı patch) Support.oracle.com a bize verilen account ile indirip Weblogic kurulumu yapılan tüm sunucuların $ORACLE_HOME/utils/bsu/cache_dir dizinine kopyalıyoruz.



İlgili dizine gidip dosyayı extract ediyoruz:

unzip p13606167_12110_Generic.zip

$ORACLE_HOME/utils/bsu dizinine giderek ./bsu.sh scriptini çalıştırılır. Bu script çalıştırılmadan önce Xmanager ya da muadili bir uygulama ile unix ortamında grafik arayüzünde çalışılacak şekilde ayarlama yapılır. Bu sayede script çalıştırıldıktan sonra aşağıdaki ekran belirir.
İlgili ekran açıldıktan sonra Patch id ZWC4 olan patch seçilir ve Apply butonuna basılır.




Patch apply edildikten sonra Admin server dahil tüm processler restart edilir.



Weblogic Admin Server start işlemi ve boot.properties dosyasının oluşturulması

Daha önceki yazılarımızda Weblogic Domain kurulumundan bahsetmiştik. Bu yazımızda Weblogic'in yönetim ekranına ulaşmamızı sağlayan AdminServe process ini ayağ kaldırmaktan bahsedeceğiz.

Admin Server ayağa kaldırılmadan Weblogic konsola erişim sağlanamaz. Dolayısıyla ilk çalıştırmamız gereken scriptimiz startWeblogic.sh scriptidir. Scripti $DOMAIN_HOME dizini altında bulabilirsiniz. ./startWeblogic.sh komutuyla Weblogic Admin sunucumuz çalışmaya başlayacaktır. Script çalışırken username ve password bilgisi isteyecektir, kurulum sırasına belirlediğimiz username ve password bilgilerini girerek devam ederiz. Aşağıdaki logda görüldüğü üzere logun RUNNING durumuna geçmesi beklenir. Server ımız RUNNING durumuna geldiyse Administration Server ımız başarılı bir şekilde ayağa kalkmış demektir. Eğer scripti başlattığınız ekrnda Ctlr+C ile komut satırına gelmek istersek admin sunucu process i kapanır. Admin sunucusunun sürekli açık kalması için (ki istenen budur) ilerleyen aşamalarda yapacağımız bir ayardan bahsedeceğiz.


Her Admin sunucusu start edilirken username ve password girmemek için $DOMAIN_HOME/servers/Admin_Server klasörünün içine girip mkdir security komutu ile security klasörü yoksa oluşturulur ve bu klasör içinde de boot.properties dosyası create edilir.
Dosya içeriği aşağıdaki şekilde olmalıdır:

username=xxxx
password=yyyy

Bu aşamadan sonra Admin Server process i kapatılır (kill edilir) ve yukarıdaki adımlarda belirtildiği gibi yeniden start edilir. Bu start işleminden sonra script i artık username ve password sormadığını görüyoruz. Process in yine Ctrl+C ile komut satırına dönmek istediğimizde kill olmaması için process i arka planda (nohup) çalıştırmamız gerekir:

nohup ./startWebLogic.sh &

Dilerseniz yukarıdaki komutu bir sh haline getirebilirsiniz.
Admin sunucusu ayağa kalktıktan sonra Boot.properties dosyamızın içine bakarsak yazdığımız username ve password ün encrpyted olduğunu görürüz.

Admin sunucusunu kapatmak için start scripti ile aynı dizinde bulunan stopWeblogic.sh scripti ile kapatabiliriz. 





Weblogic Managed Server Oluşturma

Daha önceki yazılarımızda Weblogic kurulumu ve domain oluşturma işlemlerinden bahsetmiştik. Bu yazımızda sizlere kurulu bir Weblogic domain üzerine managed server kurma işleminden bahsedeceğiz.



  • Öncelikle http://ip:port/console formatında olan Admin konsol adresimizi yazıp Weblogic konsolumuza bağlanıyoruz. Konsola girişimizde aşağıdaki ekrandaki gibi Lock & Edit butonumuz aktifse değişiklik yapmak için bu butona tıklayıp işlemlerimize başlıyoruz.




  • Soldaki menüden Enviroment tabını genişletip ilk sırada bulunan Servers linkine tıklıyoruz ve sağ tarafta o an tanımlı olan tüm managed server ların listelendiğini görüyoruz:

  • Açılan sağdaki sayfada New seçeneğine tıklayarak tanımlama ekranına geçiyoruz. 
  • Server Name: Weblogic konsolda görünecek isim. Uygulamamıza özel ve tamamen bizim tercihimize kalmış bir isim verebiliriz.
  • Server Listen Address: Managed Server'ın (JVM'in ) çalışacağı sunucu ip si. 
  • Server Listen Port: Managed Server'ın (JVM'in) kullanacağı port. Bir üstte ip si belirtilen sunucu üzerindeki port olacaktır. Aktif olarak kullanılmayan bir port olmalı. Aksi halde JVM ayağa kalkmayacaktır.
  • Should this server belong to a cluster? seçeneği kısmında dilersek bu managed server ı bir cluster a assign edebiliriz ya da yeni bir cluster yaratma işlemine geçebiliriz. (Cluster konusunu daha sonra işleyeceğiz) Şu aşamada bu managed server ın bir clutser a ait olmadığını düşünürek "No, this is a stand-alone server." seçeneğini seçili bırakıyoruz.
  • Next seçeneğine tıkladığımızda bir sonraki ekranda işlemin özeti karşımıza çıkıyor:


  • Bir üstteki ekranda Finish e tıkladıktan sonra managed server tanımlama işlemi tamamlanacak ve ana sayfaya geri döndürüleceğiz. Burada dikkat etmemiz gereken şey yaptığımız değişikliğin henüz aktif olmamış olması. Ekranın sol kısmında "Activate Changes" butonunun aktif olduğunu göreceğiz:



  • "Activate Changes" a tıklamadan önce Managed Server ımızı Weblogic konsol üzerinden stop/start edeceksek Node Manager'a entegre etmemiz ve diğer ayarlamaları (log path, start up parametreleri vb.) gerekiyor. Bu aşamada managed server ı Unix sunucu üzerindeki startManagedServer.sh scripti ile start edeceğimizi düşünerek anlatacağız. Yapılan server yaratma işini aktif hale getirmeden önce managed server ın access ve Weblogic log pathlerini vermemizde fayda var. Access log, yarattığımız managed server a http erişimleri gösteren (source ip, tarih, saat, url bilgisi) logları ifade eder. Weblogic log ise application server ın ve üzerindeki uygulamanın durumuyla ilgili logları ifade eder. Log tanımlamaları için bir üstteki ekran da bulunan BlogServer a tıklayıp server ın içerisine giriyoruz. Açılan sayfada Logging sekmesin tıkladığımızda bir alt tab'da General sekmesini göreceğiz. Bu sekmede Weblogic log konfigürasyonunu yapacağız. Eğer bir önceki adımda direkt olarak yaptığımız işlemleri save etseydik (Activate Changes) bu durumda aşağıdaki ekranda göründüğü üzere loglar $DOMAIN_HOME/servers/BlogServer/logs klasörü altına yazılacaktır. ($DOMAIN_HOME: domain in yaratıldığı dizin) Dilersek log rotate algoritmasını da düzenleyebiliriz. Örnek olduğu için burayı default bırakıyoruz ancak disk doluluğunuzu ve standartlarınızı kontrol altında tutmak için loglarınızı belirleyeceğiniz bir path e yazdırmanızda fayda var. Değişiklikler yapıldıktan sonra üst kısımda buluna  Save butonuna tıklanır.



  • Weblogic logları düzenlendikten sonra HTTP tab ına geçilir ve access logları düzenlenir. Access loglarda da herhangi bir path belirtilmezse loglar default olarak $DOMAIN_HOME/servers/BlogServer/logs klasörü altına yazılacaktır. Değişiklik yapıldıktan sonra Save butonuna tıklanır ve gerekli değişiklikler yapılır.

  • Tüm bu işlemler bittikten sonra "Activate Changes" butonuna tıklanır ve değişiklikler kaydedilir.
  • Serve yaratıldıktan sonra server tanımlama ekranında "Listen Address" kısmında belirttiğimiz ip li sunucuya Putty, Secure CRT gibi bir client ile bağlanılır ve $DOMAIN_HOME/bin dizinine gidilir:


  • Bu dizinde bulunan startManagedWeblogic.sh scripti kopyalanarak oluşturduğumuz server a özel bir script oluşturulur.
  • Yeni oluşturulan script vi editör ü ile açılır ve aşağıdaki değişiklikler yapılır:
  • WLS_USER ve WLS_PW alanlarına weblogic konsol user ve şifresi yazılır. 
  • Dosya kaydedildikten sonra  aşağıdaki formatta server çalıştırılır:
./startBlogServer.sh BlogServer http://10.115.226.131:7001 

Yukarıdaki ifade bir sh haline getirilerek bu managed server a özel bir start script i oluşturulabilir.


Teşekkürler...

16.07.2014

Weblogic Password Decryption

Weblogic domain ve domain resource (data source, node manager, managed server) kurulumları yaparken şifrelerimizi genellikle yazılı olarak bir yere kaydetmeyiz ki şirket içi güvenlik için de bu oldukça önemlidir. Domain kurulumunda -özellikle JDBC resource kurulumlarında DB şifrelerini- şifrelerimizi bir kerelik girer ve sonra tekrar kullanma ihtiyacımız olmadığı için unuturuz.

Ancak gün gelir de Weblogic upgrade i yapmak istersek ya da aynı şifreye başka yerde ihtiyaç duyarsak hatırlamak her zaman kolay olmayabilir. Weblogic'te şifreler de encrypted halde bulunduğu için geri dönmek çok da mümkün görünmez.

Lakin bu konudan bizim gibi muzdarip başka Weblogic adminler de yok değil. Sağolsun arkadaşlar bunun için şimdilik iki yöntem geliştirmişler ve biz de paylaşmadan geçmek istemedik.

Şimdi encrypted halde bulunan şifrelerimizi nasıl decrpyt edeceğimizi kısaca anlatalım:

1. yol;
  • Öncelikle burada belirtilen adrese giriyoruz.
  • Sonrasında Weblogic Domain path imiz gidiyor ve $DOMAIN_HOME/security dizinine gidirek SerializedSystemIni.dat dosyamızı kendi bilgisayarımıza alıyoruz.

  • Elde etmek istediğimiz şifrenin encrypted halinin bulunduğu xml dosyasını da aynı şekilde kendi bilgisayarımıza alıyoruz. Örnek olarak JDBC Data Source tanımlarımıza ait xml dosyaları $DOMAIN_PATH/config/jdbc klasörü altında bulunur. Bu dizin altında ilgili JDBC xml dosyası kendi bilgisayarımıza alınır.

  • Sonrasında ilk maddede gittiğimiz adreste aşağıdaki kısımlardan bilgisayarımıza aldığımız dosyalar seçilir ve Decrypt butonuna basılır:

  • Decrpyiton işlemi sonunda No Results Yet alanında şifre nin decrypt hali görünecektir: 

2. yol;
  • İlk olarak aşağıdaki siteden indirebileceğiniz RecoverPasswd.java ve RecoverPasswd.ksh dosyalarını indirip kolayca ulaşabileceğimiz bir yere kopyalıyoruz.

http://dosya.co/46eui0zstbdi/RecoverPasswd.java.html
http://dosya.co/z0bfungaow0w/RecoverPasswd.ksh.html

RecoverPasswd.ksh

#!/bin/ksh

usage() {

print "USAGE: RecoverPasswd.ksh [domain_path]"

}

recoverPasswd() {

DOMAIN_HOME=$domainPath
print $domainPath
. $DOMAIN_HOME/bin/setDomainEnv.sh

java RecoverPasswd

}

domainPath=$1

if [[ "$domainPath" == null ]] then
    usage
    exit
else
    recoverPasswd
fi



RecoverPasswd.java

import weblogic.security.internal.BootProperties;

public class RecoverPasswd {
  public static void main(String[] args) {
    BootProperties.load("boot.properties", false);
    BootProperties bootp = BootProperties.getBootProperties();

    System.out.println(
      "Password is: [" + bootp.getTwoClient() + "]");
  }
}


  • Daha sonra $DOMAIN_HOME$/bin altındaki setDomainEnv.sh o an ki session için ". ./setDomainEnv.sh" komutu CLASSPATH'i set etmek içinile çalıştırılır. 

 

  • CLASSPATH set'lendikten sonra .java ve . ksh dosyalarının olduğu dizine geri dönülür ve önce "javac RecoverPasswd.java" ile java dosyası çalıştırılır. Bu dosya çalıştırıldıktan sonra RecoverPasswd.class isimli bir dosya oluşur. Bu dosyayı $DOMAIN_HOME dizinine kopyalanır.
  • Sonrasında ise "./RecoverPasswd.ksh $DOMAIN_HOME" komutu ile .ksh dosyası çalıştırılır ve sonuç olarak bize şifreyi verir.























Weblogic'te Yüksek İşlemci Kullanımı


Weblogic'te yüksek işlemci kullanımı oldukça sık karşılaşılan bir sorundur. Çözüm için ilk yapılması gereken hangi jvm thread'in işlemciyi yoğun kullandığını bulmaktır. Linux OS tabanlı sistemlerde 2 komut çalıştırıp çıktıları eşleştirmek yeterlidir.

1)
ps -eLo pid,ppid,tid,pcpu,comm PID

PID  PPID   TID %CPU COMMAND
29534 29338  2143  3.5 orabpel.invoke.
29534 29338  2144  3.5 orabpel.invoke.
29534 29338  2145  1.7 orabpel.engine.
29534 29338  2146  60.0 orabpel.invoke.

2)
kill -3 PID

yada jrockit kullaniyorsak;

$JAVA_HOME/bin/jrcmd PID   print_threads

"orabpel.invoke.pool-4.thread-60" id=1158 idx=0x7a8 tid=2146 prio=5 alive, native_blocked
    at jrockit/net/SocketNativeIO.readBytesPinned(Ljava/io/FileDescriptor;[BIII)I(Native Method)
    at jrockit/net/SocketNativeIO.socketRead(SocketNativeIO.java:32)
    at java/net/SocketInputStream.socketRead0(Ljava/io/FileDescriptor;[BIII)I(SocketInputStream.java)
    at java/net/SocketInputStream.read(SocketInputStream.java:129)
    at oracle/net/nt/MetricsEnabledInputStream.read(TcpNTAdapter.java:718)
    at oracle/net/ns/Packet.receive(Packet.java:295)
    at oracle/net/ns/DataPacket.receive(DataPacket.java:106)
    at oracle/net/ns/NetInputStream.getNextPacket(NetInputStream.java:317)
    at oracle/net/ns/NetInputStream.read(NetInputStream.java:262)

Her iki komut çıktılarındaki 'tid' alanlarini birleştirdiğimizde;

29534 29338  2146  60.0 orabpel.invoke.
%60 cpu kullanan işlemin -> "orabpel.invoke.pool-4.thread-60" id=1158 idx=0x7a8 tid=2146 prio=5 alive, native_blocked

olduğu görülecektir.

Gün içerisinde belli zamanlarda, cpu artışlarını yakalamak çok kolay olmayabilir. Bu işi otamatik yapan bir shell script işimizi kolaylaştıracaktır.

Scripti 3 parçaya böldük:

getDumpAll_looper.sh
while true
do
        echo yo
        sar -u 1 |tail -1 | awk '{printf "%.0f\n",$3}' >> /data/oracle/mete/Dump/out/top_out
        /data/oracle/mete/Dump/1.sh
sleep 5
done

Crontab'da minumum işler dakida bir çalıştığı için daha kısa aralıklarla iş çalıştırmak için bir looper yazmaya ihtiyacımız var. Top komutundan değer alma yerine sar ile işlemci değeri almak daha kolay. 5 saniyede bir aldığımız değeri bir dosyaya yazıyoruz.

1.sh
#!/bin/bash
count=1
datetime=$(date +'%Y-%m-%d-%H-%M-%S')


filename=/data/oracle/mete/Dump/out/tempfile.out
tail -6 /data/oracle/mete/Dump/out/top_out > /data/oracle/mete/Dump/out/tempfile.out
for next in `cat $filename`
do
    tail1=$(echo "$next")
        if [ $tail1 -gt 90 ]; then
                echo "buyuk"
                count=`expr $count + 1`
        else
                echo "kucuk!"
        fi
done
echo "$count"

        if [ $count -gt 5 ]; then
                echo "buyuk"
                cp /data/oracle/mete/Dump/out/tempfile.out /data/oracle/mete/Dump/out/tempfile_$datetime.out
                /data/oracle/mete/Dump/getDumpAll.sh
        fi


İşlemci kullanımı gün içerisinde zıplamalar yapabilir. dolayısıyla her işlemci değeri %90'i geçtiğinde dump almak çokda işimize yaramayacaktır. İstediğimiz koşul: 30 saniye boyunca işlemci kullanımı %90 olduğunda komutların çalıştırılması. İşte bu seriyi yakalamak için 1.sh scriptini kullanıyoruz. Eğer koşul gerçekleşirse getDumpAll.sh scriptini çalıştırıyoruz.

getDumpAll.sh

#!/bin/bash

#java PID değerleri her restartla değişeceğinden otamatik olarak bulmak için. hangi jvm processlerinin çıktısını burada belirtiyoruz.
s7003pid=$(ps -eo pid,args | grep "Dweblogic.Name=soa-3-7003" | grep -v grep | awk '{print $1}')
s7004pid=$(ps -eo pid,args | grep "Dweblogic.Name=soa-3-7004" | grep -v grep | awk '{print $1}')
s7005pid=$(ps -eo pid,args | grep "Dweblogic.Name=soa-3-7005" | grep -v grep | awk '{print $1}')

echo "$s7003pid"
echo "$s7004pid"
echo "$s7005pid"

datetime=$(date +'%Y-%m-%d-%H-%M-%S')
echo "$datetime"

/usr/java/jrockit-jdk1.6.0_24-R28.1.3-4.0.1/bin/jrcmd $s7003pid   print_threads >> /data/oracle/scripts/Dump/out/thread_7003_$datetime.out
ps -eLo pid,ppid,tid,pcpu,comm | grep $s7003pid > /data/oracle/scripts/Dump/out/threadcpu_7003_$datetime.out

/usr/java/jrockit-jdk1.6.0_24-R28.1.3-4.0.1/bin/jrcmd $s7004pid   print_threads >> /data/oracle/scripts/Dump/out/thread_7004_$datetime.out
ps -eLo pid,ppid,tid,pcpu,comm | grep $s7004pid > /data/oracle/scripts/Dump/out/threadcpu_7004_$datetime.out

/usr/java/jrockit-jdk1.6.0_24-R28.1.3-4.0.1/bin/jrcmd $s7005pid   print_threads >> /data/oracle/scripts/Dump/out/thread_7005_$datetime.out
ps -eLo pid,ppid,tid,pcpu,comm | grep $s7005pid > /data/oracle/scripts/Dump/out/threadcpu_7005_$datetime.out
exit 0

ilk başta belirttiğimiz iki komutu burada çalıştırıp çıktılara bir dosyaya yazıyoruz.


15.07.2014

Jrockit JVM Memory Parametreleri, Performans Tuning ve Garbage Collection

Bir çoğumuz Java uygulamalarımıza memory ataması yaparken minimum ve maksimum heap size değerlerini verir ve öyle çalıştırırız. Çoğu kez sorun yaşamasak da uygulamada oluşabilecek memory problemlerinin tespiti ve yoğun uygulamalarımızın daha efektif çalışması için garbage collection loglamasını enable etme ve ek garbage collection parametrelerini set etme ihtiyacı duyarız. Bu noktada sizlere Jrockit'in bazı memory parametreleri ve garbage collection işlemleri hakkında bilgi vermeye çalışacağız.

Bir JVM i start ederken en temel şekilde aşağıdaki parametreleri veririz:

 Xms: JVM in başlarken alacağı minimum memory değerini belirtir.

ör: -Xms8G

-Xmx: JVM devam ettiği sırada alacağı maksimum memory değerini belirtir.

ör: -Xmx16G

Şimdi biraz yaşayabileceğimiz memory problemlerimiz sonrasında elimizde incelemek üzere nasıl data oluşturacağımza bakalım. Aşağıdaki parametreler Weblogic managed serverların start up parametrelerine eklenerek istenen çıktılar elde edilebilir:

-XX:+|-CrashOnOutOfMemoryError: Out of memory durumunda port ayakta kalır, ancak uygulama cevap vermez. Bu seçenek etkinleştirildiğinde ’out of memory’  hatası olması durumunda  JVM down durumuna geçer.

             ör: -XX:+CrashOnOutOfMemoryError

-XX:+|-HeapDiagnosticsOnOutOfMemoryError: Bu seçenek etkinleştirildiğinde, ‘out of memory’ hatası olması durumunda heap in o anki durumunu belirtir bir rapor üretilir. Bu rapor dosyası - XX:HeapDiagnosticsPath seçeneği ile belirlenen dizine yazılır.

                ör: -XX:+HeapDiagnosticsOnOutOfMemoryError -XX:HeapDiagnosticsPath=D:\myapp\diag_dumps 
 
 
-XX:+|-HeapDumpOnOutOfMemoryError: Bu seçenek ile out of memory  hatası  durumunda heap dump oluşturulur. Sonrasında bu oluşturulan heap dump dosyası Eclipse Memory Analyzer ya da benzeri bir tool ile incelenerek olası memory problemleri tespit edilmeye çalışılır.

              ör: -XX:+HeapDumpOnOutOfMemoryError
 
 
-XX:HeapDumpPath: -XX:+|-HeapDumpOnOutOfMemoryError seçeneği etkinleştirildiğinde oluşturulacak heap dump ın dizinini ve dosya ismini belirlenir.

       ör: -XX:+HeapDumpOnOutOfMemory -XX:HeapDumpPath=D:\myApp\hprof-dumps
 
 
-XXtlaSize: Muti-thread çalışan uygulamalarda thread başında memory ayarlaması amacıyla kullanılır. TLA, Java uygulamasının kullandığı objelerin boyutuna veya fazlalığına göre ayarlanmalıdır. Parametrelere eklenecek değerler şu şekildedir.
min= TLA minimum değeri
preferred=TLA tercih edilen değeri
wasteLimit=Bir TLA’nın izin verilen en büyük memory değeri
 
                ör: -XXtlasize:min=2k,preferred=16k


Garbage Collection:

JVM e min ve max heap size değelerini set edip start ettiğimizde sistemden belirtilen memory değerini sistemin fiziksel memory sinden allocate eder ve uygulamaya verir. Bu noktadan sonra uygulama JVM'e ayrılmış bu miktardan sürekli olarak memory alır ve işini yürütmeye devam eder. Uygulama çalışmaya devam ettikçe yeni aldığı memory çöp haline gelir ve artık kullanılamaz durumdadır. Bu nedenle sürekli yeni memory ihtiyacı hisseder. Oysa biz memory i max heap size değeri ile sınırlamıştık. Dolayısıyla uygulama tarafından kullanılan ve çöp haline gelen bu memory nin bir şekilde bir geri dönüşüm işlemine sokulması gerekmektedir. İşte bu geri dönüşüm işlemine Garbage Collection denmektedir.

Heap üzerinde bir GC işlemi başladığında aşağıdaki şekilde görünen heap in tamamı taranarak o an kullanılmayan (referans gösterilmemiş) objeler belirlenir ve ikinci şekildeki gibi (After Marking) heap haritası çıkarılmış olur. Bu noktadan sonra temizleme işlemi başlar ve free memory oluşturularak uygulamanın yeniden kullanımına hazır hale getirilmiş olur.

Yukarıda bir GC işlemini kabaca anlatmaya çalıştık.Şimdi biraz daha detaya inelim. GC'nin iki farklı tipi vardır.

Young Garbage Collection :

Young generation üç hafıza alanından oluşmaktadır. Bunlar Eden, Survivor 1 ve Survivor 2 hafıza alanlarıdır. Bir JVM start olup uygulamayı available hale getirdiğinde objelerin hepsi Eden space'de oluşur. Survivor 1 ve Survivor 2 alanları ise geçici ara bellek alanlarıdır. Eden hafıza alanı dolduğunda, Garbage Collector live objeleri önce boş olan Survivor alanlarından birisine kopyalar. Bu işlemin ardından Garbage Collector Eden ve kullanımda olan Survivor alanını boşaltır. Eden hafıza alanı tekrar dolduğunda, live objeler ve dolu olan Survivor alanındaki nesnelerin hepsi tekrar boş olan Survivor alanına kopyalanır. Her zaman bir Survivor alanı boştur ve bir sonraki Young Garbage Collection işlemi sonunda live objeleri bünyesine alacak şekilde pasif olarak bekler.. 



Old Garbage Collection :

Young GC işlemlerinin yeterli olmadığı durumlarda Old GC devreye girer. Bu işlem sırasında o sırada JVM üzerinde aktif olarak çalışan tüm thread ler durdurularak temizleme işlemi başlatılır ve işlem bitince tüm thread ler kaldıkları yerden devam ederler. Temizlenecek heap ne kadar büyükse (max heap size) Old GC (Full GC) de bir o kadar uzun sürecektir. Dolayısıyla uygulamamız için optimum max heap size değerini bulmamızda fayda var. GC süresi ne kadar uzunsa kullanıcılar bu işlem sırasında o kadar fazla bekleyeceklerdir. (donma)

 Aşağıdaki grafik Young ve Full GC işlemlerini göstermektedir. Görüldüğü üzere testereye benzeyen şekilde ayrıca küçük merdivenler de bulunmaktadur. İşte her bir testere dişindeki ufak merdiven basamaklarını andıran bu işlemler Young GC işlemlerini göstermektedir. Her bir testere dişi de Full GC işlemlerini temsil eder. Biraz daha açıklamak gerekirse JVM start edildikten sonra belli aralıklarla Full GC işlemlerine tabi tutulmuş, her Full Gc sonrası memory kullanımı 500 MB seviyelerinden 250 MB seviyelerine inmiştir. Testere dişlerinin en dip noktalarını biz çizgi ile birleşirdiğimizde doğruya yakın bir şekil oluşmasını bekleriz. Eğer yukarıya doğru eğilmi bir doğru oluşuyorsa bu, uygulamamızda bir memory leak  olduğunu gösterir. Bu tip bir durumd belli bir süre sonra Full GC işlemleri sonrası free memory miktarı daha yüksek seviyelerde kalacak ve bir müddet sonra Full Gc işlemi anlamsız olacak, sonuç olarak da JVM Out Of Memory hatası alarak duracaktır.



Garbage Collection işleminden bahsettikten sonra Jrockit'in GC parametreleri hakkında bilgi verebiliriz. Bu açıklamalar ışığında sizler de uygulamanıza en uygun GC algoritmasını seçip performans tuning işlemlerinizi yapabilirsiniz. Ancak daha önce belirttiğimiz gibi uygulamanız inanılmaz derecede memory kullanmıyorsa Jrockit'e sadece min ve max heap size değerlerini vermeniz bile yeterli olabilir. Deneyip kontrol etmenizde fayda var.

Jrockit GC Parametreleri

-Xgcprio:pausetime : GC sırasında uzun duraksamalar istemiyorsak bu parametreyi kullanabiliriz. Paralel GC işleminden biraz daha fazla kaynak (cpu ve memory) tüketimine neden olur.

ör: -Xgcprio:pausetime -XpauseTarget:250 (-XpauseTarget parametresi verilmezse default 200 ms kabul edilir) 

-XgcPrio:throughput: Uygulamanın  optimum throughput sağlaması için bu seçenek kullanılır. Bu seçenek kullanıldığında Full GC sırasında belirlenemeyen uzun süreli stop time lar oluşabilir. Ancak yine de GC işlemi olabildiğince optimum çalışır ve JVM thread lere verebildiği kadar cpu kaynağı verir. Default değer budur.

ör: -XgcPrio:throughput 

-XgcPrio:deterministic:Çok kısa ve öngörülen stop time lar için bu parametre kullanılır. Verilen pause time’dan daha kısa sürede GC işlemleri bitirilmeye çalışılır.

-Xgc:genpar  Genel GC tipidir. Objeler önce Young Generation space de toplanır. Nursey size (Young Generation Space) full olduğunda Jrockit, JVM in tüm thread lerini durdurur ve paralel Nursery GC işlemini başlatır. Bu sırada uygun durumda olan tüm CPU kaynakları kullanılarak live durumda olan tüm objeler YG space den Old Generation space e taşınır. Bütün heap dolduğunda ise Old GC collector tüm thread leri durdurarak Full GC işlemini başlatır.

-Xgc:gencon  Bu algoritmada genel ve eş zamanlı bir GC işlemi yapılır. Objeler Nursery size’da toplanır. Nursery size dolduğunda tüm JVM thread ler durdurulur ve tüm live objeler Old Generation Space e taşınır ve Full GC işlemi yapılr.

-Xns: Uygulamamız çok fazla geçici obje oluşturuyorsa, bu parametreyi yüksek vermemizde fayda vardır.

       ör: -Xns:1G

Default Nursery Size
Options
Default value
-server (default)
free heap in %50 si
-Xgc:gencon
sanal işlemci başına 10 MB
-Xgc:genpar
free heap in %50 si
-Xgcprio:throughput
sanal işlemci başına 10 MB
-Xgcprio:pausetime
free heap in %50 si

-XXgcThreads:  Full GC yapılırken aynı anda kaç thread ile JVM in temizleneceğini belirtir. Bu parametre kullanıldığında CPU tüketimi artar ancak GC süresi azalır. Cpu bakımından güçlü serverlarda bu parametre kullanılabilir.

       ör: -XXgcThreads:4


GC Loglamasının Enable Edilmesi:


-Xverbose: JVM output u hakkında bilgi verir.

         ör:-Xverbose:memory 


-Xverboselog: GC loglarının (JVM out put) dizininin ve log isminin tanımlanmasını sağlar.



         ör: -Xgc:genpar -Xverboselog:/log/dizini/logname_gc.log -Xverbose:memory



Yukarıdaki parametrelerin eklenmesinin ardından JVM restart edilirse; GC loglaması enable duruma getirilmiş olur. Aşağıda örnek GC logları görülebilir.



14.07.2014

.out Log Dosya Rotasyonu

Yoğun trafiğe maruz kalan uygulamalarımız aynı oranda log dosyası üretir. Uygulamalarımızın kendi logları yazılımcının kod içerisindeki konfigürasyonu ile günlük, saatlik ya da log size a göre rotate edilir. Yine aynı şekilde Weblogic'in log rotate konfigürasyonu Admin konsol üzerinden konfigüre edilebilir. Ancak .out uzantılı olarak üretilen error ve stdout dosyaları managed server lar yeniden başlatılana kadar rotate edilmez. Dolayısıyla kontrolsüz dolan bu log dosyaları server diskini doldurur ve bu da uygulamamızın crash olmasına neden olur. İşte bu noktada .out dosyalarımızı nasıl rotate edeceğimizi belirteceğiz.


Yöntem 1:


Linux serverda /etc/logrotate.conf dosyasında işletim sistemi parametreleri değiştirilerek rotasyon işlemi yapılabilir.
/etc/logrotate.conf dosyasının sonuna aşağıdaki parametreleri ekleyin

<out_log_dosyası_full_path>/*.out
{
copytruncate
rotate 4
size=500Mb
}

Veya

Crontab a “logrotate” komutu konularak da sağlanabilir. Logrotate komutu copytruncate paremetresiyle kullanılmalıdır.

Yöntem 2:


[ console > managed_server > logging tab ] menüsünden aşağıdaki parametre eklenerek de sağlanabilir.
-Dweblogic.log.RedirectStdoutToServerLogEnabled=true

Weblogic EM - Admin Console - SOA Composer Cookie Name Değiştirme



Birden fazla Weblogic domaininin kurulu olduğu sunucularda EM, SOA Composer gibi uygulamalar mevcutsa, aynı browserda farklı domainlere ait Admin Console, EM ve SOA Composer açılmak istendiğinde tablar arası geçiş sırasında “Because of Inactivity, Your Session Has Timed Out and Is No Longer Active” hatası alınıp, session timeouta düşebilir.
Bunun sebebi  farklı sayfalar için tutulan cookie değerinin aynı dosyaya yazılarak cookie lerin birbirini ezmesidir.
Problemi gidermek için ilgili uygulamaların cookie name parametre isimlerinin değiştirilmesi gerekir.
EM için aşağıdaki yol izlenebilir;
Cookie Name ini değiştirmek istediğimiz ortamın Weblogic Admin Console una girilip Deployments menüsünden em uygulamasının yüklü olduğu path bulunur.
Ilgili path ‘te bulunan em.ear içerisindeki em.war > WEB-INF > weblogic.xml dosyasında default JSESSIONID olan cookie-name parametresi değiştirilip kaydedilir. (Aşağıda JSESSIONIDSYNC olarak değiştirilmiştir.)

Deployments menüsünden em uygulaması update edilerek güncellenmiş em.ear deploy edilir.
Cookie name in değişip değişmediğini test etmek için;
Aynı sunucu üzerinden hizmet veren farklı ortamlara ait EM adresleri aynı browserın farklı tablarında açılıp Firebug benzeri bir browser eklentisi ile cookie name ler kontrol edilir. Aşağıda cookie name in JSESSIONIDSYNC olarak değiştiği görülebilir.

Composer için aşağıdaki yol izlenebilir;
EM için takip edilen yol aynı şekilde izlenir. Deployments menüsünden composer uygulamasının path i bulunur.

 soa-composer.ear > soa-composer.war > WEB-INF > weblogic.xml dosyasında session-descriptor tagi içine cookie name parametresi eklenip kaydedildikten sonra sunucuda aynı path ‘e kopyalanır.
Weblogic.xml dosyasının ilk hali:

Cookie-name eklenmiş son hali:

Deployments menüsünden composer uygulaması update edilerek yeni soa-composer.ear ‘a yönlendirilip deployment tamamlanır.
Cookie name in değişip değişmediğini test etmek için;
Aynı sunucu üzerinden hizmet veren farklı ortamlara ait composer  adresleri aynı browserın farklı tablarında açılıp Firebug benzeri bir browser eklentisi ile cookie name ler kontrol edilir. Aşağıda cookie name in JSESSIONIDSYNC_COMP olarak değiştiği görülebilir.
WLS Admin Console için aşağıdaki yol izlenebilir;
Admin Console > Domain > Configuration > General > Advanced
Console Cookie Name, ADMINCONSOLESESSION dan farklı bir isimle değiştirilip kaydedildikten sonra admin restart edilir.

Cookie name in değişip değişmediğini test etmek için;
Farklı ortamlara ait Admin Console lar aynı browserın farklı tablarında açılarak Firebug benzeri bir browser eklentisi ile cookie name lerin değiştiği gözlenebilir.