应用程序的响应时间与给定时间段内输入触发器的数量无关 我有一个多线程的C++网络应用程序,它将UDP数据包作为输入来输入,然后通过各种队列和线程跳过应用程序/处理,最后推送到TCP套接字上。p>

应用程序的响应时间与给定时间段内输入触发器的数量无关 我有一个多线程的C++网络应用程序,它将UDP数据包作为输入来输入,然后通过各种队列和线程跳过应用程序/处理,最后推送到TCP套接字上。p>,c++,linux,multithreading,performance,C++,Linux,Multithreading,Performance,我所看到的是,如果输入速度慢,比如说5/秒,则总响应时间(从输入到输出)慢(比如100毫秒),如果输入速度快,比如20/秒,则响应时间也快(约50毫秒)。这个观察真的很奇怪。而且在快速情况下也会弄乱响应时间,因为第一次响应总是很慢。只是为了确保——应用程序在慢速和快速情况下所做的工作量完全相同 已经尝试调查过的事情- 它是一个双Xeon盒,运行Linux 2.6内核禁用的Turbo boost,确保处理器处于C0状态 消除了网络原因。根本原因在框内。(在软件或硬件方面) 我有一个假输入,通过一

我所看到的是,如果输入速度慢,比如说5/秒,则总响应时间(从输入到输出)慢(比如100毫秒),如果输入速度快,比如20/秒,则响应时间也快(约50毫秒)。这个观察真的很奇怪。而且在快速情况下也会弄乱响应时间,因为第一次响应总是很慢。只是为了确保——应用程序在慢速和快速情况下所做的工作量完全相同

已经尝试调查过的事情-

  • 它是一个双Xeon盒,运行Linux 2.6内核禁用的Turbo boost,确保处理器处于C0状态

  • 消除了网络原因。根本原因在框内。(在软件或硬件方面)

  • 我有一个假输入,通过一个定时器从输入到输出,通过系统来保持应用程序“温暖”——没有效果。(a)申请 的工作线程正忙于等待并固定到内核)

  • 性能点表明每件事情都变慢了——这基本上意味着处理器在没有持续负载的情况下会变慢——但没有任何其他迹象表明(17z/涡轮增压器)或者我读错了它们


有人对可能发生的事情有看法吗

以我的经验,这将是纳格尔的邪恶手段的肮脏行径。在我看来,缓冲区中填充TCP数据包的数据比get发送的数据多,这听起来非常合理。在没有太多数据的情况下,tcp数据包正在等待来自另一端的ack,正如我们所知,这是延迟的


解决方案-学会在创建任何支持发送的TCP套接字后,首先确保禁用Nagle的程序杀手。

它可能在网络循环中的某个地方进行缓冲吗?响应速度越快,缓冲区被转储的时间就越早,消息速度越慢,填充缓冲区的时间就越长?您能否完全消除TCP/UDP/IP,只将“假”数据包输入程序的前端队列,并测量到最后的延迟?忙等待是否真的很忙?没有等待、锁、互斥锁,只有自旋锁?您是否在待机状态下执行内存密集型操作?这可能会刷新缓存。