- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
func handleConn(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
if _, ok := err.(websocket.HandshakeError); !ok {
log.Println(err)
}
return
}
go writer(ws)
reader(r, ws)
}
func main() {
http.HandleFunc("/", handleConn)
}
我正在尝试使用 golang 构建一个高扩展性的 websocket 服务器。由于 native go websocket 包中缺少支持,我正在使用 https://github.com/gorilla/websocket .
对于每个连接,都会生成一个 goroutine 来处理对其的写入。用于扩展大量连接。假设我有 1M 的并发连接,那么服务器上应该有 1M 的 goroutines 正在运行。
硬件规范:
16GB 内存
4核CPU
2.5 GHz 英特尔酷睿 i5
是否可以在不影响性能的情况下处理大量连接?
最佳答案
让我们做一些数学:
理论上:每个 go-routine 消耗 8KB 内存。因此,对于一百万个插槽,需要 8GB 的内存。
现在,让我们将范式转向实用性。由于您使用的是网络套接字,因此您正在寻找双向 channel 通信。因此,您必须保留一个缓冲区来从每个套接字读取数据。因此,另外 8 GB 的 RAM 仅用于监听来自套接字的数据。这些数字仅表示旋转和生成一百万个连接所需的资源,不包括其他重要因素(为其他任务保留的资源、内核保留空间、操作系统保留空间等)
结论:这种方法很简单,但无法扩展到一定限度。
您肯定需要更多的 RAM,才能按建议的数字进行缩放。
你可以通过实现像 kQueue/ePoll 这样的东西来最小化内存消耗。通过这种方法,而不是不断地等待数据被消耗,浪费缓冲内存,你会实现一个回调,如果套接字准备好读取/写入数据,它会得到通知,然后你可以创建一个缓冲区并进行读取/对文件描述符的写操作。这将帮助您重用缓冲区,从而减少资源消耗。
希望对您有所帮助!
关于go - 使用 golang 扩展 webscocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41258268/
我需要在 socket.io 和 websocket(来自“ws”包)处理程序之间共享相同的 http 服务器。不幸的是,尽管他们正在监听不同的前缀,但第一个监听/socket.io,第二个监听/we
func handleConn(w http.ResponseWriter, r *http.Request) { ws, err := upgrader.Upgrade(w, r,
我是一名优秀的程序员,十分优秀!