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.
# 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
Alternatif olarakda CPUShares kullanabiliriz;
systemctl set-property corosync.service CPUShares=1024
systemctl edit --force user-$(id -u postgres).slice
[Slice]
CPUQuota=10%
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%
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
Yorum Gönder