我在TCP
开发了一个C/C++
服务器,该服务器接受客户端的连接。功能之一是读取客户端指定的任意服务器内存。
注意:这里不关心安全性,因为客户端和服务器应用程序仅在本地运行。
发送大块内存(可能带有大量0内存)很慢,因此使用某种压缩似乎是个好主意。这使通信变得相当复杂。
zlib
对其进行压缩。如果压缩的内存小于原始内存,它将保留压缩后的内存。服务器保存内存大小(无论是否压缩)以及发送缓冲区中的压缩字节。当缓冲区已满时,它将被发送回客户端。发送缓冲区的布局如下: Total bytes remaining in the buffer (int) | memory chunks count (int) | list of chunk sizes (int each) | list of whether a chunk is compressed or not (bool each) | list of the data (variable sizes each)
我的问题是压缩方法看起来是否最佳,或者我是否缺少重要的东西。发送TCP
消息是这里的瓶颈,因此在仍然传输相同数据的同时将它们最小化应该是优化性能的关键。
答案 0 :(得分:1)
嘿,我给你一些起点。请记住,这些只是起点。
首先阅读本文: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.156.2302&rep=rep1&type=pdf 还有这个 https://www.sandvine.com/hubfs/downloads/archive/whitepaper-tcp-optimization-opportunities-kpis-and-considerations.pdf
这会提示您可能出什么问题了,而且很多。基本上,我的建议是集中在服务器/网络系统的行为上。我的意思是尝试对其进行压力测试,并尝试获得一致的行为。
如果系统出现拥塞,请制定相应的策略。优化套接字的缓冲区大小。研究环形缓冲区如何为网络协议工作。研究是否可以使用巨型MTU。测试抖动是否是系统中的问题。通常,由于功率更高,协议开始表现为不稳定(操作系统很忙,或者有一些内存分配)。
现在最重要的是,您每时每刻都需要进行压力测试。进行一致的可重复测试,您可以随时进行测试。
如果您使用的是Linux,则setsockopt是您的朋友和敌人。了解它是如何工作的。
定义边界,您的服务器必须能够做什么,不能做什么。
祝你好运。我正在针对延迟优化我的系统,至少可以说这很棘手。