10 Nisan 2022 Pazar

RHEL 7.X/8.X/9.X veya RHEL 7.X/8.X/9.X tabanlı linux sistemlerde kaynak yönetimi ( cpu/memory/io yönetimi)

 

 Günümüzde bazı sunucuların üzerinde birden çok uygulama veya çözümü beraber kullanmak zorunda kalıyoruz. Böyle durumlarda sistem kaynaklarını uygulamalar arasında uygun bir şekilde paylaştırmak zorunda kalıyoruz.

Örneğin bir sunucu üzerinde web ve  database uygulamasını aynı anda kullanıyoruz, fakat zaman zaman web, zaman zman database sistemin tamamen tıkanmasına neden oluyor. Çözüm olarak sistem işlemci kaynağının %50 database, %25 web uygulamasına, %25 sshd ihtiyaçları için kullanılacak şekilde kaynak kullanım planlanması olabilir. Bu işlemi nasıl yapabiliriz?

Asagidaki link baslangic noktamiz olabilir.

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/setting-limits-for-applications_managing-monitoring-and-updating-the-kernel


Yukarıda belirttlen ihtiyaçları karşılamanın birden çok çözümü olduğunu unutmayın. 

Unutmamamınz  önemli bir nokta güncel sistemlerde (rhel 7/8/9 veya türevleri) uygulamaya veya kullanıcıya limit vermek için /etc/security/limits.con veya /etc/security/limits.d/*.conf dosyalarının kullanılamayacağı. Örneğin /etc/security/limits.conf ile bir kullanıcıya limit verirseniz ve kullanıcı ssh ile sisteme bağlanırsa verdiğiniz limit bir işe yaramaz. Systemd tarafından varsayılan değer ne ise o kullanılır...

Aşağıda anlatacaklarım çözüm yollarından sadece bir tanesi ve kullanılması gereken yöntem;

öncelikle database, web ve ssh servisinin bir slice altında tutacağız. Bunun için aşağıdaki gibi dosya oluşturalım.


[root@rhel8 system]# cat /etc/systemd/system/uygulamaservisi.slice
[unit]
Description=Uygulama hizmeti icin (Web + Database) servisi slice

[Slice]
CPUShare=1536
CPUAccounting=yes


[root@rhel8 system]#

[root@rhel8 system]# grep -A20 Unit /etc/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
Wants=httpd-init.service
After=network.target remote-fs.target nss-lookup.target httpd-init.service
Documentation=man:httpd.service(8)

[Service]
Type=notify
Environment=LANG=C

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
Slice=uygulamaservisi.slice
CPUShares=256

root@rhel8 system]# grep -A20 Unit /etc/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
Slice=uygulamaservisi.slice
CPUShares=256
LimitNOFILE=128



root@rhel8 system]# grep -A20 Unit /etc/systemd/system/mariadb.service
[Unit]
Description=MariaDB 10.5 database server
Documentation=man:mysqld(8)
Documentation=https://mariadb.com/kb/en/library/systemd/
After=network.target

[Install]
WantedBy=multi-user.target
Alias=mysql.service
Alias=mysqld.service

[Service]
Slice=uygulamaservisi.slice
CPUShares=1024
LimitNOFILE=512
...

ssh,http,mariadb için toplam 1536 cpushares kullanılmış durumda.

Bir çekirdek 1024 cpushares olarak kabul ediliyor.

Yurakıdaki ayarlamalardan sonra systemctl daemon-reload ile güncellemelerin systemd tarafında algılanmasını sağlayıp, sonrasında servisleri yeniden başlatmamız yeterli.

İşlemci kullanımını paylaştırdıktan sonra ram kullanımınıda paylaştırmak istersek aşağıdaki işlemleri kullanabiliriz.



[root@rhel8 memory]# tree  -L 1 -d /sys/fs/cgroup/memory
/sys/fs/cgroup/memory
├── init.scope
├── system.slice
├── user.slice
└── uygulamaservisi.slice

4 directories
[root@rhel8 memory]# tree  -L 1 -d /sys/fs/cgroup/memory/uygulamaservisi.slice
/sys/fs/cgroup/memory/uygulamaservisi.slice
├── httpd.service
├── mariadb.service
└── sshd.service

3 directories
[root@rhel8 memory]#


systemd-cgls ile kontrol yaptığımızda aşağıdakilerini görürüz.


[root@rhel8 system]# systemd-cgls 
Control group /:
-.slice
├─user.slice
│ └─user-0.slice
│   ├─session-1.scope
│   │ ├─1886 sshd: root [priv]
│   │ ├─1900 sshd: root@pts/0
│   │ ├─1901 -bash
│   │ └─1984 systemd-cgls
│   └─user@0.service
│     └─init.scope
│       ├─1891 /usr/lib/systemd/systemd --user
│       └─1894 (sd-pam)
├─init.scope
│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
├─system.slice
│ ├─irqbalance.service
│ │ └─903 /usr/sbin/irqbalance --foreground
│ ├─libstoragemgmt.service
│ │ └─900 /usr/bin/lsmd -d
│ ├─systemd-udevd.service
│ │ └─774 /usr/lib/systemd/systemd-udevd
│ ├─polkit.service
│ │ └─899 /usr/lib/polkit-1/polkitd --no-debug
│ ├─chronyd.service
│ │ └─909 /usr/sbin/chronyd
│ ├─auditd.service
│ │ ├─874 /sbin/auditd
│ │ └─876 /usr/sbin/sedispatch
│ ├─tuned.service
│ │ └─951 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
│ ├─php-fpm.service
│ │ ├─ 956 php-fpm: master process (/etc/php-fpm.conf)
│ │ ├─1036 php-fpm: pool www
│ │ ├─1037 php-fpm: pool www
│ │ ├─1038 php-fpm: pool www
│ │ ├─1039 php-fpm: pool www
│ │ └─1040 php-fpm: pool www
│ ├─systemd-journald.service
│ │ └─738 /usr/lib/systemd/systemd-journald
│ ├─atd.service
│ │ └─1311 /usr/sbin/atd -f
│ ├─crond.service
│ │ └─1309 /usr/sbin/crond -n
│ ├─NetworkManager.service
│ │ └─940 /usr/sbin/NetworkManager --no-daemon
│ ├─rsyslog.service
│ │ └─1304 /usr/sbin/rsyslogd -n
│ ├─firewalld.service
│ │ └─923 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
│ ├─qemu-guest-agent.service
│ │ └─898 /usr/bin/qemu-ga --method=virtio-serial --path=/dev/virtio-ports/or...
│ ├─sssd.service
│ │ ├─904 /usr/sbin/sssd -i --logger=files
│ │ ├─920 /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 -...
│ │ └─924 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files
│ ├─rhsmcertd.service
│ │ └─955 /usr/bin/rhsmcertd
│ ├─mcelog.service
│ │ └─907 /usr/sbin/mcelog --ignorenodev --daemon --foreground
│ ├─dbus.service
│ │ └─902 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfi...
│ ├─system-getty.slice
│ │ └─getty@tty1.service
│ │   └─1336 /sbin/agetty -o -p -- \u --noclear tty1 linux
│ ├─smartd.service
│ │ └─901 /usr/sbin/smartd -n -q never
│ └─systemd-logind.service
│   └─931 /usr/lib/systemd/systemd-logind
└─uygulamaservisi.slice
  ├─mariadb.service
  │ └─1033 /usr/libexec/mysqld --basedir=/usr
  ├─sshd.service
  │ └─954 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly130...
  └─httpd.service
    ├─1301 /usr/sbin/httpd -DFOREGROUND
    ├─1392 /usr/sbin/httpd -DFOREGROUND
    ├─1393 /usr/sbin/httpd -DFOREGROUND
    ├─1394 /usr/sbin/httpd -DFOREGROUND
    └─1396 /usr/sbin/httpd -DFOREGROUND
[root@rhel8 system]#

Günün sonunda tüm servisler belirlenen kaynakları kullanır, belirtilen dışına çıkamazlar. Böylelikle çok yoğun bir kullanımda bile yavaşda olsa, ssh, web, db ye erişebiliriz. 

Sistem çalışma anındaki kullanımı ise systemd-cgtop ile izleyebiliriz.

Aktif olarak kullanılan limitleri;

   systemctl show -p ozellik service 

şeklinde sorgulayabiliriz.  

[root@rhel8 system]#    systemctl show -p CPUShares sshd.service
CPUShares=256
[root@rhel8 system]#


[root@rhel8 system]#    systemctl show -p MemoryLimit sshd.service
MemoryLimit=268435456
[root@rhel8 system]#
 

Detaylı bilgi için 

                           man systemd-cgls  

                         man systemd-cgtop

 




Hiç yorum yok:

Yorum Gönder

ansible ile yerel quay sunucusu üzerinden execution environment kullanımı

 Yerel quay veya registry sunucularımızdaki ee leri ansible ile kullanabiliyoruz. Bunun için kendi yaptığımız ee leri veya hazır ee leri yük...