skip to Main Content

linux de cpu kullanımını kısıtlamak

genel olarak bir uygulamanın çok fazla cpu tüketmesi istenilmez. bu cpu tüketimi genel olarak bir kaç nedenden kaynaklanır.

  • kötü programcılık örnekleri
  • zafiyat oluşturmak için kötü niyetli uygulamalar
  • iyi yönetilmeyen sunucularda yük dengeleme v.b. yapılmaması
  • gerçekten işlem gücü gerektiren kernel derleme, 3d render v.b. işlemlerde

cpu tüketimi neden olursa olsun pcde bunun olmasını elbette istemiyoruz.. bunun için oldukça kullanışlı bir uygulama mevcut. önce uygulamayı sistemize kuralım.

sudo apt-get install cpulimit

kurulu yaptıktan sonra kullanmaya başlayabilirsiniz basit bir örnek yapalım.

cpulimit -l 20 python face-detect.py haarcascade.xml

diğer kullanım seçenekleri için help den yararlanılabilir. sisteminizde faza tüketilen uygulamalar için http://www.ferhatcicek.com/bilisim-dunyasi/isletim-sistemi-bilisim-dunyasi/linux/sh/20170821/yuksek-kaynak-tuketen-uygulamalari-bulmak/2177.html yazısına bakabilirsiniz.

Usage: cpulimit TARGET [OPTIONS...] [-- PROGRAM]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process
      -e, --exe=FILE     name of the executable program file
                         The -e option only works when
                         cpulimit is run with admin rights.
      -P, --path=PATH    absolute path name of the
                         executable program file
   OPTIONS
      -b  --background   run in background
      -f  --foreground   launch target process in foreground and wait for it to exit
      -c  --cpu=N        override the detection of CPUs on the machine.
      -l, --limit=N      percentage of cpu allowed from 1 up.
                         Usually 1 - 800, but can be higher
                         on multi-core CPUs (mandatory)
      -m, --monitor-forks  Watch children/forks of the target process
      -q, --quiet        run in quiet mode (only print errors).
      -k, --kill         kill processes going over their limit
                         instead of just throttling them.
      -r, --restore      Restore processes after they have
                         been killed. Works with the -k flag.
      -s, --signal=SIG   Send this signal to the watched process when cpulimit exits.
                         Signal should be specificed as a number or 
                         SIGTERM, SIGCONT, SIGSTOP, etc. SIGCONT is the default.
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process,
                         or if it dies
          --             This is the final CPUlimit option. All following
                         options are for another program we will launch.
      -h, --help         display this help and exit

linuxde klasör altındaki en büyük boyutlu dosyaları bulmak

find . -printf ‘%s %p\n’| sort -nr | head -10

ile en büyük 10 dosya aranmış olur.

root@cicekpc:/boot# find . -printf '%s %p\n'| sort -nr | head -10
59562456 ./initrd.img-4.13.0-46-generic
59549708 ./initrd.img-4.13.0-45-generic
43531219 ./initrd.img-4.10.0-32-generic
7870224 ./vmlinuz-4.13.0-46-generic
7870224 ./vmlinuz-4.13.0-45-generic
7579408 ./vmlinuz-4.10.0-32-generic
3884611 ./System.map-4.13.0-46-generic
3884611 ./System.map-4.13.0-45-generic
3719197 ./System.map-4.10.0-32-generic
2397909 ./grub/unicode.pf2

linuxte yüksek kaynak tüketen uygulamaları bulmak

root@cicekpc:/home/fcicek#  ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
  PID  PPID CMD                         %MEM %CPU
 2878  2102 /usr/lib/firefox/firefox    17.8 28.3
 1274     1 /usr/sbin/mysqld             1.8  0.0
 2579  2102 /usr/bin/compiz              1.4  1.5
 2710  2452 /usr/bin/gnome-software --g  1.0  0.0
 1313  1267 /usr/lib/xorg/Xorg -core :0  0.8  1.8
 2723  2452 nautilus -n                  0.6  0.0
 2879     1 /usr/lib/fwupd/fwupd         0.6  0.0
 3083  2102 /usr/lib/gnome-terminal/gno  0.5  0.1
 1513     1 dockerd -G docker --debug -  0.5  0.1

debian altında kullanılmayan yapılandırma dosyaları

sisteminiz üzerinden programı kaldırdıktan sonra sistem üzerinde kalan ve kullanılmayan yapılandırma dosyalarını bulmak için

dpkg -l | awk '/^rc/ {print $2}'

kaldırmak için

sudo su
dpkg -l | awk '/^rc/ {print $2}' | xargs dpkg --purge

