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

Streaming 只有一个CPU核心处理网络中断,streaming,raspberry-pi3,docker-swarm,ethernet,interrupt-handling,Streaming,Raspberry Pi3,Docker Swarm,Ethernet,Interrupt Handling,我在golang开发了一个视频流服务器,它通过常规TCP连接接收多个流,并通过HTTP进行广播 这是我在docker swarm中运行的raspberryPi集群。服务器水平分布在所有树莓中。所有实例都接收所有流,当通过HTTP在多个客户机之间进行分配时,会出现负载分配 单个流相当重,使用的带宽约为16Mbit/s 它工作得很好,因为我几乎毫不延迟地获得32fps 我决定通过htop检查我的程序消耗了多少CPU和内存。当我以root用户的身份运行它时,我看到我的服务器使用了大约50%的CPU,我

我在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\u affinity\u list
,它的内容是
0-3
,这似乎是正确的,
/proc/irq/62/smp\u affinity
文件内容是
f
,这似乎也是正确的

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

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

如何配置raspberry来处理所有CPU上的中断

*编辑*


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

Hi Esser420!!我在另一个视频流服务中看到了完全相同的行为。你设法解决了吗?项目已经发展,我现在使用h264作为视频格式,而不是MJPEG,此后问题就不再存在了。这可能是因为带宽使用率要低得多。不过,我仍然认为raspberrypi处理这些中断的方式有问题。我在这里找到了解决方法,因为我们在hyper-v环境中运行centos 7的swarm上看到了这一点。我们将一项较旧的服务对接。当我们尝试提供42个容器(即21个服务和2个副本)时,swarm遇到了很大的问题。它甚至努力维持领导地位。我们追踪到了ksoftirqd,但还没有进一步的进展。希望投票结果会让人发现更深层次的问题。所以你说这也发生在非覆盆子硬件上,但在docker swarm上。也许问题就在那里。我只是避免运行kubernetes,因为这是在raspberry上运行的另一个进程,内存有限。也许在更好的硬件上,切换到kubernetes是个好主意。