实际上,我开发了一个基于 tcp 的网络服务器,它可以进行大量的读写操作,并且其业务逻辑使用的 CPU 小于零,它充当两个端点之间的桥梁。网络服务器是为 .NET 4.5 开发的,它使用:
- IOCP (Socket.xxxAsync)
- 预先分配的 SocketAsyncEventArgs 的缓冲池(用于 SendAsync 和 ReadAsync)
- 预分配字节[]的缓冲池(仅用于读取)
- System.Collections.Concurrent
- 小于零锁(嗯,实际上有一个:))
- 其他一些东西
我的担忧与垃圾收集有关,事实上,据我所知,虽然我避免内存碎片预分配我需要的所有缓冲区,但垃圾收集器检查它们是否必须被收集,因为它们没有分配在大堆内.
会更好,而不是分配 10.000 字节 [8192] 会更好地分配一个大字节 [81920000] 并使用 ArraySegment 来使用切片?
谢谢你。
更新
我切换到服务器模式垃圾收集,似乎我的系统比以前工作得更好(实际上我能够在同一台机器上处理多达 4GiB 的流量和 5000 个客户端,这意味着 10000 个套接字)。简而言之,我将开始在更多机器上测试架构。