大量连接时使用 使用epoll管理 or golang 多协程

在开发游戏服务器压力测试工具时,面对大量连接,作者对比了使用Golang多协程和epoll进行IO管理的方法。尽管epoll在处理高并发连接时表现出色,但经过测试,发现在CPU占用方面,Golang的协程实现更低。文章提供了epoller.go、main.go、robot.go等代码示例,并建议读者尝试不同epoll模式(如et模式)以进一步优化性能。
摘要由CSDN通过智能技术生成

最近开发了一个针对游戏服务器框架测压机器人, 当大量的机器人连接建立时, 通常的做法是给每个机器人配置一个网络read协程, 但是当机器人数量比较高时, 有点担心协程的竞争, 正好无意中看到一个百万级连接服务器的文章,学习了一下epoll对conn io的管理, 自己鼓捣了一下,写了个测试工程, 现将代码分享一下, 有兴趣的可以参考参考

注:限Linux

epoller.go

package main

import (
	"log"
	"net"
	"reflect"
	"sync"
	"golang.org/x/sys/unix"
	"syscall"

)

type epoll struct {
   
	fd          int
	connections map[int]net.Conn
	lock        *sync.RWMutex
}
func MkEpoll() (*epoll, error) {
   
	fd, err := unix.EpollCreate1(0)
	if err != nil {
   
		return nil, err
	}
	return &epoll{
   
		fd:          fd,
		lock:        &sync.RWMutex{
   },
		connections: make(map[int]net.Conn),
	}, nil
}
func (e *epoll) Add(conn net.Conn) error {
   
	// Extract file descriptor associated with the connection
	fd := socketFD(conn)
	err := unix.EpollCtl(e.fd, syscall.EPOLL_CTL_ADD, fd, &unix.EpollEvent{
   Events: unix.POLLIN | unix.POLLHUP, Fd: int32(fd)})
	if err != nil {
   
		return err
	}
	e.lock.Lock()
	defer e.lock.Unlock()
	e.connections[fd] = conn
	if len(e.connections)%100 == 0 {
   
		log.Printf("total number of connections: %v", len(e.connections))
	}
	return nil
}
func (e *epoll) Remove(conn net.Conn) error {
   
	fd := socketFD(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值