kullanabilirsiniz.

linuxde açık port ve socket

linuxte açık portları ve socketleri öğrenmek istiyorsak, en temel uygulamamız netstat dan başka bir şeye gerek yok.

fcicek@fcicek-home:~$ sudo netstat -plnt
Aktif internet bağlantıları (sadece sunucular)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               DİNLE      1298/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               DİNLE      3905/cupsd          
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               DİNLE      1525/postgres       
tcp        0      0 127.0.0.1:5433          0.0.0.0:*               DİNLE      1508/postgres       
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               DİNLE      1436/mysqld         
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               DİNLE      1293/systemd-resolv 
tcp6       0      0 :::22                   :::*                    DİNLE      1298/sshd           
tcp6       0      0 ::1:631                 :::*                    DİNLE      3905/cupsd          
tcp6       0      0 :::5355                 :::*                    DİNLE      1293/systemd-resolv 
tcp6       0      0 :::80                   :::*                    DİNLE      1524/apache2

 

fcicek@fcicek-home:~$ netstat -lx 
Active UNIX domain sockets (sadece sunucular)
Proto RefCnt Flags       Type       State         I-Node   Yol
unix  2      [ ACC ]     AKIŞ      DİNLENİYOR  34197    /tmp/.ICE-unix/2505
unix  2      [ ACC ]     AKIŞ      DİNLENİYOR  28166    /run/user/125/bus
unix  2      [ ACC ]     AKIŞ      DİNLENİYOR  34061    /run/user/1000/systemd/private
unix  2      [ ACC ]     AKIŞ      DİNLENİYOR  34066    /run/user/1000/bus
unix  2      [ ACC ]     AKIŞ      DİNLENİYOR  34196    @/tmp/.ICE-unix/2505
unix  2      [ ACC ]     AKIŞ      DİNLENİYOR  87786    /tmp/.org.chromium.Chromium.9o8hA2/SingletonSocket
unix  2      [ ACC ]     AKIŞ      DİNLENİYOR  27553    @/tmp/.ICE-unix/1750

 

raspberry pi sıcaklığının değerinin öğrenilmesi ve rrd ile izlenmesi

basit bir örnekle raspberry pi üzerinde rrdtool kullanımı  yazıda rrd kullanımına değinmiştim. yazıdaki örnekte kayseri şehrinin sıcaklık değeri kullanılmıştı.

bu yazıda ise raspberry pi nin iç sıcaklık değerlerini kullanalım. kit üzerinden sıcaklık değerini iki yöntemle öğrenebiliriz.

1. yöntem  vcgencmd komutunu kullanarak

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp
temp=56.2'C

çıktısı yukarıdan görüldüğü gibi doğrudan rrd veritabanına göndermeye uygun değil bunun için aşağıdaki şekilde çıktımızı kırpalım.

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "'" -f1
56.2

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -c6-9
56.2

2. yöntem ise cpu log çıktısına bakmak.

pi@raspberrypi ~ $ cat /sys/class/thermal/thermal_zone0/temp
56224

bu yapıda tam işimize yaramayabilir. çıktıyı okunabilir bir duruma getirmemiz gerekiyor.

root@raspberrypi:~# /opt/vc/bin/vcgencmd measure_temp | sed "s/temp=\([0-9]\+\.[0-9]\+\)'C/\1/"
56.2

root@raspberrypi:~# awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp
56.2

artık raspberry nin sıcaklık değerinin nasıl öğrenileceğini bildiğimize göre örneğimizde yer alan

sicaklik ="curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'";

satırı yerine uygun kodu yazarak raspberrynin sıcaklık değerini rrd grafikleri üzerinden takip edebiliriz.

linux makinelerde cpu log dizin yapısından ufak farklılıklar olabilir ancak 2. yöntemle linux kullanan tüm cihazlarda cpu sıcaklık değeri öğrenebiliriz.

basit bir örnekle raspberry pi üzerinde rrdtool kullanımı

rrdtool un kullanma mantığının temel olarak

  • veri tabanının  oluşturulması.
  • veriyi toplayacak yazılımın gerçekleştirilmesi
  • düzenli aralıklarla bu veriyi toplanması ve veri tabanına eklenmesi
  • veri tabanına giriş yapıldıktan sonra görüntülenmesi istenilen grafikleri oluştur
  • oluşturulan grafiklerin görüntüleneceği bir arayüz  meydana getirilmesi

adımlarından oluşturuğu söylenebilir. şimdi bu adımları uygulayacağımız basit bir sıcaklık uygulaması örneği yapalım. rrd uygulamamızda kullanacağımız rdd veri tabanı yapısını oluşturalım.

