我在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。