2013-10-25 7 views
5

से अधिक है, मैं जावा नेटटी के साथ एक उच्च लोड टीसीपी एप्लिकेशन पर काम कर रहा हूं, जो 300k समवर्ती टीसीपी कनेक्शन आने की उम्मीद करता है। सहकर्मी से कनेक्शन रीसेट:सर्वर क्लाइंट को आरएसटी भेजता है जब टीसीपी कनेक्शन 65000 ~

यह परीक्षण सर्वर पर सही काम करता है, 300k कनेक्शन पहुंचें, लेकिन जब उत्पादन सर्वर के लिए तैनात है, यह केवल 65,387 कनेक्शन का समर्थन कर सकते हैं, के बाद इस संख्या में आते हैं, तो ग्राहक बाहर फेंक एक "java.io.IOException "अपवाद। मैं कई बार कोशिश करता हूं, हर बार, जब 65387 तक कनेक्शन होता है, क्लाइंट कनेक्शन नहीं बना सकता है।

bellow के रूप में नेटवर्क पर कब्जा, 10.95.196.27 सर्वर है, 10.95.196.29 ग्राहक है:

16822 12:26:12.480238 10.95.196.29 10.95.196.27 TCP 74 can-ferret > http [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=872641174 TSecr=0 WS=128 
16823 12:26:12.480267 10.95.196.27 10.95.196.29 TCP 66 http > can-ferret [SYN, ACK] Seq=0 Ack=1 Win=2920 Len=0 MSS=1460 SACK_PERM=1 WS=1024 
16824 12:26:12.480414 10.95.196.29 10.95.196.27 TCP 60 can-ferret > http [ACK] Seq=1 Ack=1 Win=14720 Len=0 
16825 12:26:12.480612 10.95.196.27 10.95.196.29 TCP 54 http > can-ferret [FIN, ACK] Seq=1 Ack=1 Win=3072 Len=0 
16826 12:26:12.480675 10.95.196.29 10.95.196.27 HTTP 94 Continuation or non-HTTP traffic 
16827 12:26:12.480697 10.95.196.27 10.95.196.29 TCP 54 http > can-ferret [RST] Seq=1 Win=0 Len=0 

के बाद सर्वर से ग्राहक 3 हाथ मिलाना, सर्वर क्लाइंट के लिए एक आरएसटी पैकेज भेजने से अपवाद कारण, और नया कनेक्शन टूट गया था।

ग्राहक के पक्ष अपवाद के रूप में bellow ढेर:

16:42:05.826 [nioEventLoopGroup-1-15] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the end of the pipeline. It usually means the last handler in the pipeline did not handle the exception. 
java.io.IOException: Connection reset by peer 
    at sun.nio.ch.FileDispatcherImpl.read0(Native Method) ~[na:1.7.0_25] 
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) ~[na:1.7.0_25] 
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:225) ~[na:1.7.0_25] 
    at sun.nio.ch.IOUtil.read(IOUtil.java:193) ~[na:1.7.0_25] 
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:375) ~[na:1.7.0_25] 
    at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:259) ~[netty-all-4.0.0.Beta3.jar:na] 
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:885) ~[netty-all-4.0.0.Beta3.jar:na] 
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:226) ~[netty-all-4.0.0.Beta3.jar:na] 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:72) ~[netty-all-4.0.0.Beta3.jar:na] 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:460) ~[netty-all-4.0.0.Beta3.jar:na] 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:424) ~[netty-all-4.0.0.Beta3.jar:na] 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:360) ~[netty-all-4.0.0.Beta3.jar:na] 
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:103) ~[netty-all-4.0.0.Beta3.jar:na] 
    at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25] 

Sever पक्ष नहीं अपवाद होते हैं।

मैं था कुछ sysctl आइटम निर्णायक के रूप में bellow विशाल कनेक्शन का समर्थन करने की कोशिश है, लेकिन इसकी बेकार:

