我正在寻找优化套接字服务器可以处理的并发连接数的选项,并且有一个想法可以依赖于能够序列化C#套接字,以便可以从内存中删除它们,然后根据需要进行恢复。此方案仅对我来说是可接受的,因为会话持续数小时,并且很少使用套接字发送给客户端,并且在此期间从不接收。我当前的实现是内存限制的,因为我在相应客户端会话的生命周期内将每个套接字保存在内存中。同样,我的想法是,如果我能够序列化套接字并将其写入光盘或将其粘贴到分布式缓存/数据库/文件存储中,我可以释放服务器上的内存,代价是处理每个内存所需的额外时间发送(即反序列化套接字然后发送)。我尝试了几种选择,但每次都遇到了障碍:
通过读取和写入内存中对象的指针来序列化/反序列化套接字。我似乎无法在序列化后恢复套接字。
使用Socket.DuplicateAndClose()方法获取SocketInformation,然后将其序列化,并在需要时使用SocketInformation将套接字恢复到同一进程。一旦恢复后我似乎无法使用套接字,我不确定这是否会节省大量内存,因为它似乎会将非托管资源留在内存中。
在我看来应该有办法实现这一目标。最终,我正在寻找某人指出我正确的方向或确认它是否可能。
非常感谢任何帮助!
答案 0 :(得分:8)
这听起来像是爱丽丝梦游仙境的一个很好的延续 - 一种奇妙的无意义。您无法序列化套接字,因为这没有意义。类“套接字”(我的意思不是.NET Socket类,而是一种被称为套接字的对象)不支持“序列化”的操作,因为套接字(如果我们认为在现实世界中的对象中)不是数据容器而是大门沟通渠道。你可以制作这本书的副本,但制作一本门的纸质副本将非常困难。
现在关于记忆。您的Windows系统上可以有大约64K的套接字(我可能错误的确切数字,但这是近似的)。即使每个插槽有100个字节,您也只占用6 Mb的内存。在现代服务器操作系统(Windows,Linux,您的名字)中,6 Mb的用户模式内存少于零。如果您查看整体应用程序架构,您将获得更多收益。
答案 1 :(得分:1)
如果我正确理解了这个问题,那么您正在尝试序列化Socket
对象,保存其信息(对象内容),然后尝试使用保存的信息重新构建该对象。
这不起作用,因为您不能简单地保存Socket
对象的内容并在以后恢复它。在内部,套接字使用来自操作系统的实际套接字处理程序(打开文件描述符)。保存和恢复此数据不会重新连接操作系统中的实际设备句柄。
套接字需要在操作系统级别物理连接(打开它)。这类似于Stream
对象。您不能简单地保存对象的内容并在以后恢复它;它需要附加到操作系统中的文件描述符。
答案 2 :(得分:0)
你的插座不是问题。他们使用的内存很少。您更有可能如何处理问题的入站和出站数据。
您是否为每个操作分配新的(字节)缓冲区?
改为创建一个缓冲池。如果池为空,则让池创建一个新的缓冲区。完成后不要忘记返回缓冲区。
在缓冲区中获取数据后,您在做什么?
你在建一个字符串吗?如果您有大量传入数据或大字符串,则可能需要切换到StringBuilder。 string.Format(“{0} kdkd {1} jdjd {2}”,var1,var2,var3)分配的内存少于 var1 +“kdkd”+ var2 +“jdjd”+ VAR3
你是如何包装插座的?
你有一个很胖的课,里面有很多东西吗?那么这就是你的胖班问题。