只有一个CPU核心处理网络中断

时间:2018-04-29 20:23:20

标签: streaming raspberry-pi3 docker-swarm ethernet interrupt-handling

我在golang中开发了一个视频流服务器,它通过常规TCP连接接收多个流,并通过HTTP广播它们。

这适用于我在docker swarm中运行的raspberryPi群集。服务器水平分布在所有树莓中。所有实例都接收所有流,当通过HTTP在许多客户端之间分发时,负载分配就会出现。

单个流非常繁重,使用的带宽约为16Mbit / s。

它非常好用,因为我几乎没有延迟地获得32fps。

我决定通过htop检查我的程序消耗了多少CPU和内存。当我以root用户身份运行时,我看到我的服务器使用了大约50%的CPU,我认为这是好的,因为它以32fps接收4个同步流。但后来我和pi用户一起运行htop并注意到另一个进程ksoftirqd消耗了另外50%的CPU(不知道为什么我在以root用户身份运行htop时看不到进程)。

我做了一些研究,并了解到这是一个特殊的小过程,可以处理延迟的系统中断(或类似的东西)。这种情况很有意义,因为我通过eth0接口接收了很多负载。

然后我调查了/proc/interrupts

       CPU0       CPU1       CPU2       CPU3
 16:          0          0          0          0  bcm2836-timer   0 Edge      arch_timer
 17:   92241367  299499641  352012196  317363321  bcm2836-timer   1 Edge      arch_timer
 23:     288978          0          0          0  ARMCTRL-level   1 Edge      3f00b880.mailbox
 24:   25146874          0          0          0  ARMCTRL-level   2 Edge      VCHIQ doorbell
 46:          0          0          0          0  ARMCTRL-level  48 Edge      bcm2708_fb dma
 48:          0          0          0          0  ARMCTRL-level  50 Edge      DMA IRQ
 50:          0          0          0          0  ARMCTRL-level  52 Edge      DMA IRQ
 51:     530982          0          0          0  ARMCTRL-level  53 Edge      DMA IRQ
 54:      13573          0          0          0  ARMCTRL-level  56 Edge      DMA IRQ
 55:          0          0          0          0  ARMCTRL-level  57 Edge      DMA IRQ
 56:          0          0          0          0  ARMCTRL-level  58 Edge      DMA IRQ
 59:       3354          0          0          0  ARMCTRL-level  61 Edge      bcm2835-auxirq
 62: 3696376760          0          0          0  ARMCTRL-level  64 Edge      dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1
 79:          0          0          0          0  ARMCTRL-level  81 Edge      3f200000.gpio:bank0
 80:          0          0          0          0  ARMCTRL-level  82 Edge      3f200000.gpio:bank1
 83:          0          0          0          0  ARMCTRL-level  85 Edge      3f804000.i2c
 84:          0          0          0          0  ARMCTRL-level  86 Edge      3f204000.spi
 86:     460008          0          0          0  ARMCTRL-level  88 Edge      mmc0
 87:       5270          0          0          0  ARMCTRL-level  89 Edge      uart-pl011
 92:    4975621          0          0          0  ARMCTRL-level  94 Edge      mmc1
220:       3352          0          0          0  bcm2835-auxirq   0 Edge      serial
FIQ:              usb_fiq
IPI0:          0          0          0          0  CPU wakeup interrupts
IPI1:          0          0          0          0  Timer broadcast interrupts
IPI2:   41355699  278691553  311249136  291769396  Rescheduling interrupts
IPI3:       7758       9176       8710       9334  Function call interrupts
IPI4:          0          0          0          0  CPU stop interrupts
IPI5:    1387927    1201820    2860486    1356720  IRQ work interrupts
IPI6:          0          0          0          0  completion interrupts
Err:          0

正如您所看到的,中断62是迄今为止被调用最多且仅由CPU0处理的中断。我怀疑这个中断是eth0中断(我怎么能确认这个?)。所以我认为我可以配置它,所以中断将由所有CPU处理。

所以我调查了/proc/irq/62/smp_affinity_list,其内容为0-3,这似乎是正确的,/proc/irq/62/smp_affinity文件内容为f,这似乎也是正确的。

所以我不明白为什么中断62只由CPU0处理。

另外我也不明白为什么我只能在htop中看到ksoftirqd,如果我将它作为pi而不是root运行(进程的所有者是root)。

如何配置raspberry以在所有CPU上处理该中断?

*编辑*

我只在一个属于集群的树莓上检查这个。在其他主机上检查这一点我看到了类似的结果(只是CPU使用率略低)。奇怪的是,在另一个覆盆子上没有ksoftirqd进程消耗掉那么多CPU。

0 个答案:

没有答案