Sayılarını sınırladığımda GNU / Linux süreçleri ve iş parçacıklarını birlikte mi sayıyor?


11

/etc/security/limits.confMakinemdeki kullanıcı başına işlem sayısını ve nproc değeri ile sınırlamak istiyorum .

Burada Linux'un süreçler ve iş parçacıkları arasında ayrım yapmadığını okudum mu?

Kullanıcı başına geçerli nproc sınırım 1024'tür, ancak bu da konu içeriyorsa, benim görüşüme göre çok düşük. Man-page limits.confsadece nproc için "işlem" den bahseder ve başka bir şeyden söz etmez.

// düzenleme // Boost ile C ++ örnek kodu // g ++ -o boost_thread boost_thread.cpp -lboost_thread

#include <unistd.h>
#include <iostream>
#include <boost/thread.hpp>
using namespace std;

int counter;

void print_thread(int i) {
    counter++;
    cout << "thread(" << i << ") counter " << counter << "\n";
    sleep(5);
    counter--;
}

int main() {
    int i = 0;
    int max = 1000000;

    while (i < max) {
        boost::thread(print_thread, i);
        i++;
    }

    return 0;
}

test (bazı satırlar kaldırıldı):

$ ulimit -u
1024
$ ./thread 
...
...
...
thread(828) counter 828
thread(829) counter 829
thread(830) counter 830
thread(831) counter 831
thread(832) counter 832
thread(610) counter thread(833833) counter 834

thread(834) counter 835
thread(835) counter 836
thread(836) counter 837
thread(837) counter 838
thread(838) counter 839
thread(839) counter 840
thread(840) counter 841
thread(841) counter 842
thread(842) counter 843
thread(843) counter 844
thread(844) counter 845
thread(845) counter 846
thread(846) counter 847
thread(847) counter 848
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> >'
  what():  boost::thread_resource_error
Aborted (core dumped)

Dizüstü bilgisayarım boştayken ~ 130 işlem kullanıyor. Dolayısıyla nproc veya Linux daha geniş bir bakış açısıyla süreçler ve iş parçacıkları arasında ayrım yapmaz. Bu benim için makul görünüyor, çünkü iplikler sadece süreçleri değil aynı zamanda yorucuydu.

Yanıtlar:


14

nprocBahsediyorsun sınırı için geçerlidir çalıştırılabilir varlıklar böylelikle (süreçler, bunları içeren ve dolayısıyla,) konuları sınırlıyor, . Her işlemin en az bir iş parçacığı (birincil iş parçacığı) vardır, böylece yalnızca iş parçacıkları çalıştırılabilir . Açıkçası, süreçler "çalıştırılabilir" değildir.

Bu cevap Linux'taki iş parçacıkları ve süreçler arasındaki gerçek farkı açıklar.

Kodu daya'nın cevabında test ettim (ayrıca sleep(1);iş parçacığı kodunda eklendi ) ve onun aksine (?!), Çok fazla iş parçacığı oluşturulduğunda sınıra girdim: pthread_create()geri dönüyordu EAGAIN. pthread_create(3)Dokümantasyon Bu hata hakkında aşağıdaki diyor:

EAGAIN

Başka bir iş parçacığı oluşturmak için yetersiz kaynak veya iş parçacığı sayısı üzerinde sistem tarafından belirlenen bir sınırla karşılaşıldı. İkinci durum iki şekilde ortaya çıkabilir: gerçek bir kullanıcı kimliği için işlem sayısını sınırlayan RLIMIT_NPROC yazılım kaynağı sınırına (setrlimit (2) ile ayarlanır) ulaşıldı; veya çekirdeğin sistem genelinde / proc / sys / çekirdek / iş parçacığı-max sayısı üzerindeki sınırına ulaşıldı.

Çekirdek kaynağında belirli bir iş parçacığı sınırından bahsetmiyorum, sadece orada görüyorum , bu da (ile ) değiştirebileceğiniz sınırdır veya .RLIMIT_NPROClimits.confnproculimit -usetrlimit(2)


0

ulimit yalnızca işlem sayısını sınırlar. Bu nedenle,

ulimit -u 1024

süreç sayısını sınırlandıracaktır.

eg.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void* test(void *ptr){
   return 0;
}



int main()
{
        pthread_t thread[50];
        int i=0;

      for(i=0;i<50;i++){
      if(!pthread_create( &thread[i], NULL,test,NULL))
         printf("%d ",i);

       }


      for(i=0;i<50;i++)
       pthread_join( thread[i], NULL);
       return 0;
}

ulimit koy ve kontrol et

lab@x:/tmp$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
lab@x:/tmp$ 
lab@x:/tmp$ 
lab@x:~$ cd /home/x
lab@x:/home/x$ ./thread 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 lab@x:/home/x$ 
lab@x:/home/x$ 
lab@x:/home/x$ ulimit -u 10
lab@x:/home/x$ 

işlem limiti 10 olarak ayarlandı

lab@x:/home/x$ ./thread 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 lab@x:/home/x$ 
lab@x:/home/x$ 

burada 50 iş parçacığı oluşturulabilir.


3
İlk bakışta kodunuz ve mantığınız doğru görünüyor, ancak korkarım kodunuz ve mantığınız yanlış. İş parçacıklarınız hemen geri döner, uyku (5) veya test () gerektiren başka bir şeyle kodunuz başarısız olur.
Peter Weber

Eh, test () bir süre (1) {} ekledim ve yine de yukarıdaki ile aynı sonucu elde.
daya

İsteğimi düzenledim. Kodumu da test edebilirsiniz. İlk cevabınız "Evet linux sistemleri POSIX iş parçacıklarını ve süreçlerini bir arada sayar" mükemmel bir şekilde doğru görünüyor.
Peter Weber

Evet, bir programda denemedene kadar düşündüm.
daya

2
Sonucuna katılmıyorum . Programınızı denediğimde, çok fazla iş parçacığı oluşturulduğunda sınıra girdim. Linux sınırı yoktur parçacığı için de geçerlidir. Cevabımı gör .
Nisan'ta Totor
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.