Kernel Parametrelerini Sysctl ile Yönetme: Rocky Linux

Sistem performansını artırmak, güvenliği sıkılaştırmak ya da ağ davranışını ince ayar yapmak istediğinde eninde sonunda sysctl ile yüzleşmek zorunda kalırsın. Rocky Linux’ta çekirdek parametrelerini yönetmek, hem anlık hem de kalıcı değişiklikler için oldukça esnek bir yapı sunuyor. Bu yazıda sysctl’i A’dan Z’ye ele alacağız; sadece teorik değil, gerçek dünya senaryoları üzerinden gideceğiz.

Sysctl Nedir ve Ne İşe Yarar?

Linux çekirdeği çalışırken binlerce parametreyi dinamik olarak yönetebilir. Bu parametreler /proc/sys/ dizini altında sanal dosya sistemi aracılığıyla erişilebilir durumdadır. sysctl komutu ise bu parametreleri okumak ve yazmak için kullanılan kullanıcı alanı aracıdır.

Basitçe söylemek gerekirse: bir sunucunun bellek yönetimini optimize etmek istiyorsan, ağ tampon boyutlarını artırmak istiyorsan ya da IPv4 forwarding’i açmak istiyorsan sysctl tam da bunun için var.

/proc/sys/ altındaki her dosya bir çekirdek parametresini temsil eder. Örneğin /proc/sys/net/ipv4/ip_forward dosyası, IPv4 paket yönlendirmeyi kontrol eder. sysctl bu dosyaları doğrudan echo komutuyla değiştirmek yerine daha temiz ve yönetilebilir bir arayüz sunar.

Temel sysctl Kullanımı

Rocky Linux’ta sysctl paketi zaten kurulu gelir, ayrıca bir şey yüklemen gerekmez. Hemen kullanmaya başlayabilirsin.

Mevcut Parametreleri Listeleme

Sistemdeki tüm çekirdek parametrelerini görmek için:

sysctl -a

Bu komut yüzlerce satır çıktı üretir. Belirli bir konuya filtre uygulamak için grep kullanabilirsin:

sysctl -a | grep net.ipv4
sysctl -a | grep vm.swappiness
sysctl -a | grep kernel.pid_max

Tek bir parametrenin değerini okumak için:

sysctl net.ipv4.ip_forward
sysctl vm.swappiness
sysctl kernel.hostname

Anlık Değişiklik Yapma

Bir parametreyi geçici olarak (sistem yeniden başlayana kadar) değiştirmek için:

sysctl -w net.ipv4.ip_forward=1
sysctl -w vm.swappiness=10
sysctl -w net.core.somaxconn=65535

Dikkat: -w ile yapılan değişiklikler sistem yeniden başladığında sıfırlanır. Kalıcı hale getirmek için yapılandırma dosyasına da yazman gerekir.

Alternatif olarak doğrudan /proc/sys/ dosyasına da yazabilirsin:

echo 1 > /proc/sys/net/ipv4/ip_forward

Bu yöntem çalışır ama sysctl kullanmak daha güvenli ve standart bir yaklaşımdır.

Kalıcı Yapılandırma: sysctl.conf ve Dostları

Rocky Linux’ta sysctl parametrelerini kalıcı hale getirmenin birkaç yolu vardır.

/etc/sysctl.conf Dosyası

Geleneksel yöntem /etc/sysctl.conf dosyasını düzenlemektir:

vim /etc/sysctl.conf

Dosya içeriği şu formatta olmalıdır:

# Ağ optimizasyonları
net.ipv4.ip_forward = 1
vm.swappiness = 10
net.core.somaxconn = 65535
net.ipv4.tcp_fin_timeout = 15

/etc/sysctl.d/ Dizini

Modern Rocky Linux kurulumlarında parçalı yapılandırma tercih edilir. /etc/sysctl.d/ dizini altında .conf uzantılı dosyalar oluşturabilirsin. Bu yaklaşım özellikle farklı servislerin kendi parametrelerini ayrı dosyalarda tutması açısından çok daha düzenli bir sonuç verir.

ls /etc/sysctl.d/
# 99-sysctl.conf -> /etc/sysctl.conf

Kendi özel yapılandırma dosyanı oluşturmak için:

vim /etc/sysctl.d/99-custom-tuning.conf

