Kaynak kullanımı, belirli bir işlem için CPU + RAM'den tasarruf için nasıl sınırlandırılır?


25

sshdMakine RAM bittiği için bazen çalışmayı durduran dev bir sunucum var . Evet, hafızamız azalıyor ve yükseltme şu anda uygun bir seçenek değil. Yapmak istediğim, makineye şunu söylemek: "Ne istersen onu yap, ama 20MB ve biraz CPU kullan sshd!".

Bu nasıl yapılabilir?


Sshd böyle patlatılmamalı, normalde çok iyi davranış gösteren bir arka plan programı. En son / en büyük sürümüne güncellendiğinden emin olun. Onunla ne yapıyorsun? İçinden büyük veri aktarıyor musunuz?
Marcin

2
@Marcin Metin düzenleme, büyük bir şey yaptığımı sanmıyorum. sshdİyi davranılsa bile, kullanılacak CPU / RAM olmasa takılacağını düşünüyorum, öyle değil mi?
phunehehe

Linux belleği tükendiğinde, belleği geri kazanmak için işlemleri durdurmaya başlar. OOM'u çalışırken görebilirsiniz (hafıza katil dışında). Neden sürekli sshd'nizi öldürmeye karar verdiğini bilmiyorum. Hiç sshd'in gerçekten patladığını (boyutta büyüdüğünü), patlamadan önce veya bir an için iyi çalışıyor mu ve bir sonraki ölü olarak gördünüz mü?
Marcin,

@ Motor şansı OOM ise sistemin tıkandığı o kadar susturdu ki cevap veremiyor, sshd sorunu değil, yüküyle ilgili bir sorun. Maalesef bunun cevabını bilmiyorum.
xenoterracide,

@ phunehehe, sorunun ssh için hafıza olmadığından ve yükünüzün tavandan geçmediğinden emin misiniz? sshd hata veriyor mu? kutunun üzerindeki yük nedir? ve sistemin hafızasının tükenmesine neden olan şey.
xenoterracide,

Yanıtlar:


9

Bellek kaynağı denetleyicisiyle birlikte cgroups kullanarak böyle bir şey elde edebilirsiniz .

Sana sınırlı (CPU & RAM) tüm kaynak tüketen görevleri koymak herhalde cgroup, ve ayrılmak sshdo sınırlı değildir böylece "dışında".

(Bir takas dosyası biçiminde bile daha fazla takas eklemek, yine de iyi bir seçenek olabilir.)


Hala tereddüt ediyorum, kolay görünmüyor (Ubuntu tarafından şımarık).
phunehehe

oh kesinlikle kolay değil :-) Takas eklemek çok daha kolaydır.
Mat

@phunehehe Sys Admin olmaya hoş geldiniz, kolay değil. Ama şimdi nasıl kolay şeyler yapılmayacağını öğrenmelisin.
xenoterracide,

6

Oh ama cgroups kolaydır :) libcgroup paketini kurun. Bir /etc/cgconfig.conf oluşturun:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Başlangıç cgconfighiyerarşi, cgroups oluşturabilir ve sınırlar koyacaktır süreci. Bu başarılı olursa, her ikisi de atanan CPU'nun% 50'sine ve 1G belleğine sahip olan iki grubunuz vardır (mevcut kullanılabilir bellek miktarınızın ne olduğunu bilmiyor; bu örnekte 2G olduğunu varsayarak). Şimdi tüm görevleri (yani sistemde çalışan tüm işlemleri) kök gruptan nosshd cgroup içine taşımanız yeterlidir:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

O zaman sadece sshdsürecin PID'sini almanız ve sshd görev dosyasına aktarmanız yeterlidir :

cgroup]# echo $PID >> sshd/tasks

Ta-da, işin bitti. Şimdi sshd'nin CPU ve 1G belleğin daima% 50'sine sahip olacağından emin olabilirsiniz.


1

Muhasebeye renicedaha yüksek öncelik vermek sshdveya kontrol etmek için kullanın . (acct) -> Bununla kullanıcılar için kaynak belirleyebilirsiniz, s ile sshd komutunu çalıştırın.


Ben de ionicebuna eklerdim ve muhtemelen sshd'yi daha sonra yenilememekle başlatabilirim.
xenoterracide,

1

Uygulama kaynak kullanımı sorununa daha genel bir çözüm, uygulamalarınızı Docker kullanarak bir kapta çalıştırmaktır . Daha sonra CPU'lara ve gruplara benzer bellek kullanım sınırlarına sahip kapları çalıştırabilirsiniz .

docker run -c=10 -m=1g my-container
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.