** 原创文章,请勿转载 **

并发服务器是一个老生常谈的话题,今天这里也写一个。

1. 目标

同时在线连接20万(c20w)。

开发语言:重要的事情说三遍,GOLANG, GOLANG, GOLANG!

那为什么是20W,不是30W或其它? 这个数字随意。   :)

2. 环境:

虚拟机(xenserver),    虚出6台机器(OS: CentOS 6.6 64bit) :
       . 一台服务器8核CPU,2G内存
       . 五台客户端2核CPU,2G内存

3.  改centos几个参数, 6台机器一样:
  
# ulimit -a

看 open files
      改成300000(大于20W就行) :
   #  ulimit -n 300000

   改端口范围
  

# echo 1025 65000 > /proc/sys/net/ipv4/ip_local_port_range

4. golang代码

    服务端: server.go

package main

import (
"log"
"net"
"sync"
"time"
) func main() {
tcpAddr, err := net.ResolveTCPAddr("tcp", ":5000") if err != nil {
log.Fatalln("net.ResolveTCPAddr fail", err)
} listener, err := net.ListenTCP("tcp4", tcpAddr)
if err != nil {
log.Println("server failed to start...")
return
} defer listener.Close()
go print()
log.Println("begin listening, addr : ", tcpAddr) for {
conn, err := listener.Accept()
if err != nil {
log.Println("socket accept failed. reason: ", err)
continue
} go handleConnection(conn)
} } func print() {
ticker := time.NewTicker(5 * time.Second) for {
<-ticker.C
log.Println(len(clients.Map))
}
} var num = 0
var num2 = 0
var clients = Clients{Map: make(map[string]int, 0)} type Clients struct {
sync.RWMutex
Map map[string]int
} func (c *Clients) Add(ip string) {
c.Lock()
c.Map[ip] = 1
c.Unlock()
} func (c *Clients) Del(ip string) {
c.Lock()
delete(c.Map, ip)
c.Unlock()
}
func handleConnection(conn net.Conn) {
ip := conn.RemoteAddr().String()
clients.Add(ip) buf := make([]byte, 64)
for {
_, err := conn.Read(buf)
//log.Println("n=", n)
if err != nil {
//log.Println(err)
conn.Close()
clients.Del(ip)
}
}
}

客户端: client.go

package main

import (
"log"
"net"
) func main() {
for i := 0; i < 40000; i++ {
conn, err := net.Dial("tcp", "x.x.x.x:5000")
if err != nil {
log.Println(err)
return
} go Read(conn)
} log.Println("ok")
select {}
} func Read(conn net.Conn) {
buf := make([]byte, 64)
for {
_, err := conn.Read(buf)
if err != nil {
log.Println(err)
return
}
}
}

结论:

开始时,服务器是2核,2G内存, 达到8W连接左右,接受新连接的速度就慢了。后来改成8核,20W连接无压力。

最终5个客户端,每个客户端发起40000个连接, 共20W连接。
      服务器单进程, 接受20W个连接。CPU,内存压力都很小。

tcp并发服务器(c20w)的更多相关文章

  1. TCP并发服务器简单示例

    并发服务器的思想是每一个客户的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理 1. 服务器端 #include <stdio.h> #include <sys/types ...

  2. Linux网络编程——tcp并发服务器(poll实现)

    想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...

  3. Linux select TCP并发服务器与客户端编程

    介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到 ...

  4. UNIX网络编程——并发服务器(TCP)

    在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现. 网络服务器通常用fork来同时 ...

  5. tcp并发服务端

    TCP并发服务器:并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理. 创建TCP并发服务器的算法如下: socket(……): //创建一个TCP ...

  6. LINUX环境并发服务器的三种实现模型

    服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了 ...

  7. Linux网络编程服务器模型选择之并发服务器(上)

    与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...

  8. linux 网络编程 3---(io多路复用,tcp并发)

    1,io模型: 阻塞io.非阻塞io.io多路复用,信号驱动io. 阻塞Io与非阻塞io的转换,可用fcntl()函数 #include<unistd.h> #include<fcn ...

  9. 高并发服务器建议调小 TCP 协议的 time_wait 超时时间。

    1. [推荐]高并发服务器建议调小 TCP 协议的 time_wait 超时时间. 说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 ...

随机推荐

  1. PowerApps 经验总结

    Label的padding不要设置成0,因为有些字体会超出当前的框架,造成Clip效果 Label的AutoHeight并不会将原来自带的Height删除,所以有的时候空间更新属性出现问题,就会造成显 ...

  2. JavaScript函数之作用域 / 作用链域 / 预解析

    关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ -------- ...

  3. JS中apply和call的区别和用法

    Javascript中有一个call和apply方法,其作用基本相同,但是它们也有略微不同的地方. JS手册中对call方法的解释是: call方法:调用一个对象的一个方法,以另一个对象替换当前对象. ...

  4. ssh -T git@github.com出现Permission denied (publickey)

    参考自:http://blog.csdn.net/sunnypotter/article/details/18948053 参考自:http://stackoverflow.com/questions ...

  5. 成为一名Java高级工程师你需要学什么

    宏观上: 1.技术广度方面至少要精通多门开源技术吧,研究过struts\spring等的源码.2.项目经验方面从头到尾跟过几个大项目,头是指需求阶段,包括需求调研.尾是指上线交付之后,包括维护阶段.3 ...

  6. BandwagonHost搬瓦工VPS自建

    地址:https://bwh1.net/aff.php?aff=18648 ,购买$2.99的就够用了(现在没有$2.99的了,最低是$4.99) 步骤一: 步骤二: 步骤三:选图中的选项,然后点 A ...

  7. python异步并发模块concurrent.futures入门详解

    concurrent.futures是一个非常简单易用的库,主要用来实现多线程和多进程的异步并发. 本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo. ...

  8. log4j 和slf4j的比较

    log4j 和slf4j的比较 slf4j 官网:https://www.slf4j.org/manual.html slf4j(simple logging facade for java)是Jav ...

  9. MySQL复制之理论篇

    一.MySQL复制概述 MySQL支持两种复制方式:基于行的复制和基于语句的复制(逻辑复制).这两种方式都是通过在主库上记录 二进制日志.在备库重放日志的方式来实现异步的数据复制,其工作原理如下图: ...

  10. java swing中Timer类的学习

    最近在完成学校课程的java平时作业,要实现一个计时器,包含开始.暂停以及重置三个功能.由于老师规定要用这个timer类,也就去学习了一下,顺便记录一下. 首先呢去查了一下java手册上的东西,发现t ...