Dosya adının başındaki sayı yükleme sırasını belirler. Daha yüksek sayılar daha sonra yüklenir ve önceki değerleri ezer. Bu yüzden 99- ile başlayan dosyalar genellikle son söz sahibidir.

Değişiklikleri uygulamak için:

sysctl --system
# ya da tek bir dosya için
sysctl -p /etc/sysctl.d/99-custom-tuning.conf

Gerçek Dünya Senaryosu 1: Web Sunucusu Optimizasyonu

Diyelim ki Rocky Linux üzerinde yüksek trafik alan bir Nginx sunucusu çalıştırıyorsun. Bağlantı kuyrukları dolup taşıyor, “connection refused” hataları almaya başladın. İşte bu noktada sysctl devreye giriyor.

vim /etc/sysctl.d/99-webserver-tuning.conf
# Bağlantı kuyruğu boyutunu artır
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# TCP zaman aşımı optimizasyonu
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15

# TIME_WAIT soketlerini yeniden kullan
net.ipv4.tcp_tw_reuse = 1

# Ağ tamponu boyutlarını artır
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144

# TCP tampon boyutları
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# Ephemeral port aralığını genişlet
net.ipv4.ip_local_port_range = 1024 65535

Değişiklikleri uygula ve doğrula:

sysctl -p /etc/sysctl.d/99-webserver-tuning.conf
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_fin_timeout

Bu ayarlar özellikle Nginx veya Apache arkasında çalışan yüksek trafikli uygulamalarda ciddi fark yaratır. somaxconn değerini artırdığında Nginx’in worker_connections değerini de buna göre ayarlamayı unutma.

Gerçek Dünya Senaryosu 2: Veritabanı Sunucusu İçin Bellek Yönetimi

PostgreSQL veya MySQL çalıştıran bir sunucuda bellek ve paylaşımlı bellek parametrelerini optimize etmek kritik önem taşır.

vim /etc/sysctl.d/99-database-tuning.conf
# Shared memory limitleri (PostgreSQL için önemli)
kernel.shmmax = 17179869184
kernel.shmall = 4194304

# Swap kullanımını minimize et (veritabanı sunucularında kritik)
vm.swappiness = 1

# Dirty page oranlarını ayarla
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# Overcommit davranışını kontrol et
vm.overcommit_memory = 2
vm.overcommit_ratio = 80

# Huge pages (büyük bellek sayfaları)
vm.nr_hugepages = 512

# OOM killer davranışı
vm.panic_on_oom = 0
vm.oom_kill_allocating_task = 1

Bu parametrelerin açıklaması:

  • vm.swappiness: 0-100 arası değer alır. Düşük değerler swap kullanımını azaltır, veritabanı sunucularında 1-10 arası ideal.
  • vm.dirty_ratio: Belleğin yüzde kaçının kirli (diske yazılmamış) sayfalara ayrılabileceğini belirler.
  • vm.dirty_background_ratio: Arka planda disk yazma işleminin başlayacağı eşiği belirler.
  • vm.overcommit_memory: Bellek tahsis stratejisini kontrol eder. 2 değeri katı tahsis anlamına gelir.
  • kernel.shmmax: Tek bir paylaşımlı bellek segmentinin maksimum boyutu (byte cinsinden).

Değişikliklerden sonra sistemi kontrol et:

sysctl -p /etc/sysctl.d/99-database-tuning.conf
free -h
cat /proc/sys/vm/swappiness

Gerçek Dünya Senaryosu 3: Güvenlik Sıkılaştırması

Rocky Linux’ta güvenlik odaklı sysctl ayarları, özellikle CIS Benchmark gereksinimlerini karşılamak için yaygın olarak kullanılır.

vim /etc/sysctl.d/99-security-hardening.conf
# IP Spoofing koruması
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# ICMP redirect kabul etme
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# Secure ICMP redirect
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# Source routing devre dışı bırak
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# SYN flood koruması
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5

# ICMP broadcast yanıtlarını devre dışı bırak (Smurf attack koruması)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Hatalı ICMP yanıtlarını yoksay
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Log spoofed packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# IPv4 forwarding (router değilsen kapat)
net.ipv4.ip_forward = 0

# Magic SysRq tuşunu devre dışı bırak
kernel.sysrq = 0

# Core dump devre dışı
fs.suid_dumpable = 0

# ASLR'ı tam aktif et
kernel.randomize_va_space = 2

# ptrace kapsamını kısıtla
kernel.yama.ptrace_scope = 1

