निम्नलिखित कोड 100000 धागे बनाने के लिए माना जाता है:एनपीटीएल 65528 पर अधिकतम धागे कैप्स करता है?
/* compile with: gcc -lpthread -o thread-limit thread-limit.c */
/* originally from: http://www.volano.com/linuxnotes.html */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define MAX_THREADS 100000
int i;
void run(void) {
sleep(60 * 60);
}
int main(int argc, char *argv[]) {
int rc = 0;
pthread_t thread[MAX_THREADS];
printf("Creating threads ...\n");
for (i = 0; i < MAX_THREADS && rc == 0; i++) {
rc = pthread_create(&(thread[i]), NULL, (void *) &run, NULL);
if (rc == 0) {
pthread_detach(thread[i]);
if ((i + 1) % 100 == 0)
printf("%i threads so far ...\n", i + 1);
}
else
{
printf("Failed with return code %i creating thread %i (%s).\n",
rc, i + 1, strerror(rc));
// can we allocate memory?
char *block = NULL;
block = malloc(65545);
if(block == NULL)
printf("Malloc failed too :(\n");
else
printf("Malloc worked, hmmm\n");
}
}
sleep(60*60); // ctrl+c to exit; makes it easier to see mem use
exit(0);
}
यह रैम 32GB के साथ एक 64 बिट मशीन पर चल रहा है; डेबियन 5.0 स्थापित, सभी स्टॉक।
- ulimit -s 512 ढेर आकार रखने के लिए नीचे
- /proc/sys/कर्नेल/pid_max 1,000,000 करने के लिए सेट (डिफ़ॉल्ट रूप से, यह पता 32k पीआईडी पर कैप्स)।
- ulimit -u 1000000 अधिकतम प्रक्रियाओं
- /proc/sys/कर्नेल/धागे-अधिकतम सेट 1000000 (यह सब मायने रखती है नहीं लगता है) (डिफ़ॉल्ट रूप से, यह बिल्कुल सेट नहीं था) को बढ़ाने के लिए
इस बाहर थूक निम्नलिखित चल रहा है:
65500 threads so far ...
Failed with return code 12 creating thread 65529 (Cannot allocate memory).
Malloc worked, hmmm
मैं निश्चित रूप से राम से बाहर नहीं चल रहा हूँ; मैं इन कार्यक्रमों में से कई को एक ही समय में चलाना शुरू कर सकता हूं और वे सभी अपने 65k धागे शुरू करते हैं।
(कृपया मुझे 100,000+ धागे शुरू करने की कोशिश नहीं सुझाव से बचना। यह कुछ ऐसा है जो चाहिए काम करते हैं। मेरे वर्तमान epoll आधारित सर्वर लगभग 200k + और हर समय कनेक्शन various papers है की साधारण परीक्षण है कि धागे सिर्फ सुझाव है कि है एक बेहतर विकल्प हो सकता है। - धन्यवाद :))
'ulimit -s 512' वास्तव में कम से कम ढेर आकार 512 किलोबाइट, नहीं 512 बाइट्स करने के लिए सेट करता है। तो 100,000 धागे के साथ जो लगभग 50 जीबी होगा (हालांकि, यह समस्या नहीं है, क्योंकि ढेर मांग-आवंटित हैं)। – caf
हां, मैंने इसे केवल ulimit -s 1 पर सेट करने का प्रयास किया है और 65528 धागे का परिणाम समान है। वही अगर मैं उस मामले के लिए ulimit-1024 का उपयोग करता हूं। – rekamso
क्या आप स्ट्रिंग (और धैर्य) के साथ पुष्टि कर सकते हैं कि अंतिम pthread_create (क्लोन (2)?) कॉल वास्तव में ENOMEM के साथ विफल रहता है? क्या मूल्य हैं, और यदि आप '/ proc/sys /' फ़ाइलों को बढ़ाते हैं तो क्या होता है: 'vm/max_map_count',' kernel/pid_max' और 'कर्नेल/थ्रेड-अधिकतम'? – pilcrow