Her kullanıcının kullanabileceği CPU çekirdeği sayısını nasıl kısıtlayabiliriz?


18

CPU'su 32 çekirdeği olan bir bilgisayarımız var ve birkaç farklı kullanıcı tarafından program çalıştırmak için kullanılacak. Bir kullanıcının tüm CPU gücünü tekelleştirmemesi için her kullanıcının her zaman kullanabileceği çekirdek sayısını sınırlamanın bir yolu var mı?


5
Bir cevap değil, sadece bir fikir. Birkaç sanal makine kurmayı düşünebilirsiniz. Her birinin sınırlı miktarda CPU'su olabilir. Her kullanıcı yalnızca sanal makinelerden birinde olur ve bu VM'deki kullanıcılar CPU kullanımıyla sınırlandırılır. Bazı sanallaştırma yazılımlarının bunu desteklemek için araçları olabilir.
ghellquist

1
@ghellquist bunu cevaplamalısınız
slebetman

@ghellquist: Farklı kullanıcıların yalnızca bazı CPU'ları görmesini istiyorsanız, muhtemelen Linux kapları gibi olabildiğince hafif bir şey istersiniz. (örneğin, bir OpenMP veya çekirdek gördüğü kadar çok iş parçacığı başlatan başka bir program başlattıklarında, her kullanıcının gerçekten kullanmasına izin verdiğiniz çekirdek miktarı için uygun bir sayı başlatır). KVM gibi tam sanallaştırma, VM çıkışlarından kaçınıldığında bile ekstra sayfa tablolarından VT-X veya AMD-V gibi donanım desteğiyle bile, birçok TLB'nin çok fazla belleğe dokunmasını engelleyen kodda bir performans maliyetine sahiptir.
Peter Cordes

Üzgünüm, ama buna bile ihtiyaç var mı? Çok kullanıcılı bir sistem olarak, Linux varsayılan olarak zaten önleyici çoklu görev uygular, bu nedenle tek bir (kötü amaçlı olmayan) kullanıcının tüm sistemi kendileri için istediği durum ortaya çıkmamalıdır.
Kübik

Yanıtlar:


16

Bu mümkün olsa da, karmaşık ve neredeyse kesinlikle kötü bir fikir. Makineyi şu anda yalnızca bir kullanıcı kullanıyorsa, N çekirdeği ile sınırlamak kaynak israfı demektir. Çok daha iyi bir yaklaşım, her şeyi aşağıdakilerle çalıştırmaktır nice:

NAME
       nice - run a program with modified scheduling priority

SYNOPSIS
       nice [OPTION] [COMMAND [ARG]...]

DESCRIPTION
       Run  COMMAND  with an adjusted niceness, which affects process scheduling.  With
       no COMMAND, print the current niceness.  Niceness values range  from  -20  (most
       favorable to the process) to 19 (least favorable to the process).

Bu, bir işlemin önceliğini belirleyen harika bir araçtır. Bu nedenle, yalnızca bir kullanıcı bir şey çalıştırıyorsa, ihtiyaç duydukları kadar CPU zamanı alırlar, ancak bir başkası kendi (aynı zamanda güzel) işini başlatırsa, iyi olur ve birbirleriyle paylaşırlar. Bu şekilde, kullanıcılarınız komutları birlikte başlatırsa nice 10 command, hiç kimse kaynakları sarsmayacaktır (ve hiç kimse sunucuyu dizlerine getirmeyecektir).

Yüksek hoş bir değerin düşük öncelik anlamına geldiğini unutmayın. Bu ne kadar iyi olmamız gerektiğinin ve ne kadar güzel olduğumuzun bir ölçüsüdür .

Ayrıca, bunun bellek ayırmayı yönetmeye yardımcı olmayacağını, yalnızca CPU zamanlamasını etkilediğini unutmayın. Dolayısıyla, birden fazla kullanıcı birden çok bellek yoğun işlem başlatırsa, yine de bir sorununuz olacaktır. Bu bir sorunsa, tork gibi uygun kuyruk sistemlerine bakmalısınız .


Cevabınız için teşekkürler. SLURM gibi bazı "iş yükü yöneticileri" vardır, ancak birden fazla düğümü olan bilgisayarlar içindir. İnsanların tek düğümlü bilgisayarlar için çok fazla talep olmadığı için benzer uygulamalar geliştirmedikleri mantıklı.
Reza

@Reza deneyin nice, tarif ettiğinizden, tam olarak ihtiyacınız olan şey bu.
terdon

3
@Reza: Çünkü işletim sistemi zaten bunu yapıyor. Mevcut CPU'ları gerektiğinde iş parçacıklarına / işlemlere otomatik olarak paylaşır.
BlueRaja - Danny Pflughoeft

13

TL; DR : Kısa bir araştırmadan, komutları belirli sayıda çekirdekle sınırlamak mümkün görünmektedir, ancak her durumda, kısıtlamayı gerçekten zorlayan bir komut kullanmanız gerekir.

