2015-05-13 8 views
5

मैं जेएमटर का उपयोग कर अपने आरईएसटी एपीआई के लिए लोड परीक्षण कर रहा हूं।त्रुटि java.net.SocketException को हल करने के लिए कैसे करें: बहुत सारी खुली फ़ाइलें

मैं जब 1000 समवर्ती उपयोगकर्ताओं से मारा निम्न त्रुटि हो रही है:

Too many open files. Stacktrace follows: 
java.net.SocketException: Too many open files 
    at java.net.Socket.createImpl(Socket.java:397) 
    at java.net.Socket.getImpl(Socket.java:460) 
    at java.net.Socket.setSoTimeout(Socket.java:1017) 
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:126) 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:476) 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:441) 
    at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:390) 

मेरे सर्वर एक और REST API हिट करने के लिए डेटा प्राप्त और संसाधित करने से और अंत में एक JSON प्रतिक्रिया वापस जाने के लिए कोशिश करता है।

मैं लिनक्स में खुली फ़ाइलों की संख्या कैसे बढ़ा सकता हूं?

के बाद कॉल मैं किसी अन्य सर्वर

Map getResponse(Map data, String url){ 
    HTTPBuilder httpBuilder = new HTTPBuilder(url); 
    httpBuilder.request(Method.POST, JSON) { 
     headers.'Authorization' = AppConfig.config.appKey; 
     headers.'Content-type' = 'application/json' 
     body = data 
     response.success = { resp, reader -> 
      return reader as Map; 
     } 
     response.failure = { response, reader -> 
      return null 
     } 
    } 
} 
+0

http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in-linux मदद करता है? – immibis

+0

ऐसा लगता है कि फाइलें बंद नहीं हैं। अपना कोड यहां पोस्ट करें। –

+1

शायद आपने बहुत सारे सॉकेट बनाए हैं लेकिन उन्हें बंद नहीं किया है()। मुझे लगता है कि लिनक्स मशीनों पर खुली फाइलों और सॉकेट के लिए डिफ़ॉल्ट अधिकतम 1024 है। –

उत्तर

4

आप निश्चित रूप से खुले फ़ाइल/सॉकेट की अधिकतम संख्या को खोलने की है, बनाने रहा हूँ। लिनक्स मशीनों पर खुली फाइलों या सॉकेट की अधिकतम संख्या 1024 है। डिफ़ॉल्ट रूप से। आपको इसे बदलने की जरूरत है। आप उल्लेख कर सकते हैं इस java.net.SocketException Too many open files

आप क्वेरी के नीचे का उपयोग कर सकते की अनुमति दी खुली फ़ाइलों

ulimit -n 

की अधिकतम संख्या प्राप्त करने के लिए here से अपने टर्मिनल से जाँच करने के लिए:

क्या हो रहा है है कि अंतर्निहित सॉकेट बंद नहीं हो रहे हैं, और आखिरकार JVM सिस्टम की प्रति-प्रक्रिया सीमा में खुली फ़ाइल डिस्क्रिप्टर पर टक्कर लगी है।

सही समाधान सॉकेट को समय पर बंद करना होगा (जो मुझे लगता है कि, या इसके तुरंत बाद, सर्वर ने कनेक्शन के अंत को बंद कर दिया है)। यह HttpURLConnection के साथ मुश्किल लगता है। यह सब बहुत उलझन में है:

  • डिस्कनेक्ट() बस इसे तुरंत बंद करने के लिए लगता है - या नहीं; जावाडॉक्स जानबूझकर अस्पष्ट हैं कि वास्तव में क्या करता है, और विशेष रूप से जब यह करता है।

  • नज़दीकी() सही विकल्प हो सकता है। का मूल्यांकन खंड जावा बग # 4147525 कहता है: "... इनपुट और/या आउटपुट स्ट्रीम पर बंद करें() को कॉल करें। यह सही ढंग से अंतर्निहित सॉकेट बंद हो जाएगा जब आप रखरखाव कनेक्शन नहीं कर रहे हैं और रखरखाव कनेक्शन सही ढंग से कैश और पुन: उपयोग करेगा (और जो समय-समय पर बंद हो जाएगा और खुद को कम समय के बाद बंद कर देगा)। "

  • लेकिन शायद नहीं। बग # 4142971 कहता है: "करीबी() विधियों को कॉल करने का कोई तरीका नहीं है या दूसरे पर अंतर्निहित HTTP कनेक्शन लगातार है या नहीं।"

एक स्पष्ट उत्तर न करना, इसकी शायद HttpURLConnection वस्तुओं हो सकता है किसी सूची में शामिल है, और सभी परीक्षण रन के अंत में एक ही बार में काट दिया। वह अभी भी रन के कुल आकार को सीमित कर देगा, लेकिन कम से कम खोए गए वर्णक रनों के बीच जमा नहीं होंगे।

शायद असली जवाब HttpURLConnection पर छोड़ना है, और इसके बजाय जकार्ता कॉमन्स से HTTP क्लाइंट का उपयोग करना है। किसी ने सुझाव दिया कि में एक अलग समस्या के साथ कनेक्शन (बग #4143518)।

1

"java.net.SocketException: बहुत अधिक फ़ाइलें खुला" किसी भी जावा सर्वर आवेदन उदा देखा जा सकता है टॉमकैट, वेबलॉगिक, वेबस्पेयर इत्यादि, क्लाइंट कनेक्टिंग और डिस्कनेक्टिंग के साथ अक्सर।

You can find out how to solve "java.net.SocketException: Too many files open" here

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