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

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

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. 解决Nginx+Tomcat时ContextPath不同的问题

    1        问题描述 项目前端模板使用Thymeleaf,在对各种URL进行格式化输出时,都使用@{uri}代码.它会自动读取项目部署的虚拟路径,添加到URI的前端输出. 真实测试和生产环境中, ...

  2. 【转】地址空间、内核空间、IO地址空间

    http://blog.csdn.net/wuxinke_blog/article/details/8769131 有这么一系列的问题,是否在困扰着你:用户程序编译连接形成的地址空间在什么范围内?内核 ...

  3. 字符串解码DecodeString

    字符串解码 原创博客,转载请注明出处!eg:ss=2[abc]3[cd]ef   return:abcabccdcdcdefss=3[a2[c]]2[a]    return:accaccaccaas ...

  4. 用linux文件处理三剑客将微信群成员导出的方法

    工具: Mac/Linux 系统 Chrome Linux命令:vi.cat. wc. grep. awk. sed.sort. uniq 步骤: 1.微信网页版登陆: https://wx.qq.c ...

  5. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  6. SharePoint Server 2013 安装篇 - 如何解决无法找到 .net 4.5 的问题

    SharePoint Server 2013 在安装前,是不能安装 VS 等会自动安装 .net 4.5.x 以上版本的 .net Framework 的软件的.因为安装了 .net Framewor ...

  7. Python中编码问题:u'\xe6\x97\xa0\xe5\x90\x8d' 类型的转为utf-8的解决办法

    相信小伙伴们遇到过类似这样的问题,python2中各种头疼的转码,类似u'\xe6\x97\xa0\xe5\x90\x8d' 的编码,直接s.decode()是无法解决编码问题.尝试了无数办法,都无法 ...

  8. C# linq创建嵌套组

    以下示例演示如何在 LINQ 查询表达式中创建嵌套组. 首先根据学生年级创建每个组,然后根据每个人的姓名进一步细分为小组. public void QueryNestedGroups() { var ...

  9. javascript中toString和valueOf方法的区别

    toString():将对象转为字符串 valueOf():获取对象的原始值, 1.针对基本类型的变量:如在string,number,boolean类型的变量上调用这两个方法时,直接返回原始值,即变 ...

  10. Problem H: STL——括号匹配

    Description 给出一堆括号,看其是否匹配,例如 ().()().(()) 这样的括号就匹配,       )(.)()) 而这样的括号就不匹配 Input 每一行代表一组测试样例,每组测试样 ...