2016-10-31 6 views
8

नहीं बना सकता है मैं एक पायथन मॉड्यूल का उपयोग कर रहा हूं जो संदेशक्यूज़ प्राप्त करने के लिए पॉज़िक्स वास्तविक समय एक्सटेंशन को लपेटता है।10 से अधिक mqueues

यह रिपोर्टिंग OSError: This process already has the maximum number of files open

मैं MQ सीमा और rlimit में देखा है और जाँच की है कि वे सभी बहुत अधिक सेट कर रहे हैं इससे पहले कि अजगर कोड

#!/usr/bin env python 
import uuid 
import posix_ipc 
import time 

def spawn(): 
    return posix_ipc.MessageQueue("/%s" % uuid.uuid4(), flags=posix_ipc.O_CREAT) 

i = 0 
while True: 
    i += 1 
    spawn() 
    print(i) 

इस बारे में 10 MQS बनाएगा है। जैसे

fs.file-max = 2097152 
fs.mqueue.msg_max = 1000 
fs.mqueue.queues_max = 1000 

और यहां तक ​​कि विशेषाधिकार प्राप्त उपयोगकर्ताओं के लिए भी यह केवल 10 कतार बनायेगा।

बराबर सी सीधे वास्तविक समय एक्सटेंशन का उपयोग कर के रूप में

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <errno.h> 
#include <mqueue.h> 

#define handle_error(msg) \ 
    do { perror(msg); exit(EXIT_FAILURE); } while (0) 

int main(int argc, char **argv) 
{ 
    mqd_t mq; 
    struct mq_attr attr; 
    char buffer[1024 + 1]; 
    int must_stop = 0; 

    /* initialize the queue attributes */ 
    attr.mq_flags = 0; 
    attr.mq_maxmsg = 10; 
    attr.mq_msgsize = 1024; 
    attr.mq_curmsgs = 0; 

    /* create the message queue */ 
    int count = 0; 
    char name[5]; 
    while (1) { 
     sprintf(name, "/%d", count); 
     mq = mq_open(name, O_CREAT | O_RDONLY, 0644, &attr); 
     if (mq == (mqd_t) -1) 
      handle_error("mq_open"); 
     count++; 

    } 
    return 0; 
} 

इस प्रकार है (साथ gcc -lrt test.c संकलन) लेकिन यह केवल मुझे 20 MQS खुला हो जाता है एक समय में। वास्तव में मैं एक समय में कुछ सौ शायद एक हजार खुला होना चाहता हूं।

किसी को भी कोई विचार या सुझाव मिले?

संपादित करें: सी संस्करण में बेहतर त्रुटि जांच। अभी भी अधिकतम

+2

सी कार्यक्रम त्रुटि की जांच सही नहीं है - _errno_ जाँच करता है, तो 'mq_open' रिटर्न' (mqd_t) -1' । – pilcrow

+0

@pilcrow इसे फिक्स्ड –

उत्तर

5

पैरामीटर fs.mqueue.queues_max सिस्टम में केवल संदेश कतारों की एक वैश्विक संख्या है। जिस सीमा तक आप पहुंच रहे हैं वह प्रति प्रक्रिया संदेश कतारों की संख्या है। क्योंकि mq_open त्रुटि कोड के बारे में कहते हैं:

[EMFILE] बहुत अधिक संदेश कतार वर्णनकर्ता या फ़ाइल वर्णनकर्ता इस प्रक्रिया का उपयोग कर रहे हैं।

आप आम तौर पर (एक सेट) getrlimit/setrlimit साथ है कि इस प्रक्रिया के अनुसार सीमा को पढ़ने के लिए सक्षम होना चाहिए। rlimit के लिए आदमी पृष्ठ बताता है:

RLIMIT_MSGQUEUE (लिनक्स 2.6.8 के बाद से)

बाइट की संख्या कि फोन करने की प्रक्रिया का वास्तविक यूजर आईडी के लिए POSIX संदेश कतार के लिए आवंटित किया जा सकता है पर सीमा निर्दिष्ट करता है । यह सीमा mq_open (3) के लिए लागू है। प्रत्येक संदेश कतार है कि उपयोगकर्ता मायने रखता है (जब तक यह निकाल दिया जाता है) इस सीमा के खिलाफ सूत्र के अनुसार बनाता है:

bytes = attr.mq_maxmsg * sizeof(struct msg_msg *) + 
     attr.mq_maxmsg * attr.mq_msgsize 

जहां attr mq_attr संरचना चौथा तर्क के रूप में निर्दिष्ट mq_open को (3) है।

फॉर्मूला में पहला जोड़, जिसमें आकार (स्ट्रक्चर msg_msg *) (लिनक्स/i386 पर 4 बाइट्स) शामिल हैं, यह सुनिश्चित करता है कि उपयोगकर्ता असीमित संख्या में शून्य-लंबाई संदेश नहीं बना सकता (ऐसे संदेश फिर भी प्रत्येक सिस्टम कुछ उपभोग करते हैं बहीखाता ओवरहेड के लिए स्मृति)।

तुम भी मूल्य पढ़ सकते हैं और साथ गुणा आपको क्या चाहिए करने की कोशिश कर सकते हैं:

struct rlimit limit; 

getrlimit(RLIMIT_MSGQUEUE, &limit); 
limit.rlim_cur *= 20; 
limit.rlim_max *= 20; 
setrlimit(RLIMIT_MSGQUEUE, &limit); 
+0

इस समय से कोई भी काम नहीं करता था –

संबंधित मुद्दे