Server Ram / Hafıza kullanımı artarsa apache resetle
- 7 sene önce, Burak Çalışkan tarafından yazılmıştır.
- Server Ram / Hafıza kullanımı artarsa apache resetle için yorumlar kapalı
- CentOS
Vps server veya dedicated server tarzı bir sistemin başındaysak ,ve ram aşırı yüklenmeden ötürü genel bir yavaşlık sorunu yaşıyorsak bu script bir nebze olsun rahatlamanızı sağlayacak.
Konuya girmeden önce belirtmeliyim ki bu çözüm niteliğindeki komut satırı uygulaması asıl sorunun odağına gitmediğinden geçici bir rahatlama imkanından başka bir şey sunmayacaktır. Bu ram kullanımının asıl sebeplerine odaklanmanız daha yerinde olacaktır. Örneğin serveriniz gerçek manada aşırı yükü kaldıramayacak seviyede bir yoğunluğa mı sahip. Bu durumda işlemci ve ram artırımına gitmeniz akıllıca olacaktır. Ya da serverinizde çalışan bir cms ,veya script bu yoğunluğa mı sebep olmaktadır. WordPress kuruluysa kullandığınız pluginlerden birisi gereksiz trafiğe neden oluyor olabilir. visitor online ,statisctic ,post counter gibi web sitenizin istatistiğini tutan pluginler genelde kasar. Veya kaynaklarınız yetersizse cache pluginleriyle mysql i daha az yoran html çıktıları üretip yayınlayabilirsiniz. vsvs konularıyla uğraşmak daha etkili çözüm olacaktır.
KOD
Aşağıdaki örnekte ram total kullanımı %95 e ulaştığında apache yi yeniden başlatıp biriken iş yığınını bitirecek,yeni gelen görevlere müsait hale gelecektir.
İlk olarak komut satırına ; nano apache-free.sh veya vi apache-free.sh yazarak boş bir dosya oluşumuna vesile olalım. Komut satırında açılan boş dosyanın içine aşağıdaki kodu CTRL+C ile kopyaladıktan sonra editörün içinde sağ tıklayarak yapıştıralım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/bin/sh TOTAL=`cat /proc/meminfo | grep MemTotal: | awk '{print $2}'` USEDMEM=`cat /proc/meminfo | grep Active: | awk '{print $2}'` LOG=/var/log/apache-free.log LIMIT=95 DATA=`date +%Y-%m-%d" "%H:%M:%S` PROCESS=$(ps aux r) TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1) if [ "$USEDMEM" -gt 0 ] then USEDMEMPER=$(($USEDMEM * 100 / $TOTAL)) USEDMEMPERLOG=$USEDMEMPER if [ $USEDMEMPER -lt $LIMIT ]; then echo "$DATA | Memory: $USEDMEMPER%, (limit: $LIMIT%) | Do not restart!" else echo "$DATA | Memory limit reached ($LIMIT%): $USEDMEMPERLOG% | Restarting apache..." # restart apache , centos'ta asagidaki sekilde yeniden baslar. Diger oslar icin farkli olabilir. sudo /etc/init.d/httpd restart TOTAL=`cat /proc/meminfo | grep MemTotal: | awk '{print $2}'` USEDMEM=`cat /proc/meminfo | grep Active: | awk '{print $2}'` USEDMEMPER=$(($USEDMEM * 100 / $TOTAL)) echo "$DATA | Memory limit reached ($LIMIT%): $USEDMEMPERLOG% | Memory after restart: $USEDMEMPER%" >> /var/log/apache-free.log 2>&1 tail -1 $LOG # mail atmaya hazirlan SUBJECT="SERVER RAM KULLANIM ISTATISLIK" # Email Kime # Email text mesaji EMAILMESSAGE="/var/log/apache-free.log" echo "Sistem Ram Yük durumu : $USEDMEM / $TOTAL "> $EMAILMESSAGE echo "En çok kaynak kullanan islemler $TOPPROCESS" >>$EMAILMESSAGE echo "Averaj $CPU_LOAD" >>$EMAILMESSAGE echo "Aktif islemler..." >>$EMAILMESSAGE echo "$PROCESS" >>$EMAILMESSAGE mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE fi fi |
Vi editör kullanıyorsak önce ESC ,sonra SHIFT+ZZ tuşlarına basarak kaydedip çıkalım ,nano editörü kullanıyorsak CTRL+xyaptıktan sonra y tuşuna basıp ENTER e dokunup kaydedelim.
UYGULAMA
Dosya izinlerini atamak için komut satırına sırasıyla chmod +X /home/apache-free.sh ve chmod 755 apache-free.sh komutlarını çalıştırıyoruz. Daha sonra yine komut satırına crontab -e yazarak açılandosyada en alt satıra */1 * * * * cd /dir/of/script && sh apache-free.sh yazarak yukarıdaki scriptin dakika 1 sistemdeki ram kullanımını tespit edip , %95 in üzerindeyse apacheyi otomatik resetlemesini sağlıyoruz.
Bu kod ram şişince apache’yi öldürüp yeniden başlatır ,eğer sorun varsa log dosyasına yazar ve size durumun ne olduğuna dair (Ram kullanımı ,toplam ram ,en çok kasan işlemler ,aktif işlemler) bilgilendirme mesajı atıp işini bitirir.
Scriptin çalışıp çalışmadığını kontrol etmek isterseniz komut satırına direkt cd /dir/of/script && sh apache-free.sh yazmanız yeterlidir. Hata vermiyorsa crontab dakikada bir işini yapacaktır. Dilerseniz crontab’a yazdığımız */1 ifadesini */5 yaparak 5 dakikada bir çalışmasını da sağlayabiliriz.
Arada bir komut satırına cat /var/log/apache-free.log dosyasını açıp okuyarak crontabın çalıştığı süreler içerisinde ram kullanımınızın hangi aralıklarda seyrettiğini gözlemleyebilirsiniz.