我有两个 Digium Wildcard TDM800P,每个都有 8 个 FXO 端口。当我同时连接两者时,IRQ 未命中开始出现,使我的计算机无响应且无法使用。
一张卡可以正常工作,但我需要所有 16 个 FXO 端 Eloquent 能接收来 self 的电信公司的调用。有没有一种方法可以让卡片相互通信,这样它们就不会产生那么多的中断。或者调整 Linux 为每张卡指定单独的 IRQ 的方法。
我试过禁用音频、ACPI 和 USB 端口。仍然有太多 IRQ 未命中。
最佳答案
这个问题最好发到 serverfault,因为这是一个纯粹的硬件问题。
您遇到的问题通常是高中断 PCI 卡的典型问题,尤其是 Digium 电话卡。请记住,问题源于两个卡都在相同 PCI 总线上,您的目标是不让它们共享 IRQ 中断。
您可以尝试以下几种方法来解决您的问题:
1) 升级到 DAHDI 驱动程序。他们有更好的 IRQ 争用。
2) 将其中一张卡换到另一个 PCI 插槽。主板上的某些 PCI 插槽共享 channel 。你想避免这种情况。检查你的主板手册。另外,您可以执行以下操作
cat /proc/interrupts
你应该收到这样的输出
CPU0 CPU1 CPU2 CPU3
0: 37 2 5 8 IO-APIC-edge timer
1: 1 1 0 0 IO-APIC-edge i8042
8: 0 0 1 0 IO-APIC-edge rtc0
9: 0 0 0 0 IO-APIC-fasteoi acpi
12: 1 0 0 3 IO-APIC-edge i8042
14: 33 35 31 30 IO-APIC-edge ide0
20: 0 0 0 0 IO-APIC-fasteoi uhci_hcd:usb2
21: 37 37 41 38 IO-APIC-fasteoi uhci_hcd:usb1, uhci_hcd:usb3, ehci_hcd:usb4
1269: 14357 14387 14387 14372 PCI-MSI-edge eth0
1270: 2523 2490 2489 2503 PCI-MSI-edge ioc0
NMI: 0 0 0 0 Non-maskable interrupts
LOC: 487635 236288 376032 88504 Local timer interrupts
RES: 507 516 571 701 Rescheduling interrupts
CAL: 205 281 237 201 function call interrupts
TLB: 2835 2190 2221 1737 TLB shootdowns
TRM: 0 0 0 0 Thermal event interrupts
THR: 0 0 0 0 Threshold APIC interrupts
SPU: 0 0 0 0 Spurious interrupts
ERR: 0
看看中断 21 是如何被 usb1、usb3 和 usb4 共享的?您不希望这种情况发生在您的 Digium 卡上。顺便说一下,Digium 卡通常显示为 TDPXXX。
3) CPU 之间的负载平衡中断 - 如果您的 PC 有多个 CPU,并且您的内核和主板支持 IO-APIC,您可以在不同 CPU 之间负载平衡中断。这也将大大减轻 CPU 的中断负载。如果您查看我之前发布的代码,您会发现本地定时器中断在 CPU 之间均匀分布。如果您的 Digium 卡只对一个 CPU 造成冲击(这种情况会发生),您可以通过尝试以下操作来分散负载。假设我们想更改 IRQ 21(前面提到的 USB)
cat /proc/irq/21/smp_affinity
ffffffff
所有这些“f”告诉我们来自 IRQ 21 的中断负载在所有 CPU 之间是负载平衡的。如果你想分配给某个CPU,就把那个numer以十六进制的形式加在右边。例如,假设我希望 USB 仅中断 CPU0。
echo 1 > /proc/irq/21/smp_affinity
cat /proc/irq/21/smp_affinity
00000001
所以现在只有第一个CPU(CPU0)可以接收这些中断。
祝你好运!
关于linux - 连接两个数字卡和 Asterisk 盒时出现 IRQ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/628920/