Linux Kernel Tuning: Sysctl Optimizasyonlarıyla Performansın Kilidini Açın
Linux sistemlerinizin kalbinde yatan çekirdek (kernel), donanım ve yazılım arasındaki köprüyü oluşturur. Sunucularınızın veya iş istasyonlarınızın performansını, stabilitesini ve güvenliğini optimize etmek için çekirdek parametrelerini ayarlamak kritik bir rol oynar. Bu yazıda, Linux çekirdeğinin çalışma zamanı parametrelerini yönetmek için kullanılan temel araç olan sysctl‘i ve önemli optimizasyonları ele alacağız.
Sysctl Nedir ve Neden Kullanılır?
sysctl, Linux çekirdeğinin çalışma zamanı parametrelerini görüntülemek ve değiştirmek için kullanılan bir araçtır. Bu parametreler, çekirdeğin davranışını ağ, bellek yönetimi, dosya sistemi ve süreç yönetimi gibi alanlarda etkiler. Bu ayarlara genellikle /proc/sys/ dizini altından erişilebilir.
Bir sistem yöneticisi olarak sysctl‘i kullanarak şunları yapabilirsiniz:
- Yüksek trafikli web sunucularında ağ performansını iyileştirmek.
- Veritabanı sunucularında bellek ve I/O performansını optimize etmek.
- Sistem güvenliğini artırmak.
- Özel uygulama gereksinimlerini karşılamak.
Sysctl Parametreleri Nasıl Yönetilir?
Mevcut Parametreleri Görüntüleme
Tüm mevcut parametreleri listelemek için:
sysctl -a
Belirli bir parametreyi görüntülemek için (örneğin, vm.swappiness):
sysctl vm.swappiness
Veya doğrudan /proc/sys dizininden:
cat /proc/sys/vm/swappiness
Geçici Değişiklikler Yapma
Çalışma zamanında bir parametreyi değiştirmek için -w veya --write bayrağını kullanın. Bu değişiklikler sistem yeniden başlatıldığında kaybolur:
sysctl -w vm.swappiness=10
Veya doğrudan /proc/sys dizinine yazarak:
echo 10 > /proc/sys/vm/swappiness
Kalıcı Değişiklikler Yapma
Değişikliklerin sistem yeniden başlatıldıktan sonra da geçerli olmasını sağlamak için /etc/sysctl.conf dosyasını veya /etc/sysctl.d/ dizini altındaki .conf dosyalarını kullanırız. Bu dosyaları düzenledikten sonra değişiklikleri etkinleştirmek için sysctl -p komutunu çalıştırın.
# /etc/sysctl.conf dosyasına ekleme örneği
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf
# Değişiklikleri etkinleştir
sudo sysctl -p
Daha modüler bir yaklaşım için, özel ayarları /etc/sysctl.d/99-custom.conf gibi bir dosyaya ekleyebilirsiniz. Bu, özellikle farklı uygulamalar için farklı ayarları organize etmede faydalıdır.
Önemli Sysctl Optimizasyon Alanları ve Parametreleri
1. Ağ Performansı Optimizasyonları
Yüksek trafikli web sunucuları, veritabanları veya proxy sunucuları için ağ ayarları kritik öneme sahiptir.
net.core.somaxconn: Bir dinleme soketinin bekleyen bağlantılar için tutabileceği maksimum kuyruk boyutu. Yoğun sunucularda varsayılan değeri (genellikle 128) artırmak gerekebilir.
net.core.somaxconn = 65535
net.core.netdev_max_backlog: Gelen paketlerin işlenmek üzere bekleyebileceği maksimum kuyruk boyutu. Ağ arayüzleri meşgul olduğunda paket kaybını önlemek için artırılabilir.net.core.netdev_max_backlog = 65535
net.ipv4.tcp_tw_reuse: TIME_WAIT durumundaki soketlerin yeni bağlantılar için yeniden kullanılmasına izin verir. Bu, yoğun sunucularda soket tükenmesini azaltmaya yardımcı olur.net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle: TIME_WAIT soketlerinin daha hızlı geri dönüştürülmesini sağlar. Ancak, NAT kullanan istemcilerle sorunlara yol açabileceği için genellikle önerilmez veya dikkatli kullanılmalıdır.# net.ipv4.tcp_tw_recycle = 1 (Dikkatli kullanılmalı!)
net.ipv4.tcp_fin_timeout: FIN_WAIT2 durumundaki soketlerin zaman aşımı süresi (saniye). Daha düşük bir değer, kapanan bağlantıların daha hızlı temizlenmesine yardımcı olabilir.net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time, tcp_keepalive_probes, tcp_keepalive_intvl: Bağlantıların aktif olup olmadığını kontrol etmek için TCP keepalive ayarları. Uzun süreli, boşta kalan bağlantıları olan uygulamalar için önemlidir.net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 10
2. Bellek Yönetimi Optimizasyonları
Sistemin swap kullanımı ve bellek önbellekleme davranışını kontrol ederek genel performansı etkileyebilirsiniz.
vm.swappiness: Çekirdeğin ne kadar agresif bir şekilde swap kullanacağını belirler (0-100 arası).0: Çekirdek, mümkün olduğunca diske takas yapmaktan kaçınır. Genellikle veritabanı sunucuları için önerilir.1: Minimum swappiness, ancak gerekli olduğunda swap kullanır (modern çekirdekler için 0’a yakın bir anlam taşır).60(Varsayılan): Dengeli bir kullanım.100: Çekirdek, çok agresif bir şekilde swap kullanır.
vm.swappiness = 10 # Çoğu sunucu için iyi bir başlangıç noktası
vm.dirty_background_ratio ve vm.dirty_ratio: Bellekteki kirli (değiştirilmiş ancak diske yazılmamış) sayfa önbelleğinin boyutunu kontrol eder.
vm.dirty_background_ratio: Arka plan yazıcıları, bu yüzdeye ulaşıldığında kirli sayfaları diske yazmaya başlar.vm.dirty_ratio: Toplam sistem belleğinin bu yüzdesine ulaşıldığında, tüm uygulamalar kirli sayfalar diske yazılana kadar bloke edilir. Büyük belleğe sahip sunucularda bu değerlerin çok yüksek olması I/O patlamalarına neden olabilir.
vm.dirty_background_ratio = 10 # %10'a ulaştığında arka planda yazmaya başla
vm.dirty_ratio = 20 # %20'ye ulaştığında uygulamaları bloke et
vm.overcommit_memory: Bellek aşırı taahhüdünü (overcommit) kontrol eder.
0(Varsayılan): Heuristic overcommit. Çekirdek, makul olmayan bellek isteklerini reddetmeye çalışır.1: Her zaman overcommit. Tüm bellek isteklerine izin verir. Bu, uygulamaların daha fazla bellek talep etmesine olanak tanır ancak Out-Of-Memory (OOM) durumunda sistemin çökme riskini artırır.2: Asla overcommit. Sistem, mevcut toplam swap alanı ve fiziksel RAM’in belirli bir yüzdesinden daha fazlasına izin vermez. Genellikle belirli bilimsel/mühendislik uygulamaları için kullanılır.
vm.overcommit_memory = 0
3. Dosya Sistemi ve G/Ç Optimizasyonları
Açık dosya limitleri ve G/Ç zamanlayıcıları, dosya sistemi performansını doğrudan etkiler.
fs.file-max: Sistem genelinde açılabilen maksimum dosya tanıtıcısı (file handle) sayısı. Yoğun I/O yükü olan sunucularda veya çok sayıda uygulamanın çalıştığı sistemlerde varsayılan limit yeterli olmayabilir.
fs.file-max = 2097152 # Yaklaşık 2 milyon
fs.inotify.max_user_watches: Bir kullanıcının izleyebileceği maksimum inotify (dosya sistemi değişiklik izleme) olayı sayısı. Özellikle geliştirme ortamlarında veya birçok dosyanın izlenmesi gereken uygulamalarda (örneğin IDE’ler, bazı veritabanları) bu limit yetersiz kalabilir.fs.inotify.max_user_watches = 524288
kernel.pid_max: Sistemin atayabileceği maksimum PID (süreç kimliği) değeri. Çok sayıda kısa ömürlü sürecin oluşturulduğu sistemlerde artırılabilir.kernel.pid_max = 65536
4. Güvenlik Optimizasyonları (Kısa Bir Bakış)
Bazı sysctl ayarları sistem güvenliğine de katkıda bulunur.
kernel.randomize_va_space: Adres Alanı Düzeni Rastgeleleştirmeyi (ASLR) kontrol eder.0: ASLR kapalı.1: Yığın, mmap’ler, VDSO sayfaları rastgeleleştirilir.2(Varsayılan): Tüm adres alanının tamamı rastgeleleştirilir (daha güçlü).
kernel.randomize_va_space = 2
kernel.core_uses_pid: Çekirdek dökümlerinin (core dump) dosya adında PID (Process ID) içerip içermediğini kontrol eder. Güvenlik ve hata ayıklama için önemlidir.kernel.core_uses_pid = 1
Önemli Hususlar ve En İyi Uygulamalar
- Yedekleme Yapın: Herhangi bir
sysctlayarını değiştirmeden önce/etc/sysctl.confdosyasının bir yedeğini alın. - Test Edin: Değişiklikleri her zaman bir test veya geliştirme ortamında uygulayın ve dikkatlice izleyin. Doğrudan üretim sistemlerine uygulamaktan kaçının.
- İzleme Yapın: Değişikliklerin performans üzerindeki etkilerini izlemek için sistem metriklerini (CPU, bellek, disk I/O, ağ trafiği) kullanın. Öncesi ve sonrası karşılaştırmaları yapın.
- Adım Adım İlerleyin: Birden fazla parametreyi aynı anda değiştirmek yerine, bir veya iki parametreyi değiştirin, test edin ve sonuçları gözlemleyin.
- Dokümantasyonu Okuyun: Her parametrenin tam olarak ne anlama geldiğini ve olası yan etkilerini anlamak için çekirdek dokümantasyonunu veya
man sysctlkomutunu kullanın. - Donanım ve İş Yüküne Bağlılık: İdeal
sysctlayarları, sisteminizin donanımına, üzerindeki iş yüküne ve kullandığınız uygulamalara göre büyük ölçüde değişir. “Her derde deva” bir ayar listesi yoktur.
Sonuç
Linux çekirdek tuning’i, özellikle sysctl parametreleri aracılığıyla, sistem performansınızı ve stabilitesini önemli ölçüde artırabilir. Ancak, yanlış yapılandırılmış ayarlar sistem kararsızlığına veya güvenlik açıklarına yol açabilir. Bu nedenle, her zaman bilinçli ve kontrollü bir şekilde hareket etmek, değişiklikleri test etmek ve sonuçları dikkatlice izlemek hayati önem taşır. Bu blog yazısı, sysctl optimizasyonlarına başlangıç için bir rehber niteliğindedir. Kendi sistemleriniz için en uygun ayarları bulmak, sürekli öğrenme ve deneme gerektiren bir süreçtir.
