İşlemleri, CPU kullanımının% 10'undan fazla geçmeyecek şekilde sınırlama


32

Çok fazla kullanıcısı olan fakat bazen suistimal edilen bir Linux sistemini işletiyorum; Bir kullanıcının CPU / Belleğin% 80'inden fazlasını kullanan tek bir işlemi çalıştırabildiği yer.

Öyleyse, bir sürecin kullanabileceği CPU kullanımı miktarını sınırlayarak bunun olmasını engellemenin bir yolu var mı (örneğin,% 10'a kadar)? Farkındayım cpulimit, ancak ne yazık ki bu sınırı, sınırlandırılmasını emrettiğim işlemlere uygular (örneğin, tek işlemler). Öyleyse sorum şu, örneğin kimliğini / yolunu sağlama gereği olmadan gelecekte çalıştırılacak tüm çalışan işlemlere ve işlemlere sınırı nasıl uygulayabilirim?


Performans problemleri mi yaşıyorsunuz? Yoksa sadece seni rahatsız eden numaralar mı?
ctrl-alt-delor

@ richard Performans sorunları, bu yüzden çok fazla CPU kullanıyor gibi görünen işlemlere son vermeye / sınırlandırmaya / durdurmaya çalışıyordum, ancak bunu zaten bir bash betiği yazarak yaptım. Bu da yardımcı olursa sanal bir makinedir
Giovanni Mounir

2
Çok kısa bir süre için% 100 olabilecek sistem öldürme işlemlerine de dikkat edin. cpulimitArama komut dosyanızla birlikte düşünün . Politikaya sahip olun ve kullanımlarını önerin cpulimit, ardından% 10'dan fazlasını arayın ve ardından% 5 ile sınırlayın (böylece kullanıcıların kullanımı teşvik edilir cpulimit). Ayrıca, tek bir kullanıcı için% 10'dan fazla ekleyerek birden fazla işlem tespit edebildiğinizden emin olun.
ctrl-alt-delor

@richard Tüm bu güzel yorumlarınız için teşekkürler Richard! Bana çok yardımcı oldular! Kullanmak için öneriniz, cpulimitdaha sonra kullanıcı tarafından yeniden başlatılabildiğinden (yorumlarınızdan birinde belirtildiği gibi) işlemi öldürmekten çok daha iyidir. Teşekkür ederim!
Giovanni Mounir

Yanıtlar:


20

Bellek için kötüye kullanım olsa da, CPU için değil: bir CPU boştayken, çalışan bir işlem ("çalıştırarak", işlemin G / Ç veya başka bir şey için beklemeyeceği anlamına gelir) Varsayılan olarak% 100 CPU zamanı. Ve bir limiti uygulamak için hiçbir sebep yok.

Şimdi, öncelikleri ayarlayabilirsin nice. Belirli bir kullanıcı için tüm işlemlere başvurmalarını istiyorsanız, giriş kabuğunun çalıştığından emin olmanız gerekir nice: alt işlemler nicedeğeri devralır . Bu, kullanıcıların nasıl giriş yaptıklarına bağlıdır. Örneğin, ssh girişlerine öncelik verme .

Alternatif olarak, sanal makineler ayarlayabilirsiniz. Gerçekten de, işlem başına bir limit belirlemek, kullanıcının sistemi kötüye kullanması için birçok işlemi başlatabildiği için bir anlam ifade etmemektedir. Sanal bir makine ile tüm sınırlar sanal makine için global olacaktır.

Başka bir çözüm /etc/security/limits.confsınır koymaktır; limi.conf (5) kılavuz sayfasına bakınız. Örneğin, giriş başına maksimum CPU süresini ve / veya giriş başına maksimum işlem sayısını belirleyebilirsiniz. maxloginsHer kullanıcı için 1 olarak da ayarlayabilirsiniz .


1
@GiovanniMounir Demek istediğim: kullanıcı başına bir sanal makine.
vinc17

1
Görüyorum, fakat ne yazık ki bu, kaynak tüketen ve kullanıcılar için bazı ortak geliştirme paketlerinin kullanılmasını gerektirebileceği için amacım için gerçekten kullanışlı olmayacak ve bunu her yeni makineye yüklemeyeceğim; Bu şekilde bırakmak ve bir bash betiği tarafından otomatik olarak izleme yapmak daha iyi olduğunu düşünüyorum.
Giovanni Mounir

1
@GiovanniMounir Birkaç sanal makine arasında bir bölümü paylaşabilirsiniz.
vinc17

Sen kullanabilirsiniz @GiovanniMounir LXC veya Docker neredeyse sıfıra sanallaştırma yükünü azaltmak için. Ayrıca "sevme" güçlü bir sebep değildir. Örneğin, paylaşılan bir PHP sunucusunu yönetiyorsanız çözümünüzle devam ediyorum, çünkü LXC'ler veya Sanal Makineler yapmak, 15 $ / 5 $ lisanslı bir yazılımın yeniden yazılmasını gerektirir.
Pooyan Khosravi

benim anladığım kadarıyla, güzel sadece göreceli CPU'yu diğer işlemlere göre ayarlar. CPU kullanan başka bir işlem yoksa, işleminiz% 10 ile sınırlı değil,% 100 CPU kullanır.
johny neden

25

güzel / renice

nice bir sisteme tweaks 'one off' için harika bir araçtır.

 nice COMMAND

CPULimit

cpulimit CPU yoğun bir iş yapmanız gerekiyorsa ve boş CPU süresine sahipseniz, sistemin yanıt vermesi için esastır.

cpulimit -l 50 COMMAND

cgroups

cgroups sadece bir taneye değil, bir dizi işleme limitleri uygulayın

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

kaynaklar

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
CPU kullanımında zor bir sınır koymak isteyenler için, başka hiçbir işlem yapılmasa bile, cpu.cfs_quota_usparametreye bakın ( kılavuza bakın )
Diego

cgrupları systemd direktifleri sayesinde kullanmak daha kolaydır ... ya bir sistem oluşturun ya da bu amaç için kullanıcı en iyi seçenektir
Yves Martin

çalışan bir işlem için ex .:sudo cgclassify -g cpu:cpulimited 2315444
Kova Gücü

1
benim anladığım kadarıyla, güzel sadece göreceli CPU'yu diğer işlemlere göre ayarlar. CPU kullanan başka bir işlem yoksa, işleminiz% 10 ile sınırlı değil,% 100 CPU kullanır.
johny neden

10

Gruplara baktın mı? Arch Wiki'de onlar hakkında bazı bilgiler var . Hakkında bölümü okuyun, cpu.sharesihtiyacınız olanı yapıyor gibi görünüyor ve kullanıcı düzeyinde çalışabilirler, böylece tüm kullanıcı işlemlerini bir kerede sınırlandırabilirsiniz.


CGroups olsa gitmek için yoludur. Ayrıca (çoğu) paylaşılan bilgisayar sunucusunu da çalıştırıyorum ve bir oturum açma oturumunun kullanabileceği maksimum çekirdek sayısını sınırlamak için cgroups kullanıyoruz. Bu şekilde, kişi yeni işlemlere devam ederse, her biri daha küçük bir dilim alır. Hafıza kullanımı için aynı. Kullanıcıların otomatik olarak pam_cgroups ve cgrulesengd servisi olan bir gruba sokmasını sağlayabilirsiniz. Her kullanıcıyı kendi grubuna koymak için cgconfig dosyasındaki bir 'şablon' kullanabilirsiniz. cgrulesengd, komut dosyalarınız gibi davranır, işlemleri öldürmek yerine, her işlemin doğru grupta olmasını sağlar.
jsbillings

Kaynak kullanımını sınırlamak için cgroups kullanmasanız bile , her bir kaynak için 'stat' dosyasına bakarak bir kişinin ne kadar kaynak kullandığını değerlendirmek için kullanabilirsiniz, ardından 5 dakikalık komut dosyanız için bu bilgileri kullanın.
jsbillings

3

Hafıza için, aradığınız şey ulimit -v. ulimitAlt işlemler tarafından miras alındığını unutmayın; bu nedenle, giriş sırasında kullanıcının giriş kabuğuna uygularsanız, onun tüm işlemleri için geçerlidir.

Kullanıcılarınızın tümü bashgiriş kabuğu olarak kullanıyorsa , aşağıdaki satırı koymak, /etc/profiletüm kullanıcı işlemlerinin 1 gigabaytlık (daha kesin olarak bir milyon kilobayt) zor bir sınırına sahip olmasını sağlamalıdır:

ulimit -vH 1000000

Seçenek H, bunun zor bir limit olduğundan emin olur, yani kullanıcı daha sonra tekrar ayarlayamaz. Tabii ki, kullanıcı bir kerede yeterince fazla işlem başlatarak hala belleği doldurabilir.

Diğer kabuklar için, hangi başlatma dosyalarını bunun yerine okuduklarını (ve bunun yerine başka bir komutu ulimitkullandıklarını) bulmanız gerekir .

CPU için istediğin şeyin benim için bir anlamı yok. Yalnızca bir işlem çalışırken CPU'nun% 90'ının kullanılmamasına izin vermek ne olur? Bence gerçekten istediğin şey nice(ve muhtemelen ionice). Bu gibi dikkat ulimit, nicedeğerler böylece giriş zamanı kısıtlamasını fazla adresindeki giriş kabuğu uygulayarak, çocuk süreçler tarafından devralınır. Bunun için de geçerli sanırım ioniceama emin değilim.


Hafıza önerisi için teşekkürler! Bunu, giriş sırasında kullanıcının giriş kabuğuna uygulamak için bir örnek gösterme ihtimaliniz var mı? Bunun nasıl yapıldığından emin değilim. Ayrıca yeterince net olmadığım için üzgünüm; Yapmaya çalıştığım, herhangi bir işlemin CPU'nun% 10'undan fazlasını kullanmasına izin vermemek. Sence bunu niceyapacak kadar iyi olur mu? Eğer öyleyse, bana bunu başarmak için bir örnek gösterebilir misin?
Giovanni Mounir

Sadece bir işlem çalışırken CPU'nun% 90 boşta kalmasını sağlayamıyorum.
celtschk

1
Şu anda eşzamanlı olarak çalışan 10'dan az işlem varsa (ve çalıştırarak gerçekten çalışmayı kastettim , yalnızca kullanıcı girişini veya disk G / Ç'yi beklemiyorum), onlardan birinin CPU'nun% 10'undan fazlasına sahip olacağı neredeyse garanti edilir. Aksi halde CPU neredeyse boşta kalıyordu. Ve eğer% 10'un üstündeki herhangi bir işlemi öldürürseniz, sizi öldürmek isteyen birçok kullanıcınız olacağından eminim. Ya da en azından, bu numaraların ne anlama geldiğine dair bir ipucu olan biri tarafından değiştirilmeye çalışılacak, çünkü görünmüyor.
celtschk

