Linux Kernel Tuning: Sysctl ile Optimizasyon Sanatı
Linux çekirdeği, işletim sisteminin kalbidir ve performansını, kararlılığını ve güvenliğini doğrudan etkiler. Çoğu zaman varsayılan çekirdek ayarları genel kullanım senaryoları için iyi optimize edilmiş olsa da, belirli iş yükleri (yüksek trafikli web sunucuları, veritabanları, sanallaştırma ortamları vb.) için özel ayarlamalar yapmak önemli performans kazançları sağlayabilir.
Bu blog yazısında, sysctl aracı ve /etc/sysctl.conf dosyası aracılığıyla Linux çekirdeğini nasıl optimize edebileceğinizi inceleyeceğiz. Ancak unutmayın: çekirdek parametrelerini değiştirmek güçlü bir araçtır ve dikkatli kullanılmalıdır. Her zaman yaptığınız değişiklikleri test edin ve potansiyel yan etkilerini anlayın.
Sysctl Temelleri: Parametreleri Görüntüleme ve Değiştirme
sysctl, çekirdek parametrelerini çalışma zamanında görüntülemek ve değiştirmek için kullanılan komut satırı aracıdır. Bu parametreler genellikle /proc/sys/ dizinindeki dosyalara karşılık gelir.
Mevcut Bir Parametreyi Görüntüleme:
Bir parametrenin mevcut değerini görüntülemek için:
sysctl vm.swappiness
Veya doğrudan /proc/sys dizininden:
cat /proc/sys/vm/swappiness
Geçici Olarak Değiştirme (Yeniden Başlatmada Sıfırlanır):
Bir parametreyi geçici olarak değiştirmek için -w (write) anahtarını kullanın:
sudo sysctl -w vm.swappiness=10
Bu değişiklik, sistem yeniden başlatılana veya başka bir sysctl komutuyla değiştirilene kadar geçerli kalacaktır.
Kalıcı Olarak Değiştirme (/etc/sysctl.conf):
Kalıcı değişiklikler için /etc/sysctl.conf dosyasını veya /etc/sysctl.d/ dizinindeki özel bir dosyayı düzenlemeniz gerekir. Bu dosyalar, sistem başlangıcında çekirdek parametrelerini yükler.
Önce mevcut dosyanızı yedekleyin:
sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak
Daha sonra dosyayı açın (örneğin nano veya vim ile) ve istediğiniz parametreleri parametre = değer formatında ekleyin veya değiştirin:
sudo nano /etc/sysctl.conf
İçeriğe örnek:
# Swappiness değerini düşür (swap kullanımını azaltır)
vm.swappiness = 10
# TCP TIME_WAIT durumundaki soketlerin hızlıca yeniden kullanılmasını sağlar (dikkatli kullanılmalı)
# net.ipv4.tcp_tw_reuse = 1
# Ağ bağlantısı backlog kapasitesini artırır
net.core.somaxconn = 65535
Değişiklikleri Uygulama:
/etc/sysctl.conf dosyasını kaydettikten sonra, değişiklikleri uygulamak için:
sudo sysctl -p
Bu komut, /etc/sysctl.conf ve /etc/sysctl.d/ dizinindeki tüm yapılandırma dosyalarını okur ve parametreleri uygular.
Belirli bir dosyadan uygulamak için:
sudo sysctl -p /etc/sysctl.d/99-my-custom.conf
Önemli Sysctl Optimizasyon Parametreleri
İşte yaygın iş yükleri için faydalı olabilecek bazı önemli sysctl parametreleri:
1. Ağ Optimizasyonları (Yüksek Trafikli Sunucular İçin)
-
net.core.somaxconn: Soket dinleme kuyruğunun maksimum boyutunu belirler. Yüksek bağlantı yükü olan sunucular (örneğin, web sunucuları veya veritabanları) için artırılması, daha fazla bekleyen bağlantıyı yönetmeye yardımcı olur.net.core.somaxconn = 65535 -
net.ipv4.tcp_max_syn_backlog: Yarım açık (SYN_RECV) bağlantıların maksimum sayısını belirler. SYN saldırılarına karşı koruma ve yüksek bağlantı taleplerini yönetmek için önemlidir.net.ipv4.tcp_max_syn_backlog = 8192 -
net.ipv4.tcp_tw_reuse: TIME_WAIT durumundaki soketlerin hızlıca yeniden kullanılmasını sağlar. Özellikle kısa ömürlü ve çok sayıda bağlantı kuran sunucular için faydalıdır, ancak NAT arkasındaki istemcilerle veya belirli ağ topolojilerinde sorunlara yol açabileceği için dikkatli kullanılmalıdır.net.ipv4.tcp_tw_reuse = 1 -
net.ipv4.tcp_fin_timeout: Bir TCP bağlantısının kapanması sırasında FIN_WAIT2 durumunda kalacağı süreyi (saniye) belirler. Yüksek yüklü sunucularda düşürülmesi (örneğin 30 saniyeye), kaynakların daha hızlı serbest kalmasını sağlayabilir.net.ipv4.tcp_fin_timeout = 30 -
net.ipv4.ip_local_port_range: Giden bağlantılar için kullanılacak yerel (ephemeral) port aralığını tanımlar. Yüksek eşzamanlı giden bağlantıya ihtiyaç duyan uygulamalar için aralığın genişletilmesi faydalı olabilir.net.ipv4.ip_local_port_range = 1024 65535 -
net.ipv4.tcp_keepalive_time,tcp_keepalive_probes,tcp_keepalive_intvl: Uzun süreli boşta kalan TCP bağlantılarının ne zaman sonlandırılacağını yönetir. Genellikle varsayılanlar yeterli olsa da, belirli uygulamalar için ayarlanması gerekebilir (örneğin, NAT cihazları arkasındaki bağlantıları canlı tutmak için).net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 15
2. Bellek (VM) Optimizasyonları
-
vm.swappiness: Çekirdeğin ne kadar hevesli bir şekilde swap alanını kullanacağını belirler. Değer 0 ise çekirdek swap kullanımını en aza indirmeye çalışır (sadece zorunlu durumlarda swap yapar), 100 ise mümkün olduğunca çok veri sayfalamaya çalışır. Genellikle veritabanı sunucuları gibi bellek tabanlı uygulamalar için 10-30 arası bir değer önerilir, bu da disk I/O’sunu azaltarak performansı artırabilir.vm.swappiness = 10 -
vm.vfs_cache_pressure: inode ve dentry objelerinin (dosya sistemi meta verileri) önbellekten ne kadar hızlı atılacağını kontrol eder. Yüksek değerler, çekirdeğin bu önbellekleri daha hızlı temizlemesine neden olur (daha çok sayfa önbelleği için yer açar). Dosya sistemi yoğun uygulamalar için bazen düşürülmesi (örneğin 50’ye) bu önbelleklerin daha uzun süre bellekte kalmasını sağlayabilir, ancak diğer bellek alanlarından çalabilir.vm.vfs_cache_pressure = 50 -
vm.dirty_ratio: Toplam sistem belleğinin yüzde kaçına kadar kirli (dirty) sayfaların tutulabileceğini belirler; bu sınıra ulaşıldığında tüm süreçler bloklanır ve veri diske yazılır.vm.dirty_background_ratio: Arka planda çalışan yazma işlemleri için aynı limitin yüzdesel karşılığı. Bu değere ulaşıldığında, arka plan yazma işlemleri başlar ancak kullanıcı süreçleri engellenmez.Bu değerler, özellikle yüksek yazma yoğunluğu olan sistemlerde I/O performansını etkiler. Genellikle disk I/O’sunu daha akıcı hale getirmek için
dirty_background_ratiodaha düşük,dirty_ratiodaha yüksek ayarlanır.vm.dirty_ratio = 40 vm.dirty_background_ratio = 10
3. Diğer Genel Optimizasyonlar
-
fs.file-max: Sistem genelinde açılabilecek maksimum dosya tanıtıcısı sayısını belirler. Yüksek eşzamanlı dosya erişimi olan sunucular için artırılması gerekebilir. Varsayılan değerler genellikle düşüktür.fs.file-max = 2097152 -
kernel.pid_max: Atanabilecek maksimum PID (process ID) numarasını belirler. Çok sayıda kısa ömürlü sürecin çalıştığı sistemler (örneğin, sanallaştırma ana makineleri veya kapsayıcı ortamları) için artırılması düşünülebilir.kernel.pid_max = 65536 -
kernel.panic_on_oops: Çekirdek bir “oops” (hatalı bellek erişimi vb.) yaşadığında sistemin panik yapıp yapmayacağını kontrol eder. Üretim sistemlerinde kararlılığı artırmak ve veri kaybını önlemek için genellikle 1 olarak ayarlanır, bu da sistemin kendini güvenli bir şekilde yeniden başlatmasını sağlar.kernel.panic_on_oops = 1
Sonuç
Linux çekirdek parametrelerini sysctl aracılığıyla ayarlamak, sistem performansını, kararlılığını ve güvenliğini önemli ölçüde artırma potansiyeline sahiptir. Ancak her değişiklik, sisteminizin özel ihtiyaçlarına göre titizlikle planlanmalı ve test edilmelidir.
Unutmayın ki her iş yükü farklıdır ve “tek beden herkese uyar” bir çözüm yoktur. Değişiklikleri uygulamadan önce her zaman mevcut yapılandırmanızın bir yedeğini alın, değişiklikleri küçük adımlarla yapın ve sisteminizin davranışını dikkatlice izleyin. perf, sar, iostat, vmstat gibi araçlarla performansı sürekli takip ederek doğru ayarlamaları bulabilirsiniz.
Başarılı bir çekirdek ayarlama süreci, sürekli öğrenme ve test etme ile mümkün olur. Sistemlerinizi daha verimli ve güçlü hale getirme yolculuğunuzda başarılar dileriz!
