第371页<附录A tcpdump程序>底部:
除了指明一个过滤器,BPF的每个用户还指明了一个超时定时器的值。因为网络的数据传输率可以很容易地超过cpu的处理能力,而且一个用户进程从内核中只读小块数据的代价昂贵,因此,BPF试图将多个帧装载进一个读缓存,只有缓存满了或者用户指明的超时到期才将读缓存保存的帧返回。...问题1:网络的数据传输率可以很容易地超过cpu的处理能力,那么是否也可以很容易地超过网卡的处理能力?也就是说当以太网数据链路上有许多份数据同时发送时,是否存在网卡只能读取一份数据,而不能读取其它的数据。问题2:为什么用户进程从内核中只读小块数据的代价昂贵?
除了指明一个过滤器,BPF的每个用户还指明了一个超时定时器的值。因为网络的数据传输率可以很容易地超过cpu的处理能力,而且一个用户进程从内核中只读小块数据的代价昂贵,因此,BPF试图将多个帧装载进一个读缓存,只有缓存满了或者用户指明的超时到期才将读缓存保存的帧返回。...问题1:网络的数据传输率可以很容易地超过cpu的处理能力,那么是否也可以很容易地超过网卡的处理能力?也就是说当以太网数据链路上有许多份数据同时发送时,是否存在网卡只能读取一份数据,而不能读取其它的数据。问题2:为什么用户进程从内核中只读小块数据的代价昂贵?
考虑到网络的模型,经常会发送阻塞及抖动的情况,既,某个时候,会有大量的数据到达,以至于网卡不能处理所有的数据问题2:为什么用户进程从内核中只读小块数据的代价昂贵?
线程切换花费大量的cpu
如果网卡好,比如高端服务器网卡,自己就可以处理很多东西,不怎么占cpu,如果滥网卡,要占很多cpu
除了指明一个过滤器,BPF的每个用户还指明了一个超时定时器的值。因为网络的数据传输率可以很容易地超过cpu的处理能力,而且一个用户进程从内核中只读小块数据的代价昂贵,因此,BPF试图将多个帧装载进一个读缓存,只有缓存满了或者用户指明的超时到期才将读缓存保存的帧返回。... 问题1:
没有所谓超过网卡的处理能力的说法,100M的网络就接100M的网卡,永远不会超过网卡的能力。
不存在以太网数据链路上有许多份数据同时的情况。以太网也类似于总线,同时只有一份数据传输。问题2:
因为通过系统调用从用户空间切换到系统空间是需要消耗很多CPU时间的,每次为读取小数据块就切换一次,代价太高。
结合上面两个问题,就知道处理大量小数据报文容易超过CPU的处理能力了