当前位置: 技术问答>linux和unix
socket接收数据流程问题请教
来源: 互联网 发布时间:2016-04-25
本文导语: 使用ftpget下载文件这个过程应该是用socket实现的吧 我做了下面的两个测试比较: 1.使用2个网口收发包,这时使用1核0vcpu和2核0vcpu使用Round-Robin方式处理网络收发,启动32个ftpget的任务,并把这些下载任务绑定到3核和4...
使用ftpget下载文件这个过程应该是用socket实现的吧
我做了下面的两个测试比较:
1.使用2个网口收发包,这时使用1核0vcpu和2核0vcpu使用Round-Robin方式处理网络收发,启动32个ftpget的任务,并把这些下载任务绑定到3核和4核的8个vcpu上,此时绑定ftp下载任务的各个vcpu的CPU占用为55%
2.使用2个网口收发包,这时使用1核0vcpu和2核0vcpu分别负责网口0和网口1的网络收发,也同样启动32个ftpget的任务,并把这些下载任务绑定到3核和4核的8个vcpu上,此时绑定ftp下载任务的各个vcpu的CPU占用为42%
想了一下,Round-Robin方式向socket的缓冲区入队列的时候会产生互斥,这样会额外消耗一些CPU资源,而分别管理网口的情况下应该不存在这种互斥的情况,所以CPU资源应该消耗的少一些。
不过我觉得,上面说的这种CPU的消耗差异,应该体现在用于处理网络收发的1核和2核上(我觉得应该是网口收到包,然后在收包的核上进入协议栈的处理过程,最后放到socket缓冲区去),而绑定ftpget任务的核只是从socket缓冲区取数据,完成从内核态到用户态的拷贝,这在我测试的两种情况下应该处理是一样的,但为什么现在实际看到的结果确是绑定ftpget人任务的cpu存在差异了?想不通,请各位指点一下。
难道网口收上来包以后,协议栈的处理是在绑定了ftpget任务的那个核完成的?请各位帮忙解惑!谢谢!
我做了下面的两个测试比较:
1.使用2个网口收发包,这时使用1核0vcpu和2核0vcpu使用Round-Robin方式处理网络收发,启动32个ftpget的任务,并把这些下载任务绑定到3核和4核的8个vcpu上,此时绑定ftp下载任务的各个vcpu的CPU占用为55%
2.使用2个网口收发包,这时使用1核0vcpu和2核0vcpu分别负责网口0和网口1的网络收发,也同样启动32个ftpget的任务,并把这些下载任务绑定到3核和4核的8个vcpu上,此时绑定ftp下载任务的各个vcpu的CPU占用为42%
想了一下,Round-Robin方式向socket的缓冲区入队列的时候会产生互斥,这样会额外消耗一些CPU资源,而分别管理网口的情况下应该不存在这种互斥的情况,所以CPU资源应该消耗的少一些。
不过我觉得,上面说的这种CPU的消耗差异,应该体现在用于处理网络收发的1核和2核上(我觉得应该是网口收到包,然后在收包的核上进入协议栈的处理过程,最后放到socket缓冲区去),而绑定ftpget任务的核只是从socket缓冲区取数据,完成从内核态到用户态的拷贝,这在我测试的两种情况下应该处理是一样的,但为什么现在实际看到的结果确是绑定ftpget人任务的cpu存在差异了?想不通,请各位指点一下。
难道网口收上来包以后,协议栈的处理是在绑定了ftpget任务的那个核完成的?请各位帮忙解惑!谢谢!
|
看你所谓绑定是怎么绑定的,如果只是指派CPU的中断处理的话,那么中断处理之后就跟你原来指派的调度无关了,也就是说,协议层的处理可以在任意cpu。