Linux sunucularda çalışırken aniden karşınıza çıkan "Too many open files" hatası, çoğu zaman can sıkıcıdır. Özellikle yoğun trafik alan web sunucularında, büyük veri işlemlerinde veya çok sayıda bağlantı kuran uygulamalarda bu hatayla karşılaşmak olasıdır. Neyse ki çözümü basit: ulimit değerlerini artırmak. Bu yazıda size adım adım nasıl yapacağınızı göstereceğiz.
Hata Neden Olur?
Linux, bir sürecin aynı anda açabileceği dosya tanımlayıcı (file descriptor) sayısını sınırlar. Bu sınıra ulimit (user limit) denir. Varsayılan değer genellikle 1024'tür. Ancak bir web sunucusu (Nginx, Apache), veritabanı (MySQL, PostgreSQL) veya Node.js uygulaması çok sayıda bağlantı, soket ya da dosya açtığında bu sınıra hızla ulaşılır. İşte o zaman "Too many open files" hatasıyla karşılaşırsınız.
Örneğin, yüksek trafikli bir e-ticaret sitesinde aynı anda binlerce kullanıcıya hizmet veriliyorsa, her bağlantı için bir dosya tanımlayıcı açılır. Varsayılan limit yetersiz kalır ve hata oluşur. Bu hatayı çözmek için iki seviyede ayar yapmamız gerekiyor: sistem genelinde ve kullanıcı bazında.
Sistem Genelinde ulimit Değerlerini Artırma
Önce sistemin tüm kullanıcıları için geçerli olan limitleri değiştirelim. Bunun için /etc/security/limits.conf dosyasını düzenleyeceğiz.
Adım 1: limits.conf Dosyasını Açın
Root yetkileriyle aşağıdaki komutu çalıştırın:
sudo nano /etc/security/limits.conf
Adım 2: Limitleri Ekleyin
Dosyanın sonuna şu satırları ekleyin (örnek değerler):
* soft nofile 65536* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
Açıklama: * tüm kullanıcıları, soft yazılım limitini, hard ise sert limiti belirtir. nofile açık dosya sayısıdır. Burada 65536 değerini kullanmanızı öneririz; ihtiyaca göre 131072 veya daha yüksek değerler de kullanabilirsiniz.
Adım 3: PAM Ayarlarını Kontrol Edin
Bazı sistemlerde PAM (Pluggable Authentication Modules) yapılandırmasının limits.conf'u okuduğundan emin olun. /etc/pam.d/common-session veya /etc/pam.d/system-auth dosyasında şu satırın bulunduğundan emin olun:
session required pam_limits.soEğer yoksa ekleyin.
Adım 4: Sistemin ulimit Değerini Kalıcı Yapın
Bir de sistem genelinde fs.file-max parametresini artıralım. /etc/sysctl.conf dosyasına şunu ekleyin:
fs.file-max = 2097152Ardından sudo sysctl -p ile uygulayın.
Kullanıcı Bazında ulimit Ayarları
Eğer hata belirli bir kullanıcı için (örneğin web sunucusu çalıştıran kullanıcı) devam ediyorsa, o kullanıcının oturum ayarlarını değiştirin. Kullanıcının ~/.bashrc veya ~/.profile dosyasına şu satırı ekleyin:
ulimit -n 65536
Çıkış yapıp tekrar giriş yapın. Değişikliği test etmek için ulimit -n komutunu kullanın.
Değişiklikleri Test Edin
Tüm ayarları yaptıktan sonra sistemi yeniden başlatmanız önerilmez. Bunun yerine yeni bir oturum açarak kontrol edin. Aşağıdaki komutları kullanarak limitlerin doğru ayarlandığını doğrulayabilirsiniz:
- ulimit -n – Kullanıcı bazında açık dosya limitini gösterir.
- cat /proc/sys/fs/file-max – Sistem genelindeki maksimum dosya sayısını gösterir.
- lsof | wc -l – O anda açık olan toplam dosya tanımlayıcı sayısını verir.
Eğer ulimit -n çıktısında 65536'yı görüyorsanız, ayar başarılı demektir.
Önemli Uyarılar
Limitleri çok yüksek ayarlamak sistem kaynaklarını gereksiz tüketebilir. Sunucunuzun RAM ve işlemci kapasitesine göre makul bir değer belirleyin. Genellikle 65536 veya 131072 yeterli olur. Ayrıca, işlem başına açık dosya sayısını artırmak, beraberinde TCP TIME_WAIT gibi başka sorunlar getirebilir. Bu yüzden ayarları adım adım yapın ve izleyin.
Bir diğer nokta: Docker gibi konteyner ortamlarında host'taki ayarlar geçerlidir; ayrıca konteyner içinde de ulimit ayarı yapmanız gerekebilir. Konteyner başlatırken --ulimit nofile=65536:65536 parametresini ekleyin.
Son olarak, eğer hata hala devam ediyorsa, uygulamanızda dosya tanımlayıcı sızıntısı (leak) olup olmadığını kontrol edin. lsof -p [PID] ile süreçlerin açık dosyalarını inceleyebilirsiniz.
"Too many open files" hatası, doğru yapılandırma ile kolayca çözülür. Yukarıdaki adımları uyguladıktan sonra sunucunuzun rahat bir nefes aldığını göreceksiniz. Unutmayın, her sunucu farklıdır; limitleri kendi ihtiyacınıza göre ayarlayın. Bir sonraki yazımızda görüşmek üzere!