#!/bin/bash
rrdtool create sicaklik_rrd.rrd --start N --step 300 \
DS:sicaklik_veri:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365

sıra geldi veri toplama ve elde edilen veriyi veritabanına ekleyecek yazılım kısmına.

#!/bin/bash
DIZIN="/var/www/sicaklik"

sicaklik ="curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'";

$rrd = `/usr/bin/rrdtool update $DIZIN/sicaklik_rrd.rrd N:$sicaklik`;

ile kayseri-erkilet için sıcaklık bilgisi çekilerek rrd dosyasına ekleniyor. şimdi sıra bu işlemi otomatik olarak yaptırmaya geldi.

pi@raspberrypi $ cat /etc/crontab 
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/5 *  * * *   root    /var/www/sicaklik/sicaklik.sh

artık 5 dakikada bir bu script çalışarak rrd veritabanı dosyamız güncellenecek. şimdi sıra veritabanından kullanacağımız grafiklerin oluşturulmasına geldi.

#!/bin/bash
DIZIN="/var/www/sicaklik"

sicaklik_birimi="C"
sicaklik_cizgi_rengi="#0000FF"

#saat
rrdtool graph $DIZIN/sicaklik_saat.png --start -4h \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]" \
GPRINT:sicaklik_veri:LAST:"Anlik Sicaklik\:%8.2lf %s"

#gun
rrdtool graph $DIZIN/sicaklik_gun.png --start -1d \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]" \
GPRINT:sicaklik_veri:LAST:"Anlik Sicaklik\:%8.2lf %s" \
GPRINT:sicaklik_veri:MAX:"Maksimum Sicaklik\:%8.2lf %s" \
GPRINT:sicaklik_veri:MIN:"Minimum Sicaklik\:%8.2lf %s"

#hafta
rrdtool graph $DIZIN/sicaklik_hafta.png --start -1w \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

#ay
rrdtool graph $DIZIN/sicaklik_ay.png --start -1m \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

#yil
rrdtool graph $DIZIN/sicaklik_yil.png --start -1y \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

artık işlem neredeyse bitti. burada grafik oluşturmayı farklı bir dosya gibi gösterdim ancak sicaklik verisini çektiğimiz ve veritabanına eklediğimiz script içinde olması işimi kolaylaştıracaktır. aksi halde bu dosyası da belirli zaman aralıkları ile çalıştırmamız gerekecektir.

şimdi sıra oluşturdugumuz grafikleri göstereceğimiz html dosyasını oluşturmaya geldi.



  

Raspberry Pi ile RRD örneği

Last Modified: < ?=$lastmod?>

Hourly

Daily

Weekly

Monthly

Yearly

olay aslında bu kadar basit. daha dinamik bir arayüz vb istiyorsak yapımızı buna göre oluşturmamız gerekmektedir. elde edeceğimiz günlük grafik ise aşağıdaki gibi olacaktır.

sicaklik_gun

hava durumu : linux komut satırı

linuxde komut satırından hava durumu bilgisine nasıl ulaşacağımızı ve bunu nasıl kullanacağımıza bakalım.

ücretli ve ücretsiz olarak hava durumu bilgisini sunan bir çok servis mevcut. yük doğruluk lu veri istiyorsanız bir miktar ücreti gözden çıkarmanız da fayda var. bu örnekte “National Weather Service” tarafından herkese açık olan kaynaklardan faydalanacağız. akıllı telefonlar ile hava durumu uygulamaları oldukça popüler hale geldi. her cihazda arka planda çalışan bir hava durumu uygulaması mevcut. bu şekilde bir uygulama yapmak geçiyorsa aklınızdan yapılacak temel işlemler aynı.

http://weather.noaa.gov/weather/TR_cc.html adresinden ülkemizde bilgi alınabilecek yerlerin listesini bulabilirsiniz. ben örneğimde Kayseri – Erkilet havaalanı için verileri kullanacağım.  http://weather.noaa.gov/weather/current/LTAU.html adresinden  gün sayfalara ulaşabilirsiniz. burada LTAU kodu istasyona ait verilmiş özel bir kod.

buradaki kullanılan dosya formatları konusunda  http://www.ofcm.gov/fmh-1/fmh1.htm adresinden detaylı bilgi alabilirsiniz.

biz tabiki bu html dosyasını kullanmayacağız. yukarıda belirtilen standart çerçevesinde  http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.txt  adresinde dosya her 5 dakika bir güncellenmektedir.

