tcp并发服务器(c20w)
** 原创文章,请勿转载 **
并发服务器是一个老生常谈的话题,今天这里也写一个。
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)的更多相关文章
- TCP并发服务器简单示例
并发服务器的思想是每一个客户的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理 1. 服务器端 #include <stdio.h> #include <sys/types ...
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- Linux select TCP并发服务器与客户端编程
介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到 ...
- UNIX网络编程——并发服务器(TCP)
在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现. 网络服务器通常用fork来同时 ...
- tcp并发服务端
TCP并发服务器:并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理. 创建TCP并发服务器的算法如下: socket(……): //创建一个TCP ...
- LINUX环境并发服务器的三种实现模型
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了 ...
- Linux网络编程服务器模型选择之并发服务器(上)
与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...
- linux 网络编程 3---(io多路复用,tcp并发)
1,io模型: 阻塞io.非阻塞io.io多路复用,信号驱动io. 阻塞Io与非阻塞io的转换,可用fcntl()函数 #include<unistd.h> #include<fcn ...
- 高并发服务器建议调小 TCP 协议的 time_wait 超时时间。
1. [推荐]高并发服务器建议调小 TCP 协议的 time_wait 超时时间. 说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 ...
随机推荐
- VS中Release模式下生成去掉生成pdb文件
1.右键项目,选择属性 2.选择正确的配置,点击高级 3.调试信息选择 none,点击确定.
- C语言指针的那些坑
那些年把我们坑惨的指针 一.引言 当我们使用c语言的时候,不可避免的就得用到指针,然后对于刚刚接触C语言的猿兄们,可能会有点不适应,特别是刚刚从python等离硬件很远的语言转过来的. 下面我为大家总 ...
- [js插件开发教程]实现一个比较完整的开源级选项卡插件
在这篇文章中,我实现了一个基本的选项卡功能:请猛击后面的链接>> [js插件开发教程]原生js仿jquery架构扩展开发选项卡插件. 还缺少两个常用的切换(自动切换与透明度渐变),当然 ...
- Java 7 JVM和垃圾收集
---恢复内容开始--- 写JAVA程序,一定要了解JVM(JAVA Virtual machine)一些基础知识和垃圾收集.如果对JVM已经很了解了,可以不用继续往下阅读了.本文只针对Java 7, ...
- Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027
MVC模型 一.构建基架. MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码.在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码. 首先定义一个模型类如下所示: ...
- 使用 Hadoop 进行语料处理(面试题)
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7751741.html ------------------------------------ ...
- Spring + Fastweixin 微信开发
这篇文章转自<http://www.qtdebug.com/spring-weixin/> 微信有两种模式,编辑模式和开发者模式,有些功能是互斥的,不可以同时使用,微信开发需要在开发者模式 ...
- Java基础笔记11
异常: 即java程序在运行时出现的意外情况. java如何处理异常. try{ //可能发生异常的地方 }catch(异常类型 对象){ //异常处理处 }catch(异常类型 对象){ }.. ...
- Python学习之一:Python2.7与opencv2.4安装配置
安装前准备: 1.确定所安装的电脑是32位还是64位系统:(作者电脑是64bit win10) 2.下载对应的安装包: (1)下载最新Python安装包:https://www.python.org/ ...
- 暑假练习赛 003 F Mishka and trip
F - Mishka and trip Sample Output Hint In the first sample test: In Peter's first test, there's on ...