cgroups

Linux, cgroupssüreçler için mevcut kaynakları kısıtlamak amacıyla sıklıkla kullanılan bir Linux yazılımına sahiptir. Çok kısa bir araştırmadan, Arch Wiki'de Matlab (bilimsel bir yazılım) yapılandırmasında bir örnek bulabilirsiniz /etc/cgconfig.conf:

group matlab {
    perm {
        admin {
            uid = username;
        }
        task {
            uid = username;
        }
    }

    cpuset {
        cpuset.mems="0";
        cpuset.cpus="0-5";
    }
    memory {
        memory.limit_in_bytes = 5000000000;
    }
}

Bu tür bir yapılandırmanın geçerli olması için işlemi cgexeckomutla, örneğin aynı wiki sayfasından çalıştırmanız gerekir:

$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop

taskset

Bir ilgili soru Ubuntu ve Ask üzerinde nasıl Linux bir işlemci çekirdeğine bir süreç sınırlamak için? Unix ve Linux sitesindeki [yinelenen]taskset işlem için CPU'ları sınırlamak için bir örnek gösterir . İlk soruda, belirli bir kullanıcı için tüm süreçlerin ayrıştırılmasıyla elde edilir

$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001

Diğer soruda, tasksetkendi kendine bir süreç başlatılır :

$ taskset -c 0 mycommand --option  # start a command with the given affinity

Sonuç

Süreçleri sınırlamak kesinlikle mümkün olsa da, belirli kullanıcılar için bunu başarmak o kadar kolay değil gibi görünüyor. Bağlantılı Ask Ubuntu gönderisindeki örnek, her bir kullanıcıya ait işlemler ve her biri için kullanılan işlemler için tutarlı tarama gerektirir taskset. Çok daha makul bir yaklaşım CPU yoğun uygulamalarını seçici olarak cgexecveya yoluyla çalıştırmak olacaktır taskset; ayrıca tüm süreçleri belirli sayıda CPUS ile sınırlamak da anlamsızdır, özellikle de görevlerini daha hızlı yürütmek için paralellik ve eşzamanlılıktan faydalananlar için - bunları belirli sayıda CPU ile sınırlamak, işlemi yavaşlatma etkisine sahip olabilir. Buna ek olarak, terdon'un cevabının da belirttiği gibi, bu bir kaynak israfı

Belirli uygulamaları çalıştırarak tasksetveya cgexechangi uygulamaları çalıştırabileceklerini bildirmek için kullanıcılarınızla iletişim kurmanızı veya seçili uygulamaları taskselveya aracılığıyla başlatacak sarıcı komut dosyaları oluşturmanızı gerektirir cgexec.

Ayrıca, CPU sayısı için sınır belirlemek yerine, bir kullanıcının veya grubun oluşturabileceği işlem sayısını ayarlamayı düşünün. Bu, /etc/security/limits.confdosya ile sağlanabilir .

Ayrıca bakınız


1
iyi, cgexec ile işlemlerini yürüten kullanıcılara güvenmek yerine, işlemleri otomatik olarak kullanıcı / gruba göre uygun gruba taşımak için cgrulesengd ve cgrules.conf vardır . Ama öyle görünüyor ki, bunu ubuntu'da kurmak biraz önemsiz.
Hans-Jakob

@ Hans-Jakob Biraz kıvrımlı görünüyor, artı GRUB'a çekirdek bayrakları eklemeyi gerektiriyor. Muhtemelen çok sayıda kullanıcınızın olduğu ve sistemi çökmelerini istemediğiniz kurumsal işletme seviyesi için, muhtemelen faydalıdır, ancak masaüstü için - çok fazla çalışma. Bunu bağladığınız için teşekkür ederim.
Sergiy Kolodyazhnyy

2
sched_setaffinity(2)benzeşme maskesi genelinde korunur diyor execve(2), ve bir çocuk devralır o fork(2). Bu nedenle, kabuğu bir kullanıcı için (veya bir X oturumu için grafik kabuğunu) ayarlarsanız, bu kabuktan başladıkları her şey varsayılan olarak aynı yakınlık maskesini kullanır.
Peter Cordes

1
Olası bir dezavantaj, kaç iş parçacığının başlayacağına karar verirken makinenin kaç CPU'ya sahip olduğunu kontrol eden programlardır; gerçekte planlanacak çekirdek sayısı için çok fazla iş parçacığı olacak. Grupların bu konuda bir şey yapıp yapamayacağını öğrendiniz mi?
Peter Cordes

@PeterCordes Yumurtlama kabuğu fikri ilginç geliyor. Buna bakmam gerekecek. Teşekkürler ! İkinci yoruma gelince, hayır, bu noktada yeterince grup araştırmadım.
Sergiy Kolodyazhnyy
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.