Streaming 只有一个CPU核心处理网络中断
我在golang开发了一个视频流服务器,它通过常规TCP连接接收多个流,并通过HTTP进行广播 这是我在docker swarm中运行的raspberryPi集群。服务器水平分布在所有树莓中。所有实例都接收所有流,当通过HTTP在多个客户机之间进行分配时,会出现负载分配 单个流相当重,使用的带宽约为16Mbit/s 它工作得很好,因为我几乎毫不延迟地获得32fps 我决定通过htop检查我的程序消耗了多少CPU和内存。当我以root用户的身份运行它时,我看到我的服务器使用了大约50%的CPU,我认为这是可以的,因为它以32fps的速度同时接收4个流。但后来我和pi用户一起运行htop,发现另一个进程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,我
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是个好主意。