@Celtschk 'in yorumunun aksine, çalışan 11 veya daha fazla işlem varsa (cpu bağlı), o zaman% 9.09'dan az olacaktır. Bu nedenle,% 10'dan fazla işlemci kullanımını yasaklayan bir sistemin kullanıcısıysam, 11 veya daha fazla işlemi çalıştırabilir ve radarın altına gizleyebilirim.
ctrl-alt-delor

@ richard Haklısın, belki de senaryo bir kullanıcı tarafından kullanılan toplam bellek / CPU miktarını toplarsa daha iyi olur ve ardından yüzde belirli bir miktara ulaştığında bu kullanıcının tüm işlemlerini sonlandırırsa dışarı)
Giovanni Mounir

3

Bu cpulimit'in sizin durumunuzda pratik olmayacağını belirttiğiniz için, o zaman görev seti bir işlemcinin CPU benzeşimini kurmasına izin vermesine rağmen, ulaşmak istediğinize yaklaşabilecek hoş , renice ve görev setine bakmanızı öneririm . durumunda hemen yardımcı olmayabilir.


1
niceve renice? Bu iyi! Manuel sayfalarına baktım, ancak hala bir işlem kimliği belirlemeniz gerektiğinden bu konuda yardımcı olabileceklerini sanmıyorum. Bununla birlikte, bana bu paketlerin dahil olduğu bir örnek verebilirseniz, çalışacak tüm işlemlere / gelecekteki işlemlere sınır getirmesi harika olurdu!
Giovanni Mounir

1

Etiketleriniz olduğundan centos, kullanabilirsiniz systemd.

Örneğin, kullanıcıyı kimliğiyle sınırlamak istiyorsanız 1234:

sudo systemctl edit --force user-1234.slice

Sonra şunu yazın ve kaydedin:

[Slice] CPUQuota=10%

Kullanıcı bir dahaki sefere giriş yaptığında, bu etkileyecektir.

Adam sayfaları: systemctl, systemd.slice, systemd.resource-control...


0

Halihazırda başlatılmış olan işlemleri sınırlandırmak istiyorsanız, bunu PID ile tek tek yapmak zorunda kalacaksınız, ancak aşağıdaki gibi yapmak için bir toplu komut dosyasına sahip olabilirsiniz:

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

Benim durumum pypdfocraçgözlülük başlattı tesseract.

Ayrıca bazı durumlarda CPU'nuz oldukça iyiydi, bunun renicegibi kullanabilirsiniz :

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
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.