Le 28/11/2012 14:16, Aurélien a écrit :
Allez, câdo, drop in /etc/network/if-up.d et chmod +x, et ifdown/ifup une des cartes. Y'a sûrement mieux à faire, mais ça marche bien pour moi. Le mieux que j'ai trouvé c'est 3 cartes réseaux intel 8 files en LAG LACP pour 24 coeurs sur mon matériel. La regex est sûrement à tuner.
#!/bin/bash
# This script balances the interrupts statically.
# It only touches the interrupts specified by this regular expressions (grepped in /proc/interrupts) # Only active interrupts will be grepped, so please re-run the script on post-up.
NETWORK_INTERRUPTS=' (gbe|bnx|eth|igb)[0-9]+(-TxRx)?-[0-7]$'
# Balance the interrupts on all the cores, in round-robin fashion. total_cores=$(cat /proc/cpuinfo | grep '^processor' | wc -l) interrupts=$(cat /proc/interrupts | egrep "${NETWORK_INTERRUPTS}" | awk -F: "{ print $1 }" | tr '\n' ' ')
let current_core=0; for irq in ${interrupts}; do affinity="$(printf "%08x" $((1 << ($current_core % $total_cores))))" # echo "IRQ #${irq} will have affinity to ${affinity}" echo "${affinity}" > "/proc/irq/${irq}/smp_affinity" let current_core=$(($current_core+1)) done
Petit retour sur le script, déjà merci, j'avais déjà vu passer des infos à ce sujet mais je ne m'étais pas encore penché sur cette optimisation.
Pour ma part sur une Debian avec kernel 3.4.19 la regexp ne marche pas. Voilà ce que j'ai dans le interrupts pour eth0 par exemple
CPU0 CPU1 307: 116542899 0 xen-pirq-msi-x eth0-rx-0 308: 98413431 0 xen-pirq-msi-x eth0-rx-1 309: 160018027 0 xen-pirq-msi-x eth0-tx-0 310: 88439060 0 xen-pirq-msi-x eth0-tx-1
J'ai modifié la regexp comme cela (gbe|bnx|eth|igb)[0-9]+-(tx|rx)-[0-7]$
Par contre avant d'appliquer la modification j'ai trouvé une valeur à 3 dans le /proc/irq/(307-310)/smp_affinity
La machine est un xeon 4 core 8 en HT qui héberge du xen où j'ai spécialement réservé 2 core pour l'hyperviseur. Du coup la valeur 3 m'interpelle un peu sachant que cela devrait être 1 ou 2 comme le confirme d'ailleurs /proc/irq/307/smp_affinity_list 1-2
Par contre une fois les modifications appliquées j'ai /proc/irq/(307-310)/smp_affinity_list à 0 ou 1 /proc/irq/(307-310)/smp_affinity à 1 ou 2
Depuis que j'ai fait la modification j'ai bien le cpu1 qui bosse pour les irq donnés 307: 116646799 0 xen-pirq-msi-x eth0-rx-0 308: 98452617 46945 xen-pirq-msi-x eth0-rx-1 309: 160194164 0 xen-pirq-msi-x eth0-tx-0 310: 88450878 16109 xen-pirq-msi-x eth0-tx-1