写一个程序想验证服务器在hold 1w个链接时内存情况。
1.先说下基本参数
1.先说下基本参数
web@haha ~> cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4161536 web@haha ~> cat /proc/sys/net/ipv4/tcp_wmem 4096 16384 4161536 web@haha ~> cat /proc/sys/net/ipv4/tcp_mem 24180 32241 48360
2.测试环境
简单的阿里云服务器,1核1G。。
3.测试代码,java狗o(╯□╰)o,10000个链接去连本地的9090端口
final Selector selector = Selector.open(); InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 9090); long start = System.currentTimeMillis(); int connected = 0; int currentConnectionPerIP = 0; System.out.println("begin"); while (true) { if (System.currentTimeMillis() - start > 1000 * 60 * 10) { break; } for (; currentConnectionPerIP < 10000; currentConnectionPerIP++) { SocketChannel ch = SocketChannel.open(); ch.configureBlocking(false); Socket s = ch.socket(); s.setReuseAddress(true); ch.register(selector, SelectionKey.OP_CONNECT); ch.connect(addr); } int select = selector.select(1000 * 10); // 10s if (select > 0) { Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> it = selectedKeys.iterator(); while (it.hasNext()) { SelectionKey key = it.next(); if (key.isConnectable()) { SocketChannel ch = (SocketChannel) key.channel(); if (ch.finishConnect()) { ++connected; if (connected % (connectionPerIP / 10) == 0) { System.out.println("connected: " + connected); } key.interestOps(SelectionKey.OP_READ); } } } selectedKeys.clear(); } }
4.测试结果
web@haha ~> cat /proc/net/sockstat sockets: used 20251 TCP: inuse 20053 orphan 0 tw 10 alloc 20054 mem 3 UDP: inuse 7 mem 2 UDPLITE: inuse 0 RAW: inuse 0 FRAG: inuse 0 memory 0
代码运行前内存
web@haha ~> free -m total used free shared buffers cached Mem: 994 825 168 0 9 86 -/+ buffers/cache: 728 265 Swap: 0 0 0
代码运行时内存
转载请注明:爱开源 » socket内存占用疑问?
10000*8K 不是正好等于80M么~ 而且也说明你除了创建socket之外 也没做其他需要消耗多内存的逻辑.