2017-05-19 1 views
1

Je cours un programme simple dans un client, il continue à envoyer le paquet d'udp à un serveur. L'interface du serveur est une netcard multi-file, mais j'ai mis son rx-flow-hash de udp4 à sd. Donc tout le paquet sera produit dans un CPU.L'utilisation de cpu de linux softirq semble étrange

Lorsque je reçois 40Wpackets/s, le processeur de ce serveur coute 1% dans softirq. Lorsque je reçois 60Wpackets/s, le processeur de ce serveur coûte 8% dans softirq. Lorsque je reçois 90Wpackets/s, le serveur de ce processeur est 100% dans softirq.

Le numéro reçu est obtenu via l'exécution sar -n UDP 1 pendant un moment. Le coût du processeur est obtenu via mpstat -P ALL 1 pendant un moment.

Donc, je suis confus à ce sujet.

Pourquoi ce n'est pas linéaire?

Répondre

0

L'interruption logicielle est exécutée après une interruption matérielle qui prend en charge une partie du code qui n'a pas besoin d'être traitée immédiatement. Par conséquent, l'interruption logicielle peut être interrompue par une interruption matérielle. Après l'exécution d'une interruption générale générale, une interruption logicielle est exécutée (interrompant la moitié inférieure). Mais si cette fois il y a une interruption dure, l'interruption douce sera préemptée. De cette façon, lorsque la file d'attente d'interruptions logicielles après plus de 10, va réveiller ksoftirqd thread pour faire face à l'interruption logicielle. Ksoftirqd thread occupé par le CPU est décrit dans le problème de% soft.

Donc, le paquet est moins de temps, ksoftirq a été réveillé moins, doux% très faible. Une grande partie de l'interruption logicielle dans le processus inactif a été interrompue par une interruption dure, la consommation du processeur est enregistrée dans le% d'inactivité à l'intérieur.

Lorsque la charge est élevée, l'interruption logicielle est interrompue par une interruption matérielle, de sorte que ksoftirqd est en cours d'exécution, de sorte que le pourcentage faible augmente soudainement considérablement.