2013-10-25 25 views
5

için istemciye RST'yi gönderir 300k eşzamanlı TCP bağlantılarına ulaşmayı bekleyen Java Netty ile yüksek yüklü bir tcp uygulamasında çalışıyorum.Sunucu, TCP bağlantısı maks. 65000 ~

Test sunucusunda mükemmel çalışır, 300k bağlantılara ulaşır, ancak üretim sunucusuna konuşlandırıldığında, yalnızca 65387 bağlantıyı destekleyebilir, bu numaraya ulaştıktan sonra istemci "java.io.IOException: bağlantıyı eş tarafından sıfırlar" "istisnalar. Birçok kez deniyorum, her seferinde, 65387'ye kadar olan bağlantılarda, istemci bağlantı oluşturamaz.

feryat gibi ağ yakalama, 10.95.196.27 sunucusudur, 10.95.196.29 istemcisidir:

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 

sunucuya istemci 3 el sıkışma sonra, sunucu istemciye bir RST paketi göndermek tarafından istisna nedenidir ve yeni bağlantı kesildi. Yan özel olarak körük yığın

müşteri:

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 tarafı olmayan durumlar vardır.

Ben büyük bağlantılarını desteklemek için feryat olarak bazı sysctl öğesini açmayı deneyin, ama onun işe yaramaz:

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 

maksimum açık zaten ayarlanmış FD için 999999

linux-152k:~ # ulimit -n 
999999 

OS sürüm SUSE Linux 3.0.13 çekirdeği ile Enterprise Server 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 herhangi bir ror bilgileri, CPU ve Hafıza düşük seviyeli, her şey iyi görünüyor, sadece sunucu istemciden bağlantıyı sıfırlar.

SUSE Linux Enterprise Server 11 SP1, 2.6.32 çekirdeği olan bir test sunucumuz var, iyi çalışıyor, 300 k bağlantıya kadar destekleyebilir.

Belki bazı kernel veya güvenlik sınırlaması buna neden olur, ancak sunucu, RST'yi neden gönderdiğine dair bazı hata ayıklama bilgileri almak için herhangi bir öneri veya herhangi bir yol bulamıyorum. Teşekkürler.

+0

Bunun hakkında henüz bir fikir yok. biraz fazladan bilgi buldum. Başka bir test sunucusunda, her şey iyi çalışır, bir linux2.6 çekirdeği olan 300000 bağlantıya ulaşır. Sanırım farklı çekirdek versiyonlarından kaynaklanabilir. Test etmek için daha fazla sunucu alacak ve bazı şeyler varsa güncellenecek. –

+0

Tek bir istemci makinesinin tek bir NIC'sinde 64k'den daha fazla bağlantı oluşturmaya çalışıyor musunuz? Eğer öyleyse, bu mümkün değil. Bağlantıları birden çok istemci makinesinde (veya birden çok NIC) yaymaya çalışabilir misiniz? Bağlantıları azaltan istemci makine olabilir. – trustin

+0

Her biri sunucuya 60000 bağlantı oluşturan 5 istemci makinesi vardı. İstemci tarafında açılan bağlantılar olmadığından eminim, yine de teşekkürler. –

cevap

İlgili konular