16 Haziran 2020 Salı

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.


Hiç yorum yok:

Yorum Gönder