GNU / Linux นับกระบวนการและเธรดเข้าด้วยกันเมื่อฉัน จำกัด จำนวนหรือไม่


11

ฉันต้องการ จำกัด จำนวนกระบวนการต่อผู้ใช้บนเครื่องของฉันด้วย/etc/security/limits.confและค่า nproc

ฉันได้อ่านที่นี่ว่า Linux แยกความแตกต่างระหว่างกระบวนการและเธรดไม่ได้หรือไม่

ขีด จำกัด nproc ปัจจุบันของฉันต่อผู้ใช้คือ 1024 แต่ถ้ารวมเธรดด้วยก็จะต่ำเกินไปในมุมมองของฉัน man-page ของlimits.confกล่าวถึงเท่านั้น "กระบวนการ" สำหรับ nproc และไม่มีอะไรอื่น

// แก้ไข // ตัวอย่างโค้ดใน C ++ พร้อม Boost // 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;
}

ทดสอบ (ลบบางบรรทัด):

$ 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)

แล็ปท็อปของฉันใช้กระบวนการประมาณ 130 กระบวนการในขณะที่ไม่ได้ใช้งาน ดังนั้นnprocหรือLinuxในมุมมองที่กว้างขึ้นไม่ได้แยกความแตกต่างระหว่างกระบวนการและเธรด ซึ่งดูเหมือนว่าสมเหตุสมผลสำหรับฉันเพราะกระทู้อาจเหนื่อยล้าไม่เพียง แต่กระบวนการ

คำตอบ:


14

nprocขีด จำกัด คุณกำลังพูดถึงนำไปใช้กับหน่วยงานที่ทำงานได้ก็จะจึง จำกัด หัวข้อ (และดังนั้นกระบวนการที่มีพวกเขา) ทุกกระบวนการมีอย่างน้อยหนึ่งเธรด (เธรดหลัก) เพื่อให้สามารถรันเธรดได้เท่านั้น กระบวนการที่พูดอย่างเคร่งครัดไม่ใช่ "เรียกใช้" ได้

คำตอบนี้อธิบายความแตกต่างที่แท้จริงระหว่างเธรดและกระบวนการใน Linux

ผมทดสอบโค้ดในDaya 's คำตอบ (ยังเพิ่มsleep(1);(?!) ในรหัสด้าย) และแตกต่างจากเขาผมตี จำกัด เมื่อหลายกระทู้ก็ถูกสร้าง: กำลังจะกลับpthread_create() เอกสารกล่าวว่าต่อไปนี้เกี่ยวกับข้อผิดพลาดนี้:EAGAINpthread_create(3)

EAGAIN

ทรัพยากรไม่เพียงพอในการสร้างเธรดอื่นหรือข้อ จำกัด ที่ระบบกำหนดสำหรับจำนวนเธรดพบ กรณีหลังอาจเกิดขึ้นได้สองวิธี: ข้อ จำกัด ทรัพยากรซอฟท์แวร์ RLIMIT_NPROC (ตั้งค่าผ่าน setrlimit (2)) ซึ่ง จำกัด จำนวนกระบวนการสำหรับ ID ผู้ใช้จริง หรือถึงขีด จำกัด ทั้งระบบของเคอร์เนลตามจำนวนเธรด / proc / sys / kernel / threads-max

ฉันเห็นเอ่ยถึงไม่เฉพาะขีด จำกัด ต่อด้ายในมาเคอร์เนลผมเห็นเพียงRLIMIT_NPROCที่นั่นซึ่งเป็นข้อ จำกัด ที่คุณสามารถเปลี่ยนแปลงได้ในlimits.conf(กับnproc) หรือulimit -usetrlimit(2)


0

ulimit จำกัด จำนวนกระบวนการเท่านั้น ดังนั้นการตั้งค่าโดยใช้

ulimit -u 1024

จะ จำกัด จำนวนของกระบวนการ

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 และตรวจสอบ

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$ 

ขีด จำกัด กระบวนการตั้งไว้ที่ 10

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$ 

ที่นี่ 50 กระทู้สามารถสร้างได้


3
ได้อย่างรวดเร็วก่อนรหัสและเหตุผลของคุณดูขวา แต่ฉันกลัวรหัสและเหตุผลของคุณผิด กระทู้ของคุณจะกลับมาทันทีด้วยโหมดสลีป (5) หรือเวลาอื่นที่ต้องการในการทดสอบ () รหัสของคุณควรล้มเหลว
ปีเตอร์เวเบอร์

ดีฉันเพิ่มในขณะที่ (1) {} ในการทดสอบ () และยังฉันได้รับผลเช่นเดียวกับข้างต้น
Daya

ฉันแก้ไขคำขอแล้ว คุณสามารถทดสอบรหัสของฉันได้เช่นกัน คำตอบแรกของคุณ "Yes ระบบ linux นับ POSIX เธรดและกระบวนการเข้าด้วยกัน" ดูถูกต้องสมบูรณ์
Peter Weber

ใช่นั่นคือสิ่งที่ฉันคิดจนกระทั่งฉันลองในโปรแกรม
Daya

2
ผมไม่เห็นด้วยกับข้อสรุปของคุณ เมื่อฉันลองใช้โปรแกรมของคุณฉันถึงขีด จำกัด เมื่อสร้างเธรดจำนวนมากเกินไป ขีด จำกัด ของลินุกซ์ไม่นำไปใช้กับหัวข้อ ดูคำตอบของฉัน
Totor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.