adsense

16.07.2014

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.


Hiç yorum yok:

Yorum Gönder