2015-03-03 127 views
0

我在Windows上开发服务器。我的服务器使用IOCP套接字和数据库。通常的情况是用户长时间连接并保持连接状态。虽然连接的用户可以从服务器请求一些数据。通常请求与数据库访问相关联。客户端请求消息长度可变。消息是与谷歌protobuf数据包和固定长度的头在每条消息之前发送。服务器内存管理

关于内存管理,我可以做些什么不同的事情,而不是使用通常的新/删除功能,可以加快我的服务器速度?我现在唯一的想法是拥有一个头缓冲池并重用它们,而不是频繁地分配/取消分配它们。 你怎么看待为每个用户分开堆,所以在用户断开连接时,我可以一次删除所有用户数据,而不是使用一打删除调用? 有关此主题的任何提示或技巧,表示赞赏。

谢谢。

回答

2

一个缓冲池是一个好主意,我倾向于有一个“缓冲区分配器”对象,所有连接共享,并且可以为I/O目的分配固定大小的缓冲区。在连接层次上集中池(也就是每个套接字具有较小的池以供重用)是一个好主意,因为这减少了共享分配器上的交叉连接争用。

每个连接一个堆似乎是一个重量级解决方案的问题。

我有一些代码,你可以download from here演示共享缓冲区分配器的方法。

+0

哇......代码是惊人的。我有一个问题。与'正常'读取相比,零字节读取是否真的使许多活动连接的内存使用量有所不同?我猜它可能只有更大的数据包?我会开始玩一下。谢谢! – 2015-03-09 07:37:51

+1

零字节的读取过去比现代硬件上的大RAM更有用。这个想法是,如果你有100,000个连接,每个连接有一个读取挂起,那么你有大量的内存锁定,并有一个“锁定页面限制”。据我所知,自XP以来我没有使用零字节读取。 – 2015-03-09 07:41:47