Bindthreads
2012-02-24 18:50![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Выяснилось, что при использовании многоядерных маршрутизаторов под FreeBSD 8 и новее и при использовании loader tunnable net.isr.bindthreads=0
потоки NETISR в некоторых случаях таки могут оказаться привязанными к определенным ядрам CPU из-за ошибки в ядре.
Проверить привязку можно командой:
procstat -at | awk '/swi1: netisr/ {print $5, $6; system("cpuset -g -t " $2);}'
Она должна вывести что-то вроде этого:
netisr 0 tid 100012 mask: 0, 1, 2, 3 netisr 3 tid 100111 mask: 0, 1, 2, 3 netisr 2 tid 100112 mask: 0, 1, 2, 3 netisr 1 tid 100113 mask: 0, 1, 2, 3
То есть, в каждой маске должны быть перечислены все процессорные ядра. В некоторых случаях они там будут не все и тогда будут проблемы с неравномерной загрузкой ядер работой. Исправить проблему с NETISR без перезагрузки можно командой:
procstat -at | awk '/swi1: netisr/ {print $2}' | xargs -n 1 cpuset -l all -t
Тут есть патч к ядру, исправляющий работу net.isr.bindthreads=0
. В CURRENT также было внесено исправление для общей проблемы, оно тоже ложится на FreeBSD 8.