Programaticamente determinar os IRQs associados a uma interface de rede

5

Qual é a maneira mais confiável de determinar programaticamente os IRQs associados a uma interface de rede, considerando o nome da interface (por exemplo, eth0)?

Estou bem com uma abordagem de melhor esforço, mas gostaria que funcionasse em uma ampla variedade de drivers / configurações (ou seja, sem tratamento especial para cada driver) e gostaria de evitar falsos positivos. Eu também gostaria de evitar violar as regras para interagir com sysfs delineadas aqui , mas eu m bem em quebrá-las, se necessário. Eu vou quebrá-los nos exemplos abaixo.

A análise de /proc/interrupts não é ideal porque os nomes associados aos IRQs são específicos do driver e não são confiáveis porque não há nada que impeça que dois dispositivos tenham IRQs com o mesmo nome.

Seria bom se eu pudesse fazer algo como o seguinte:

$ ls /sys/class/net/eth2/device/msi_irqs | cat /sys/class/net/eth2/device/irq
61  62  63

Eu verifiquei que estes são os IRQs que estou procurando neste caso usando /proc/interrupts .

Mas isso não funciona para todos os motoristas. Os arquivos de interesse do IRQ estão em lugares diferentes, ou em nenhum lugar para ser encontrado.

interface vmxnet3:

$ readlink -e /sys/class/net/eth2
/sys/devices/pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth2

$ ls $(readlink -e /sys/class/net/eth2)/../../msi_irqs
61  62  63

Os msi_irqs de interesse são dois diretórios acima do link simbólico / sys / class / net / eth2. Os três diretórios msi_irqs não são relevantes para mim.

interface do virtio:

$ readlink -e /sys/class/net/eth1
/sys/devices/pci0000:00/0000:00:03.0/virtio0/net/eth1

ls $(readlink -e /sys/class/net/eth1)/../../../msi_irqs
26  27  28

Os msi_irqs de interesse são três diretórios acima do link simbólico / sys / class / net / eth1. Não há outros arquivos msi_irqs nesta hierarquia.

interface hv_netvsc:

$ readlink -e /sys/class/net/eth0
/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:07/VMBus:00/vmbus_0_11/net/eth0

As informações de IRQ não parecem estar no sysfs. Eu tenho que recorrer a grepping / proc / interrupts para o único IRQ "hyperv".

O método que usei está pesquisando no diretório em $(readlink -e /sys/class/net/eth0) até, mas não incluindo /sys/devices/pci<domain>:<bus>/ para o arquivo msi_irqs ou irq . Minha preocupação é que eu poderia obter os IRQs errados ao fazer isso. Talvez haja algum motivo para os IRQs associados à interface não serem publicados em msi_irqs ou irq , mas os IRQs de um dispositivo ancestral serão publicados. Vou acabar com os IRQs do dispositivo ancestral, que podem não ser o que eu quero.

Existe uma maneira melhor de determinar com segurança os IRQs associados a uma interface de rede? Caso contrário, o método descrito acima pode retornar IRQs não associados à interface?

    
por tgnottingham 08.04.2016 / 08:48

1 resposta

4

Você já tentou dstat ?

no caso da minha interface Ethernet enp025, por exemplo:

dstat -i -N enp0s25 ----interrupts--- 33 34 35

5     0     0 
6     0     0 
8     0    26 
9     0     0 
7     0     0 
10     0     0 

para fazer mais coisas, leia a man page:

DSTAT (1) DSTAT (1)

NAME        dstat - ferramenta versátil para gerar estatísticas de recursos do sistema

SINOPSE        dstat [-afv] [opções ..] [atraso [contagem]]

DESCRIÇÃO        O Dstat é um substituto versátil para o vmstat, iostat e ifstat. O Dstat supera algumas das limitações e adiciona alguns recursos extras.

   Dstat allows you to view all of your system resources instantly, you can eg. compare disk usage in combination with interrupts from
   your IDE controller, or compare the network bandwidth numbers directly with the disk throughput (in the same interval).

   Dstat also cleverly gives you the most detailed information in columns and clearly indicates in what magnitude and unit the output is
   displayed. Less confusion, less mistakes, more efficient.

   Dstat is unique in letting you aggregate block device throughput for a certain diskset or network bandwidth for a group of interfaces,
   ie. you can see the throughput for all the block devices that make up a single filesystem or storage system.

   Dstat allows its data to be directly written to a CSV file to be imported and used by OpenOffice, Gnumeric or Excel to create graphs.


   Note
   Users of Sleuthkit might find Sleuthkit’s dstat being renamed to datastat to avoid a name conflict. See Debian bug #283709 for more
   information.

OPÇÕES          -c, --cpu               habilitar estatísticas de cpu (sistema, usuário, ocioso, espera, interrupção de hardware, interrupção de software)

   -C 0,3,total
          include cpu0, cpu3 and total (when using -c/--cpu)

   -d, --disk
          enable disk stats (read, write)

   -D total,hda
          include total and hda (when using -d/--disk)

   -g, --page
          enable page stats (page in, page out)

   -i, --int
          enable interrupt stats

   -I 5,10
          include interrupt 5 and 10 (when using -i/--int)

   -l, --load
          enable load average stats (1 min, 5 mins, 15mins)

   -m, --mem
          enable memory stats (used, buffers, cache, free)

   -n, --net
          enable network stats (receive, send)
   -N eth1,total
          include eth1 and total (when using -n/--net)

   -p, --proc
          enable process stats (runnable, uninterruptible, new)

   -r, --io
          enable I/O request stats (read, write requests)

   -s, --swap
          enable swap stats (used, free)

   -S swap1,total
          include swap1 and total (when using -s/--swap)

   -t, --time
          enable time/date output

   -T, --epoch
          enable time counter (seconds since epoch)

   -y, --sys
          enable system stats (interrupts, context switches)

   --aio  enable aio stats (asynchronous I/O)

   --fs, --filesystem
          enable filesystem stats (open files, inodes)

   --ipc  enable ipc stats (message queue, semaphores, shared memory)

'

e muitas outras opções.

veja também: lspci -v -x

    
por 08.04.2016 / 11:08