linux - 连接两个数字卡和 Asterisk 盒时出现 IRQ 问题

标签 linux debian interrupt asterisk irq

我有两个 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/

相关文章:

linux - 手动产生定时器中断

linux - 从内核中断读取设备

arduino - 使用attachInterrupt时没有匹配函数错误

linux - 从不同环境中检索数据时的不同结果

php - 如何处理上传和下载 PHP 生成的 CSV 文件

linux - 使用过滤器创建具有进程名称的文件

linux - Bash 脚本 : Syntax error in conditional expression

linux - 从一个参数和仅一个参数获取输入

ubuntu - 在 Ubuntu 12.04 LTS 上创建 debian 包

ubuntu - 如何在旧的 ubuntu 版本上安装仅在较新的 ubuntu 版本上可用的更高版本的软件包?我以erlang为例