Merhaba arkadaşlar, bugün sizlere özellikle paylaşımlı sunucu (VPS) ortamlarında veya kaynakların sıkı kontrol edilmesi gereken durumlarda hayat kurtarıcı bir araçtan, Control Groups (cgroups)'dan bahsedeceğim. Bazen MySQL veya Redis gibi servisler anlık olarak tüm CPU ve RAM'i tüketip, sunucunuzu kitleyebilir. cgroups ile bu süreçlerin kaynak kullanımını proaktif olarak sınırlayarak, sisteminizin stabil kalmasını sağlayabilirsiniz. Ben de kendi sunucularımda kritik servisler için mutlaka bu yapılandırmayı kullanıyorum.
cgroups Nedir ve Neden Önemli?
cgroups (control groups), Linux çekirdeğinin bir özelliği olup, bir grup sürecin kaynak kullanımını (CPU, bellek, disk I/O, ağ) sınırlamanıza, ölçmenize ve izole etmenize olanak tanır. systemd ile entegre çalıştığı için günümüz sistemlerinde (Ubuntu 18.04+, CentOS 7+ gibi) yapılandırması oldukça kolaydır. Temel amacı, "gürültülü komşu" problemini önlemek ve kaynak garantisi sağlamaktır.
MySQL ve Redis için systemd Slice Dosyası Oluşturma
İlk adım olarak, MySQL ve Redis servislerimiz için özel kaynak limitleri tanımlayan bir systemd "slice" dosyası oluşturacağız. Bu slice, bu servislere ait tüm süreçleri kapsayacak.
Aşağıdaki komut ile slice yapılandırma dosyamızı oluşturalım:
Dosyanın içerisine aşağıdaki yapılandırmayı yapıştırıyoruz. Bu örnekte, bu slice'a ait süreçlerin toplamda en fazla %80 CPU ve 4GB RAM kullanmasını, swap ile birlikte maksimum 4.5GB'a çıkabilmesini sınırlıyoruz. Değerleri kendi sunucunuzun kapasitesine göre ayarlamayı unutmayın.
Dosyayı kaydedip çıktıktan sonra systemd'yi yeniden yükleyelim:
Servisleri Oluşturduğumuz Slice'a Bağlama
Şimdi sıra, mevcut MySQL (veya MariaDB) ve Redis servislerimizi, oluşturduğumuz bu slice'a yönlendirmeye geldi. Her bir servis için systemd "override" konfigürasyonu oluşturacağız.
Öncelikle MySQL/MariaDB servisi için:
Açılan editörde aşağıdaki satırları ekleyip kaydedin:
Aynı işlemi Redis servisi için de tekrarlıyoruz:
Aynı içeriği bu dosyaya da ekliyoruz:
Dikkat Edilmesi Gerekenler ve Servisleri Yeniden Başlatma
Bu ayarların etkin olması için ilgili servisleri yeniden başlatmamız gerekiyor. Ancak dikkatli olun, bu işlem MySQL ve Redis'in kısa bir süreliğine durmasına neden olur. Bakım pencerenizde yapmanız önemli.
Status komutu ile her iki servisin de çalıştığından ve CGroup satırında /mysql-redis.slice ifadesini gördüğünüzden emin olun.
Limitlerin Doğrulanması
Ayarlarımızın çalışıp çalışmadığını kontrol etmek için birkaç yol var. En pratiği, sistem yükünü takip etmek veya doğrudan cgroups dosya sistemini incelemek.
Çalışan slice'ımızın mevcut kaynak kullanımını memory alt sistemi üzerinden kontrol edelim:
CPU limitini kontrol etmek için ise:
Ek İpuçları ve Optimizasyon
/etc/systemd/system/mysql-redis.slice dosyasına CPUWeight veya IOWeight gibi direktifler ekleyerek CPU ve Disk I/O önceliği de verebilirsiniz.
Eğer bir servis bellek limitine (MemoryMax) ulaşırsa, Linux çekirdeği bu süreci OOM (Out Of Memory Killer) tarafından sonlandırılabilir hale getirir. Bu nedenle limitleri makul ve servisin minimum ihtiyaçlarının üzerinde belirleyin.
Tüm sistemi kapsayan bir kaynak izleme için `systemd-cgtop` komutunu kullanabilirsiniz. Bu, `top` komutunun cgroups versiyonu gibidir.
Sonuç olarak, cgroups ile yapacağınız bu basit yapılandırma, sunucu stabilitesi için büyük bir fark yaratacaktır. Özellikle aynı sunucuda birden fazla uygulama çalıştırıyorsanız, kaynak çakışmalarını önlemenin en temiz yollarından biridir.
Peki siz bu tarz kaynak sınırlamalarını kendi sunucularınızda nasıl yapıyorsunuz? cgroups dışında farklı yöntemler kullanan var mı? Takıldığınız bir nokta veya eklemek istediğiniz bir ipucu olursa aşağıya yazmaktan çekinmeyin.
cgroups (control groups), Linux çekirdeğinin bir özelliği olup, bir grup sürecin kaynak kullanımını (CPU, bellek, disk I/O, ağ) sınırlamanıza, ölçmenize ve izole etmenize olanak tanır. systemd ile entegre çalıştığı için günümüz sistemlerinde (Ubuntu 18.04+, CentOS 7+ gibi) yapılandırması oldukça kolaydır. Temel amacı, "gürültülü komşu" problemini önlemek ve kaynak garantisi sağlamaktır.
İlk adım olarak, MySQL ve Redis servislerimiz için özel kaynak limitleri tanımlayan bir systemd "slice" dosyası oluşturacağız. Bu slice, bu servislere ait tüm süreçleri kapsayacak.
Aşağıdaki komut ile slice yapılandırma dosyamızı oluşturalım:
Bash:
sudo nano /etc/systemd/system/mysql-redis.slice
Dosyanın içerisine aşağıdaki yapılandırmayı yapıştırıyoruz. Bu örnekte, bu slice'a ait süreçlerin toplamda en fazla %80 CPU ve 4GB RAM kullanmasını, swap ile birlikte maksimum 4.5GB'a çıkabilmesini sınırlıyoruz. Değerleri kendi sunucunuzun kapasitesine göre ayarlamayı unutmayın.
INI:
[Unit]
Description=MySQL and Redis Resource Limit Slice
[Slice]
CPUQuota=80%
MemoryMax=4G
MemorySwapMax=500M
Dosyayı kaydedip çıktıktan sonra systemd'yi yeniden yükleyelim:
Bash:
sudo systemctl daemon-reload
Şimdi sıra, mevcut MySQL (veya MariaDB) ve Redis servislerimizi, oluşturduğumuz bu slice'a yönlendirmeye geldi. Her bir servis için systemd "override" konfigürasyonu oluşturacağız.
Öncelikle MySQL/MariaDB servisi için:
Bash:
sudo systemctl edit mysql
# Eğer MariaDB kullanıyorsanız: sudo systemctl edit mariadb
Açılan editörde aşağıdaki satırları ekleyip kaydedin:
INI:
[Service]
Slice=mysql-redis.slice
Aynı işlemi Redis servisi için de tekrarlıyoruz:
Bash:
sudo systemctl edit redis-server
# Bazı dağıtımlarda servis ismi 'redis' olabilir.
Aynı içeriği bu dosyaya da ekliyoruz:
INI:
[Service]
Slice=mysql-redis.slice
Bu ayarların etkin olması için ilgili servisleri yeniden başlatmamız gerekiyor. Ancak dikkatli olun, bu işlem MySQL ve Redis'in kısa bir süreliğine durmasına neden olur. Bakım pencerenizde yapmanız önemli.
Bash:
sudo systemctl restart mysql redis-server
sudo systemctl status mysql redis-server
Status komutu ile her iki servisin de çalıştığından ve CGroup satırında /mysql-redis.slice ifadesini gördüğünüzden emin olun.
Ayarlarımızın çalışıp çalışmadığını kontrol etmek için birkaç yol var. En pratiği, sistem yükünü takip etmek veya doğrudan cgroups dosya sistemini incelemek.
Çalışan slice'ımızın mevcut kaynak kullanımını memory alt sistemi üzerinden kontrol edelim:
Bash:
cat /sys/fs/cgroup/memory/mysql-redis.slice/memory.current
cat /sys/fs/cgroup/memory/mysql-redis.slice/memory.max
CPU limitini kontrol etmek için ise:
Bash:
cat /sys/fs/cgroup/cpu/mysql-redis.slice/cpu.max
/etc/systemd/system/mysql-redis.slice dosyasına CPUWeight veya IOWeight gibi direktifler ekleyerek CPU ve Disk I/O önceliği de verebilirsiniz.
Eğer bir servis bellek limitine (MemoryMax) ulaşırsa, Linux çekirdeği bu süreci OOM (Out Of Memory Killer) tarafından sonlandırılabilir hale getirir. Bu nedenle limitleri makul ve servisin minimum ihtiyaçlarının üzerinde belirleyin.
Tüm sistemi kapsayan bir kaynak izleme için `systemd-cgtop` komutunu kullanabilirsiniz. Bu, `top` komutunun cgroups versiyonu gibidir.
Sonuç olarak, cgroups ile yapacağınız bu basit yapılandırma, sunucu stabilitesi için büyük bir fark yaratacaktır. Özellikle aynı sunucuda birden fazla uygulama çalıştırıyorsanız, kaynak çakışmalarını önlemenin en temiz yollarından biridir.
Peki siz bu tarz kaynak sınırlamalarını kendi sunucularınızda nasıl yapıyorsunuz? cgroups dışında farklı yöntemler kullanan var mı? Takıldığınız bir nokta veya eklemek istediğiniz bir ipucu olursa aşağıya yazmaktan çekinmeyin.