# Kernel pointer leakini önle
kernel.kptr_restrict = 2

# dmesg kısıtla
kernel.dmesg_restrict = 1

Bu güvenlik parametrelerini uyguladıktan sonra doğrulama yapman önemli:

sysctl -p /etc/sysctl.d/99-security-hardening.conf

# Kritik değerleri kontrol et
sysctl net.ipv4.tcp_syncookies
sysctl kernel.randomize_va_space
sysctl net.ipv4.conf.all.rp_filter

Gerçek Dünya Senaryosu 4: Kubernetes veya Docker Konteyneri Ortamı

Rocky Linux’u Kubernetes worker node’u olarak kullanıyorsan bazı çekirdek parametrelerini mutlaka ayarlaman gerekir.

vim /etc/sysctl.d/99-kubernetes.conf
# Kubernetes için gerekli ağ ayarları
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

# İnotify limitleri (konteyner ortamlarında sık karşılaşılan sorun)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

# PID limiti
kernel.pid_max = 4194304

# Dosya açma limitleri
fs.file-max = 2097152

# VM ayarları
vm.max_map_count = 262144

br_netfilter modülünün yüklü olduğundan emin ol, aksi halde bridge-nf-call-iptables parametresi hata verir:

modprobe br_netfilter
echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
sysctl -p /etc/sysctl.d/99-kubernetes.conf

sysctl Parametrelerini Sorun Giderme

Parametre Uygulanmıyor

Bazen sysctl -p çalıştırdığında bazı parametreler için hata alabilirsin:

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

Bu hatanın sebebi ilgili çekirdek modülünün yüklü olmamasıdır. Modülü yükle ve tekrar dene:

modprobe br_netfilter
sysctl -p /etc/sysctl.d/99-kubernetes.conf

Geçerli Değerleri Kontrol Etme

Hangi değerin nerede tanımlandığını bulmak için:

# Tüm konfigürasyon dosyalarından okunan değerleri göster
sysctl --system 2>&1 | grep vm.swappiness

# Sadece belirli bir dosyayı test et (uygulamadan)
sysctl --dry-run -p /etc/sysctl.d/99-custom-tuning.conf

Yapılandırma Dosyalarının Yüklenme Sırası