net.core.wmem_max = 33554432 
net.ipv4.tcp_rmem = 4096 4096 33554432 
net.ipv4.tcp_wmem = 4096 4096 33554432 
net.ipv4.tcp_mem = 786432 1048576 26777216 
net.ipv4.tcp_max_tw_buckets = 360000 
net.core.netdev_max_backlog = 4096 
vm.min_free_kbytes = 65536 
vm.swappiness = 0 
net.ipv4.ip_local_port_range = 1024 65535 
net.ipv4.tcp_max_syn_backlog = 4096 
net.netfilter.nf_conntrack_max = 3000000 
net.nf_conntrack_max = 3000000 
net.core.somaxconn = 327680 

अधिकतम खुला पहले से ही सेट एफडी के लिए 999999

linux-152k:~ # ulimit -n 
999999 

ओएस रिलीज SUSE लाइनेक्स है 3.0.13 कर्नेल के साथ एंटरप्राइज सर्वर 11 SP2:

linux-152k:~ # cat /etc/SuSE-release 
SUSE Linux Enterprise Server 11 (x86_64) 
VERSION = 11 
PATCHLEVEL = 2 
linux-152k:~ # uname -a 
Linux linux-152k 3.0.13-0.27-default #1 SMP Wed Feb 15 13:33:49 UTC 2012 (d73692b) x86_64 x86_64 x86_64 GNU/Linux. 

dmesg नहीं किया है किसी भी एर रोर जानकारी, सीपीयू और मेमोरी कम स्तर रखती है, हर चीज अच्छी लगती है, बस ग्राहक से सर्वर रीसेट कनेक्शन।

हमारे पास एक परीक्षण सर्वर है जो 2.6.32 कर्नेल के साथ एसयूएसई लिनक्स एंटरप्राइज़ सर्वर 11 एसपी 1 था, यह अच्छी तरह से काम करता है, 300k कनेक्शन तक समर्थन कर सकता है।

मुझे लगता है कि शायद कुछ कर्नेल या सुरक्षा सीमा इसका कारण बनती है, लेकिन मुझे यह पता नहीं है कि कोई सर्वर या आरएसटी क्यों भेजता है, इस बारे में कुछ डीबग सूचनाएं प्राप्त करने के लिए कोई सुझाव नहीं है? धन्यवाद।

+0

अभी भी इस पर कोई विचार नहीं है। बस कुछ अतिरिक्त जानकारी मिली। एक और परीक्षण सर्वर में, सब ठीक काम करता है, 300000 कनेक्शन तक पहुंचें, जो एक linux2.6 कर्नेल है। मुझे लगता है कि शायद विभिन्न कर्नेल संस्करण के कारण हो सकता है। परीक्षण करने के लिए और अधिक सर्वर मिलेगा, और अगर कुछ चीज मिलती है तो अपडेट करें। –

+0

क्या आप एकल क्लाइंट मशीन के एक एनआईसी पर 64k से अधिक कनेक्शन बनाने का प्रयास करते हैं? यदि ऐसा है, तो यह संभव नहीं है। क्या आप कई क्लाइंट मशीनों (या एकाधिक एनआईसी) में कनेक्शन फैलाने का प्रयास कर सकते हैं? यह सिर्फ क्लाइंट मशीन हो सकती है जो कनेक्शन को छोड़ देती है। – trustin

+0

5 क्लाइंट मशीनें थीं, उनमें से प्रत्येक सर्वर से 60000 कनेक्शन बनाती थीं। मुझे यकीन है कि यह क्लाइंट साइड ड्रॉप कनेक्शन नहीं था, वैसे भी धन्यवाद। –

उत्तर

1

संथाल, मैं सिर्फ नीचे दिए गए लिंक में आए है, और यह है कि यह अपने प्रश्न का उत्तर दे सकते हैं लगता है: What is the theoretical maximum number of open TCP connections that a modern Linux box can have

+0

धन्यवाद, मैं लिंक की समीक्षा करता हूं, यह एफडी सीमा का उल्लेख करता है, यह पहले से ही मेरे सर्वर में 99 99 99 पर सेट है। –

1

अंत में मूल कारण मिला है। जब> 64 * 1024.

fd JDK7_45 को अपग्रेड करने के बाद सीधे शब्दों में कहा, यह एक JDK बग था, http://mail.openjdk.java.net/pipermail/nio-dev/2013-September/002284.html जो कारण एनपीई को देखें, अब सब कुछ अच्छा काम करता है।

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