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.
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. –
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
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. –