ssh servisinin ram tükensede çalışmasını istemek ( oom killer ve ssh ) ve ssh ile sisteme bağlanan kişilerin sistem kaynağını tüketmesini önlemek
It is the job of the linux 'oom killer' to sacrifice one or more processes in order to free up memory for the system when all else fails. It will also kill any process sharing the same mm_struct as the selected process, for obvious reasons. Any particular process leader may be immunized against the oom killer if the value of its /proc/<pid>/oomadj is set to the constant OOM_DISABLE (currently defined as -17).
Genelde ram tükendiğinde oom killer çalışan normal işlemleri öldürmeye başlar.
sshd islemlerinin oom_adj parametresini kontrol ettigimizde,
pgrep sshd | while read PID; do echo $PID;cat /proc/$PID/oom_adj;done
1244
-17
6425
0
ssh servisine kural ve sshd dokunma diyoruz.
~# cat /etc/systemd/system/sshd.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
DefaultLimitNICE=-19
OOMPolicy=continue
OOMScoreAdjust=-1000
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd.service
#
# systemctl daemon-reload
# systemctl restart sshd
# pgrep sshd | while read PID; do echo $PID;cat /proc/$PID/oom_adj;done
8409
-17
8454
-17
#
Artık sshd islemleri oom kiler tarafindan öldürülmeyecektir.
OOM score 1000 ile -1000 arasında değişir. Varsayılan değer 0 dır.
-1000 öldürülemez anlamındadır.
ssh ile ilgili bir başka sorunda sisteme bağlanan kullanıcıların limitleri.
rhel7/8/9 sistemlerinde /etc/security/limits.conf veya /etc/security/limits.d/ dizini altında oluşturacağım ayarlar ssh kullanıcıları için etkili olmayacaktır. ssh ile bağlanan kullanıcıların limitleri systemd tarafından belirlenmektedir(1).
Her hangi bir kullanıcının cpu veya sistem kaynağını tüketmesini önlemenin en güvenli yöntemi user.slice limitlemektedir. Tek tek kullanıcıya limit verilebileceği gibi genel limitde belirlenebilir. Aşağıdaki örnekte tüm kullanıcılar için limit ayarlama gösterilmiştir.
Örneğimizde kullanıcıların 2 çekirdek(her bir çekirde 100% olarak kabul edilir) ve en fazla 2GB kullanabilecek şekilde ayarlanıyor.
# systemctl set-property user.slice CPUAccounting=yes
# systemctl set-property user.slice CPUQuota=200%
# systemctl set-property user.slice MemoryAccounting=yes
# systemctl set-property user.slice MemoryLimit=2G
Kullanıcıların limitleri hakkında detaylı bilgi almak için systemctl status user.slice inceleyebilirsiniz.
Bu kullanıcılar ile ilgili durum, kullanıcı ve servisleri karıştırmamak gerekiyor. Konu ile ilgili detaylı bilgi systemd, cgroup v2, rhel user.slice gibi kelimelerle araştırma yapabilirsiniz.
1. https://access.redhat.com/solutions/1257953
Yorumlar
Yorum Gönder