服务器内存管理
Server memory management
我正在 Windows 上开发服务器。我的服务器使用 IOCP 套接字和数据库。通常情况是用户连接并长时间保持连接。虽然连接的用户可以从服务器请求一些数据。通常请求与数据库访问相关联。客户端请求消息的长度可变。消息是带有 google protobuf 的数据包,并且在每条消息之前发送固定长度 header。
除了使用通常的 new/delete 函数之外,关于内存管理我能做些什么来加快我的服务器速度?我现在唯一的想法是拥有一个 header 缓冲区池并经常重用它们 allocating/deallocating 它们。
您如何看待为每个用户设置单独的堆,以便在用户断开连接时我可以一次删除所有用户数据而不是使用十几个删除调用?
任何有关此主题的提示或技巧都将受到赞赏。
谢谢。
缓冲区池是个好主意,我倾向于有一个所有连接共享的 "buffer allocator" 对象,并且可以为 I/O 目的分配固定大小的缓冲区。在连接级别也进行池化可能是个好主意(即每个套接字都有一个较小的池以供重用),因为这减少了共享分配器上的交叉连接争用。
每个连接一个堆似乎是解决问题的一个重量级解决方案。
我有一些代码,您可以 download from here 演示共享缓冲区分配器方法。
我正在 Windows 上开发服务器。我的服务器使用 IOCP 套接字和数据库。通常情况是用户连接并长时间保持连接。虽然连接的用户可以从服务器请求一些数据。通常请求与数据库访问相关联。客户端请求消息的长度可变。消息是带有 google protobuf 的数据包,并且在每条消息之前发送固定长度 header。
除了使用通常的 new/delete 函数之外,关于内存管理我能做些什么来加快我的服务器速度?我现在唯一的想法是拥有一个 header 缓冲区池并经常重用它们 allocating/deallocating 它们。 您如何看待为每个用户设置单独的堆,以便在用户断开连接时我可以一次删除所有用户数据而不是使用十几个删除调用? 任何有关此主题的提示或技巧都将受到赞赏。
谢谢。
缓冲区池是个好主意,我倾向于有一个所有连接共享的 "buffer allocator" 对象,并且可以为 I/O 目的分配固定大小的缓冲区。在连接级别也进行池化可能是个好主意(即每个套接字都有一个较小的池以供重用),因为这减少了共享分配器上的交叉连接争用。
每个连接一个堆似乎是解决问题的一个重量级解决方案。
我有一些代码,您可以 download from here 演示共享缓冲区分配器方法。