IOCP非常适合许多连接,但我想知道的是,每个TCP套接字允许多个挂起的接收或多个挂起写入是否有显着的好处,或者如果我允许的话,我真的不会失去性能每个套接字一个待处理接收和一个待处理发送(这真的简化了事情,因为我不必处理无序完成通知)?
我的一般用例是为IOCP端口提供服务的2个工作线程,处理多个连接(超过2个但小于10个),其中传输的数据是两种形式的以太网:一个是频繁的非常小的消息(如果可以手动,但通常需要经常发送,每发送数据仍然很小),另一个是传输大文件。
答案 0 :(得分:3)
除非您打算关闭网络堆栈的recv缓存,否则多个待处理的recvs往往用途有限,在这种情况下,它们必不可少。请记住,如果您决定发布多个挂起的recv,那么您必须做一些工作以确保以正确的顺序处理它们。虽然recvs将按照发布它们的顺序从IOCP完成,但线程调度问题可能意味着它们由不同的I / O线程以不同的顺序处理,除非您积极努力确保不是这种情况,请参阅{{ 3}}了解详情。
多个待处理发送对于充分利用TCP连接的可用TCP窗口(并以尽可能最大的速率发送)更有用,但仅当您要发送大量数据时才会发送,仅当您要将其发送为尽可能高效,并且只有在您注意确保您没有太多待处理的写入时。如果您没有主动管理待处理的写入次数,请参阅here以了解可能遇到的问题的详细信息。
答案 1 :(得分:1)
对于少于10个连接和TCP,即使在高速率下,您也可能感觉不到任何差异。只需增加缓冲区大小,您就可以看到更好的性能。
如果您的应用程序繁琐且处理成本高昂,排队I / O将会有所帮助。基本上它可以让你预先执行昂贵的工作,这样当爆发进入时,你在I / O上使用了一点CPU,并尽可能多地处理它。