2015/07/05 14:20
LTAU 051420Z 27007KT 240V300 9999 FEW040 28/08 Q1016 NOSIG

dosyanın içeriği yukarı şekilde. 28/08 yazan kısımdaki 28 bizim sıcaklık değerimiz. bu verinin doğruluğunu kontrol etmek için akıllı telefondan alınan ekran görüntüsünüde aşağıda paylaşalım

2015-07-05-17-45-54-1_resized

şimdi sıra LTAU.TXT dosyasından veriyi almak gerekli scripti yazmaya geldi.

curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2}/M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'

ben yukarıdaki gibi bir script yazdım. sizde farklı yöntemlerle istediğiniz veriyi ( nem, rüzgar gibi ) tabiki alabilirsiniz..

pi@raspberrypi ~ $ curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
> grep -Po ' M?\d{2}/M?\d{2} ' |  \
> sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'
 28 
pi@raspberrypi ~ $

bu veriyi raspberry ile yapacağımız diğer uygulamalarda kullanacağımız için not etmekte fayda var.

raspberry pi – raspbian ssh aktif edilmesi

raspberry ile çalışıyorsanız ssh in aktif olması olmazsa olmazlardan biridir. şimdi raspberry üzerine ssh sunucusu nasıl aktif edeceğimize bakalım.

raspberry nin konfigürasyon arayüzünü aktif çalıştıralım. bu arayüz ile konfigürasyon dosyaları ile uğraşmaya gerek kalmayacak. yazılım sürümüne göre ekran görüntüleri farklılık gösterebilir.

pi@raspberrypi ~ $ sudo raspi-config

açılan arayüzden “advanced options” seçilir

raspiconfigssh1

yeni açılan pencereden ssh seçilerek
raspiconfigssh2

açılan pencereler takip edilerek ssh aktif edilir.

raspiconfigssh3

raspiconfigssh4

ssh ımız aktif oldu. artk arayüzden “finish” diyerek çıkabilir.

raspiconfigssh5

arayüzden çıktıktan sonra komut satırını aşagıdaki şekilde göreceğiz.

pi@raspberrypi ~ $ sudo raspi-config 
update-rc.d: using dependency based boot sequencing
[ ok ] Starting OpenBSD Secure Shell server: sshd.

herşey güzel.. gerçekten ssh sunucumuz aktif mi kontrol edelim.

pi@raspberrypi ~ $ /etc/init.d/ssh status 
[ ok ] sshd is running.

ile sunucumuzun çalıştığı bilgisi alıyoruz. ip bilgisini ögrenelim ve gerçek bağlantı testimizi yapalım.

pi@raspberrypi ~ $ ifconfig
eth0 Link encap:Ethernet HWaddr 11:11:11:11:11:11
 inet addr:192.168.2.37 Bcast:192.168.2.255 Mask:255.255.255.0
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 RX packets:777 errors:0 dropped:1 overruns:0 frame:0
 TX packets:557 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
 RX bytes:60040 (58.6 KiB) TX bytes:89779 (87.6 KiB)

bundan sonra ssh bağlantımızı yapalım…

[c:\~]$ ssh pi@192.168.2.37


Connecting to 192.168.2.37:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Linux raspberrypi 3.18.11+ #781 PREEMPT Tue Apr 21 18:02:18 BST 2015 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jun 30 20:39:17 2015 from fcicek.local


pi@raspberrypi ~ $

artık raspberry de diğer işlerle uğraşabiliriz.

linux – ip adresinin öğrenilmesi

linux de bir ethernet arayüzünün ip adresinin ifconfig çıktısından inceleyerek bulabiliriz. ancak nokta atışı yapılması gereken zamanlar olabilir.

aşagıdaki örnekte adım adım incelenebilir.

fcicek@ubuntu:~$ ifconfig eth0 
eth0      Link encap:Ethernet  HWaddr 00:0c:29:68:00:00  
          inet addr:192.168.126.128  Bcast:192.168.126.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe68:0000/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:388668 errors:0 dropped:0 overruns:0 frame:0
          TX packets:226787 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:506708018 (506.7 MB)  TX bytes:22826593 (22.8 MB)
fcicek@ubuntu:~$ ifconfig eth0 | grep 'inet addr:'
          inet addr:192.168.126.128  Bcast:192.168.126.255  Mask:255.255.255.0
fcicek@ubuntu:~$ ifconfig eth0 | grep 'inet addr:' | awk '{print$2}' 
addr:192.168.126.128
fcicek@ubuntu:~$ ifconfig eth0 | grep 'inet addr:' | awk '{print$2}' | cut -d: -f2
192.168.126.128
Back To Top