Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Linux Control Groups (cgroups) ile MySQL ve Redis Süreçlerinin CPU ve RAM Kullanımını Sınırlama

asteron

Üye
Katılım
14 Mart 2026
Mesajlar
42
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:

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

🔗 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:

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

⚠️ 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.

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.

🧪 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:

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

💡 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.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri