Ana içeriğe atla

systemd kullanan linux sunucularında servislerin kullandığı limitlerin ayarlanması

Kullandığımız güncel linux dağıtımlarının hepsi neredeyse systemd kullanıyor ve servislerimizin limitleri, özellikle redis/apache/nginx/php gibi, standart ayarlarda olursa zaman zaman keyfimisi kaçırabiliyor.

Bundan dolayı varsayılan sistem limitlerine takılmamak için limitleri artırabiliriz. Örnek olarak redis servisi ile ilgili limiti artıralım.


systemd ayar dosyasına ekleyebileceğimiz parametreler,

LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=,
LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME=
   These settings set both soft and hard limits of various resources for executed processes.
   See setrlimit(2) for details. Use the string infinity to configure no limit on a specific resource.

   Table 1. Limit directives and their equivalent with ulimit
   ┌────────────────┬───────────────────┐
   │Directive       │ ulimit equivalent │
   ├────────────────┼───────────────────┤
   │LimitCPU        │ ulimit -t         │
   ├────────────────┼───────────────────┤
   │LimitFSIZE      │ ulimit -f         │
   ├────────────────┼───────────────────┤
   │LimitDATA       │ ulimit -d         │
   ├────────────────┼───────────────────┤
   │LimitSTACK      │ ulimit -s         │
   ├────────────────┼───────────────────┤
   │LimitCORE       │ ulimit -c         │
   ├────────────────┼───────────────────┤
   │LimitRSS        │ ulimit -m         │
   ├────────────────┼───────────────────┤
   │LimitNOFILE     │ ulimit -n         │
   ├────────────────┼───────────────────┤
   │LimitAS         │ ulimit -v         │
   ├────────────────┼───────────────────┤
   │LimitNPROC      │ ulimit -u         │
   ├────────────────┼───────────────────┤
   │LimitMEMLOCK    │ ulimit -l         │
   ├────────────────┼───────────────────┤
   │LimitLOCKS      │ ulimit -x         │
   ├────────────────┼───────────────────┤
   │LimitSIGPENDING │ ulimit -i         │
   ├────────────────┼───────────────────┤
   │LimitMSGQUEUE   │ ulimit -q         │
   ├────────────────┼───────────────────┤
   │LimitNICE       │ ulimit -e         │
   ├────────────────┼───────────────────┤
   │LimitRTPRIO     │ ulimit -r         │
   ├────────────────┼───────────────────┤
   │LimitRTTIME     │ No equivalent     │
   └────────────────┴───────────────────┘
redis-server servisini düzenleme modunda açarak, Service altında istediğimiz limitleri ayarlarız.
root@xrv:~# systemctl edit --force --full redis-server

[Service]
...
LimitNOFILE=65535
LimitNPROC=65535
Dikkat etmemiz gereken nokta limit değişkenlerinin service bölümünde olmasıdır.
Bu işlem bittikten sonra yaptığımız değişikliği saklayarak çıkarız.
Sonrasında  systemd nin değişiklikten haberi olması için;
systemctl daemon-reload 
ve son olarakta servisi yeniden (stop/start veye restart) başlatırız.

systemctl restart redis-server
veya
root@xrv:~# systemctl show redis-server -p LimitNPROC
LimitNPROC=126794
root@xrv:~# systemctl show redis-server -p LimitNOFILE
LimitNOFILE=65535
root@xrv:~# 


İlave olarak cpu/memory/disk limitlemesi için cpu/memory/block accounting kullanılabilir.
Bunun için konsoldan yapmamız gerekenler;


# systemctl set-property example.service MemoryAccounting=yes
#
# cat /sys/fs/cgroup/memory/system.slice/example.service/memory.limit_in_bytes
2147483648



systemctl set-property pacemaker.service MemoryAccounting=yes
systemctl set-property pacemaker.service MemoryLimit=2048M
 
Yukarıdaki önemli nokta, pacemakerın çalıştıracağı servislerin kullanabileceği toplam hafızı 2048MB olabileceği. 
Çalıştırılan servisler dikkate alınarak kullanılabilecek hafıza üst sınırı  ayarlanmalı.

İşlemci için ise;
 
systemctl set-property pacemaker.service CPUAccounting=yes
systemctl set-property pacemaker.service CPUQuota=90%

Pacemaker ve altındaki servislerin kullanabileceği toplam işlemci gücü 90% geçemez.

Alternatif olarakda CPUShares kullanabiliriz;
systemctl set-property corosync.service CPUShares=1024
1024 bir çekirdek kullanabileceğimiz anlamına geliyor.
Daha fazla çekirdek kullanmak istiyorsak 1024xçekirdek sayısı şeklinde düşünebiliriz.


Bir başka limitleme konusuda kullanıcı işlemlerlerine direk limit koyabiliriz.
Aşağıdaki komut ile postgres kullanıcısının cpu kullanımını sınırlandırıyoruz.

systemctl edit --force  user-$(id -u postgres).slice
[Slice]
CPUQuota=10%

işlemlerimizin sonucunu 
                          systemd-cgls
                          systemd-cgtop
                          lscgroup
komutlarıyla takip edebiliriz.


Yorumlar

Bu blogdaki popüler yayınlar

ttnet tilgin hg1332 modem(router) kablosuz özelliğini güçlendirmek

Bu gün ttnetin hediyesi olan tilgin yönlendiriciyle biraz oynayayım dedim Matkap, ve rg316-rp-sma kablo alıp cihazın kapağını tekrar açtım. Matkapla usb çıkışın yanına bir delik açarak kaployu taktım. Sonra elimdeki antenlerden ikiti tanesini takıp test ettim. . Bu iki antenin, gözle farkedilir derecede sinyalleri kuvvetlendirdiğini fark ettim.. Normalde bu cihaz ile evin iki en uc noktaları arasında haberleşme olmaz iken şimdi en kör iki uç arasında sorun olmadan kablosuz kullanılabildiğini gördüm. Arada 4 tane kuvvetli beton duvar mevcut. Deneme bitti, tilgin rafa kalktı yine. Her nekadar ben bu cihazı kaldırsamda, kullanmak zorunda olan arkadaşlar, bir kablo ve ikitane anten takarak her herde kullanabilirler. İyi eğlenceler.

yerel ssl ca sertifikasını güvenli sertifika olarak kabul etmek. (özet tekrar)

  openssl s_client  -connect akyuz.tech:443 -showcerts > /tmp/akyuz.tech.cacrt keytool -import -alias akyuz.tech  -keystore  /etc/pki/ca-trust/extracted/java/cacerts -file /tmp/akyuz.tech.cacrt /etc/pki/ca-trust/extracted/java/cacerts dosyası varsayılan java için varsayılan ca cert dosyasıdır.   cp -iv /tmp/akyuz.tech.cacrt /etc/pki/ca-trust/source/anchors/ update-ca-trust     DOMAIN=akyuz.tech openssl s_client -showcerts -connect ${DOMAIN}:443 </dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' > ${DOMAIN}.cert