Odpowiedzi:
Komputer komunikuje się z podłączonymi do niego urządzeniami za pośrednictwem przerwań (żądania przerwania). Gdy urządzenie przychodzi z przerwaniem, system operacyjny wstrzymuje jego działanie i zaczyna reagować na to przerwanie.
W niektórych sytuacjach przerwania IRQ przychodzą bardzo szybko jeden po drugim, a system operacyjny nie może zakończyć obsługi jeden przed drugim. Może się to zdarzyć, gdy szybka karta sieciowa odbierze bardzo dużą liczbę pakietów w krótkim czasie.
Ponieważ system operacyjny nie może obsłużyć przerwań IRQ podczas ich nadejścia (ponieważ przychodzą zbyt szybko jeden po drugim), system operacyjny kolejkuje je do późniejszego przetworzenia przez specjalny proces wewnętrzny o nazwie ksoftirqd
.
Jeśli ksoftirqd
zajmuje więcej niż niewielki procent czasu procesora, oznacza to, że maszyna jest obciążona dużym przerwaniem.
Ze strony podręcznika ksoftirqd
jest wątek jądra na procesor, który działa, gdy maszyna jest obciążona dużym miękkim przerwaniem.
Możesz nieco poprawić ustawienia, określając, które procesor odbiera określone przerwanie. Robisz to, zmieniając zawartość /proc/irq/$interrupt_number/smp_affinity
. Możesz uzyskać listę przerwań i ich znaczenie, wykonując:
cat /proc/interrupts
Liczba w smp_affinity
to bitmapa cpus, reprezentowana w kodzie szesnastkowym. Najbardziej prawy bit jest najmniej znaczący. Na przykład mój system ma 8 rdzeni. Gdybym chciał używać tylko rdzeni 1, 3 i 4, ustawiłbym smp_affinity na 1a
:
cpu_7 cpu_6 cpu_5 cpu_4 cpu_3 cpu_2 cpu_1 cpu_0
0 0 0 1 1 0 1 0 = 0001 1010 = 1a (in hex)
Osobiście skonfigurowałem dowolną jednostkę centralną, aby móc odbierać przerwanie 29 (eth0 w moim 8-rdzeniowym systemie) za pomocą:
sudo echo ff > /proc/irq/29/smp_affinity
ksoftirqd to wątek jądra na procesor, który działa, gdy maszyna jest obciążona dużym, miękkim przerwaniem, więc nie zjada procesora, ale raczej zmniejsza obciążenie IRQ.