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.
Kaydol:
Kayıt Yorumları (Atom)
Hiç yorum yok:
Yorum Gönder