Shell Script ile Resource Limitleme

Mina

Astsubay Başçavuş
Admin
Katılım
25 Kasım 2025
Mesajlar
996
Reaksiyon puanı
34

Shell Script ile Kaynak Limitlemeye Giriş​


Sunucular ve bilgisayar sistemleri genellikle birden fazla uygulamanın veya kullanıcının aynı anda çalıştığı ortamlardır. Bu durum, sistem kaynaklarının (işlemci, bellek, disk I/O, ağ bant genişliği) verimli ve adil bir şekilde dağıtılmasını zorunlu kılar. Bir uygulamanın aşırı kaynak tüketimi, diğer kritik uygulamaların yavaşlamasına veya sistemin tamamen kilitlenmesine neden olabilir. Kaynak limitleme, bu tür senaryoların önüne geçmek için kritik bir yöntemdir. Shell scriptleri ise, bu limitleme işlemlerini otomatikleştirmek, süreçleri yönetmek ve sistemin genel istikrarını sağlamak için oldukça esnek ve güçlü araçlar sunar. Bu yaklaşımla, kaynakların dengeli dağıtımı mümkün hale gelir.

Temel Kaynak Limitleme Komutları​


Linux tabanlı sistemlerde kaynak limitleme için pek çok yerleşik komut bulunmaktadır. Shell scriptler, bu komutları bir araya getirerek karmaşık limitleme senaryolarını kolayca yönetme imkanı tanır. Örneğin, bir sürecin belirli bir miktarda CPU kullanmasını sağlamak veya disk yazma hızını kısıtlamak gibi işlemler, tek tek komutlarla yapılabileceği gibi, bir betik içerisinde ardışık olarak da çalıştırılabilir. Bu temel komutlar, sistem yöneticilerine ve geliştiricilere, uygulama davranışlarını kontrol etme ve beklenmedik performans düşüşlerinin önüne geçme yeteneği verir. Ek olarak, bu komutların çoğu, sistem seviyesinde ya da kullanıcı seviyesinde ayarlanabilir parametrelere sahiptir.

`ulimit` ile Kullanıcı ve Süreç Kaynaklarını Yönetme

`ulimit` komutu, Unix benzeri işletim sistemlerinde bir kullanıcının veya sürecin erişebileceği kaynakları belirlemek için kullanılan önemli bir shell yerleşik komutudur. Bu komut sayesinde, açık dosya sayısı, bellek kullanımı, CPU süresi gibi birçok farklı parametreyi sınırlayabilirsiniz. Örneğin, bir kullanıcı grubunun aynı anda açabileceği maksimum dosya sayısını belirleyerek, sistemin dosya tanımlayıcılarının tükenmesini engelleyebilirsiniz. Başka bir deyişle, bir kullanıcının başlattığı süreçlerin sistem kaynaklarını tekelleştirmesinin önüne geçilir. Bu ayarlar genellikle `/etc/security/limits.conf` dosyası üzerinden kalıcı hale getirilir ancak shell scriptleri ile geçici oturum bazlı sınırlamalar da uygulanabilir.

Süreç Önceliklendirme: `nice` ve `renice` Komutları​


Sistemdeki süreçlerin birbirleriyle olan etkileşimlerinde, bazen bir sürecin diğerlerine göre daha yüksek veya daha düşük önceliğe sahip olması gerekebilir. `nice` komutu, bir sürecin başlatılırken önceliğini belirlemenizi sağlar. Düşük öncelikli bir süreç, daha yüksek öncelikli süreçler kaynaklara ihtiyaç duyduğunda gönüllü olarak geri çekilir. Bu, özellikle arka planda çalışan veya zaman kritik olmayan görevler için faydalıdır. `renice` komutu ise, zaten çalışmakta olan bir sürecin önceliğini değiştirmek için kullanılır. Örneğin, yoğun bir raporlama betiğinin sistemin geri kalanını yavaşlatmasını istemiyorsanız, betiği daha düşük bir `nice` değeriyle çalıştırabilir veya `renice` ile önceliğini düşürebilirsiniz. Bu nedenle, sistemin genel yanıt verme hızı korunur.

CPU Kullanımını Sınırlama: `cpulimit` Aracı​


Bazı uygulamalar veya betikler, zaman zaman beklenenden daha fazla CPU kaynağı tüketebilir. Bu durum, sunucunun diğer önemli servislerinin yavaşlamasına yol açabilir. `cpulimit` aracı, belirli bir sürecin CPU kullanımını yüzde olarak sınırlamak için harici bir yardımcı programdır. Örneğin, bir derleme işleminin CPU'nun %50'sinden fazlasını kullanmamasını sağlayabilirsiniz. `cpulimit`, bir sürecin PID'sini izler ve CPU kullanımının belirlenen eşiği aştığını tespit ettiğinde, sürece `SIGSTOP` ve `SIGCONT` sinyalleri göndererek CPU kullanımını kontrol altında tutar. Shell scriptleri, bu aracı belirli bir programı başlatıp ardından onun CPU kullanımını dinamik olarak izlemek ve sınırlamak için kullanabilir.

Disk ve Ağ I/O Kontrolü​


Sadece CPU ve bellek değil, disk I/O (giriş/çıkış) ve ağ bant genişliği de sistem performansını etkileyen kritik kaynaklardır. `ionice` komutu, disk I/O önceliklerini yönetmek için kullanılır. Bu sayede, yoğun disk işlemleri yapan bir uygulamanın diğer uygulamaların disk erişimini engellemesi önlenebilir. Örneğin, bir yedekleme işlemini en düşük I/O önceliği ile çalıştırarak, veritabanı sunucusunun disk performansını etkilememesini sağlayabilirsiniz. Ağ trafiğini kontrol etmek için ise `tc` (traffic control) komutu mevcuttur. Shell scriptleri, `tc` ile belirli portlara, IP adreslerine veya protokollere göre bant genişliği sınırlamaları getirebilir, gecikmeleri artırabilir veya paketleri önceliklendirebilir.

Otomatik Limitleme Senaryoları ve En İyi Uygulamalar​


Shell scriptler, yukarıda bahsedilen komutları birleştirerek otomatik limitleme senaryoları oluşturmak için idealdir. Örneğin, belirli bir uygulama belleğin %80'ini aştığında otomatik olarak `renice` ile önceliğini düşüren veya `cpulimit` ile CPU kullanımını kısıtlayan bir betik yazılabilir. Cron işleri ile düzenli kontroller yaparak, anlık kaynak dalgalanmalarına karşı proaktif önlemler alabilirsiniz. Kaynak limitlemede en iyi uygulamalardan biri, her zaman en az kısıtlamayla başlamak ve gözlemlemektir. Aşırı kısıtlamalar, uygulamanın düzgün çalışmasını engelleyebilir. Bununla birlikte, kritik servisler için daima bir yedek plan bulundurmak ve limitleme ayarlarını kademeli olarak artırmak önemlidir. Kaynakları etkili bir şekilde yöneterek sistemin genel kararlılığını ve performansını artırırsınız.
 
Geri
Üst Alt