Rocky Linux’ta sysctl yapılandırma dosyaları şu sırayla okunur:

  • /usr/lib/sysctl.d/*.conf: Paketler tarafından kurulan varsayılan değerler
  • /run/sysctl.d/*.conf: Çalışma zamanı değerleri
  • /etc/sysctl.d/*.conf: Sistem yöneticisi yapılandırmaları
  • /etc/sysctl.conf: Geriye dönük uyumluluk

Daha sonra okunan dosyalar önceki değerlerin üzerine yazar. Bu yüzden /etc/sysctl.d/ altındaki dosyaların adlandırmasında sayısal öneki doğru kullanmak önemlidir.

systemd-sysctl Servisi

Rocky Linux’ta sysctl parametreleri boot sırasında systemd-sysctl.service tarafından uygulanır. Bu servisin durumunu kontrol edebilirsin:

systemctl status systemd-sysctl.service
journalctl -u systemd-sysctl.service

Eğer servis başlangıçta hata verdiyse logları inceleyerek hangi parametrenin sorun çıkardığını bulabilirsin. Özellikle modül bağımlılıkları olan parametreler başlangıçta modül henüz yüklenmemişse hata verebilir.

Değişiklikleri Test Etme ve Geri Alma

Özellikle production ortamlarında değişiklikleri test etmeden uygulamamalısın. İşte güvenli bir yaklaşım:

Önce mevcut değerleri yedekle:

sysctl -a > /root/sysctl-backup-$(date +%Y%m%d).txt

Değişikliği geçici olarak uygula ve test et:

sysctl -w vm.swappiness=10
# Test yap...
# Sorun varsa eski değere dön:
sysctl -w vm.swappiness=30

Her şey yolundaysa kalıcı hale getir:

echo "vm.swappiness = 10" >> /etc/sysctl.d/99-custom-tuning.conf
sysctl --system

Belirli Kategorilerdeki Önemli Parametreler

Dosya Sistemi ve I/O Parametreleri

  • fs.file-max: Sistemin açabileceği maksimum dosya sayısı. Çok fazla “Too many open files” hatası alıyorsan artır.
  • fs.inotify.max_user_watches: İzlenebilecek maksimum dosya sayısı. IDE’ler ve monitoring araçları bu değeri çabuk tüketir.
  • fs.aio-max-nr: Asenkron I/O işlemi limiti. Oracle ve yüksek I/O’lu uygulamalar için kritik.

Çekirdek Parametreleri

  • kernel.pid_max: Maksimum proses ID değeri. Çok sayıda konteyner veya proses çalıştırıyorsan artırmak gerekebilir.
  • kernel.threads-max: Sistemdeki maksimum thread sayısı.
  • kernel.core_pattern: Core dump dosyalarının nerede ve nasıl saklanacağını belirler.
  • kernel.panic: Kernel panic durumunda otomatik yeniden başlatma süresi (saniye).

Bellek Parametreleri

  • vm.min_free_kbytes: Çekirdek için her zaman ayrılmış tutulacak minimum boş bellek. Çok düşük ayarlanırsa OOM killer devreye girer.
  • vm.vfs_cache_pressure: Dizin ve inode önbelleğinin serbest bırakılma eğilimi. Varsayılan 100, düşürürsen daha agresif önbellekleme yapılır.
  • vm.zone_reclaim_mode: NUMA sistemlerde bellek geri kazanım davranışı. Veritabanı sunucularında 0 olarak ayarlanması önerilir.

Performans Doğrulama ve İzleme

Yaptığın değişikliklerin gerçekten etkili olup olmadığını ölçmek için birkaç araç kullanabilirsin:

# Ağ istatistiklerini izle
ss -s
netstat -s | grep -i overflow

# Bellek kullanımını izle
vmstat 1 10
cat /proc/meminfo

# TCP bağlantı durumlarını izle
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn

# Swap aktivitesini izle
vmstat -s | grep -i swap

Özellikle web sunucusu senaryosunda ss -tan | awk '{print $1}' | sort | uniq -c komutuyla TIME_WAIT sayısını takip etmek faydalıdır. tcp_tw_reuse parametresini aktif ettikten sonra bu sayının zamanla düştüğünü göreceksin.

Sık Yapılan Hatalar

Yıllar içinde gördüğüm yaygın sysctl hatalarından birkaçı:

  • Yanlış dosyayı düzenlemek: /etc/sysctl.conf yerine /proc/sys/ dosyalarını direkt düzenleyip “neden kalıcı olmadı?” diye şaşırmak.
  • Bağımlılıkları atlamak: Modül gerektiren parametreleri module yüklemeden uygulamaya çalışmak.
  • Production’da doğrudan test etmek: Önce staging’de dene, sonra production’a al.
  • Aşırı agresif ayarlar: vm.overcommit_memory = 1 gibi parametreleri ne yaptığını tam anlamadan uygulamak bellek sorunlarına yol açar.
  • Yedek almamak: Değişiklik öncesi sysctl -a > backup.txt yapmayı ihmal etmek.

Sonuç

sysctl, Rocky Linux sistem yönetiminin en güçlü araçlarından biridir. Doğru kullanıldığında performansı dramatik biçimde artırabilir, güvenliği sıkılaştırabilir ve uygulama sorunlarını çözebilir. Ancak her güçlü araç gibi dikkatli kullanılması gerekir.

Önerilen yaklaşım şu şekilde olmalı: önce mevcut değerleri yedekle, değişikliği geçici olarak -w ile uygula ve test et, sonuçlardan memnunsan /etc/sysctl.d/ altında anlamlı isimli bir dosyaya yaz, son olarak sysctl --system ile tüm yapılandırmayı tekrar yükle ve doğrula.

Rocky Linux sistemlerinde /etc/sysctl.d/ dizinini kullanmak, tek bir büyük sysctl.conf dosyasından çok daha yönetilebilir bir yapı sunar. Farklı amaçlar için farklı dosyalar oluştur: 99-security.conf, 99-network.conf, 99-vm.conf gibi. Hem bakımı kolaylaşır hem de neyin neden değiştirildiğini kolayca takip edebilirsin.

Son olarak, buradaki parametreleri kopyala yapıştır uygulamak yerine her parametrenin ne işe yaradığını anlayarak uygulamanı tavsiye ederim. Her ortam farklıdır ve bir web sunucusu için ideal olan ayar, bir veritabanı sunucusu için sorun çıkarabilir.

Yorum yapın