Для улучшения производительности в многопроцессорных (в том числе
Multithreading) системах с ОС Solaris можно использовать выделенные процессоры
для обработки прерываний устройств ввода-вывода. Это позволяем снизить
количество переключений контекста для процессоров, увеличить попадания в кэш, в
конечном счете отдать больше ресурсов для обработки пользовательских задач.
Solaris 10:
Для того, чтобы привязать процессор к обработке прерываний устройства:
1. Определяем процессор, на который попадает большинство системных прерываний
по данному адаптеру (например по сетевому адаптеру nxge):
# intrstat 2 1|egrep 'device|nxge'
..
device | cpu92 %tim cpu93 %tim cpu94 %tim cpu95 %tim
nxge#0 | 0 0.0 0 0.0 0 0.0 0 0.0
device | cpu96 %tim cpu97 %tim cpu98 %tim cpu99 %tim
nxge#0 | 20816 67.4 13877 33.6 0 0.0 0 0.0
device | cpu100 %tim cpu101 %tim cpu102 %tim cpu103 %tim
nxge#0 | 0 0.0 0 0.0 0 0.0 0 0.0
...
В нашем случае - это процессоры 96 и 97.
2. Проверяем количество переключений контекста для этих процессоров (колонка
csw в выводе команды mpstat):
# mpstat 1 3 |egrep 'CPU|^ 96|^ 97'
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
96 0 0 3385 4021 3970 84 0 9 53 0 466 3 13 0 83
97 0 0 1028 1295 1207 131 2 14 29 0 691 9 5 0 87
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
96 0 0 3032 3552 3510 71 0 7 45 0 429 4 12 0 84
97 0 0 981 1201 1131 116 1 23 27 0 429 2 4 0 94
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
96 0 0 3049 3598 3547 78 0 9 34 0 645 12 12 0 77
97 0 0 980 1226 1139 160 1 5 29 0 245 3 5 0 92
3. Создаем процессорный set с процессорами 96 и 97
# psrset -c 96 97
created processor set 1
processor 96: was not assigned, now 1
processor 97: was not assigned, now 1
4. Проверяем переключений контекста:
# mpstat -P 1 1 3
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
96 1 0 2195 2462 2434 41 1 4 66 0 325 6 8 0 86
97 1 0 775 769 725 63 1 8 58 0 354 7 3 0 91
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
96 0 0 3103 3634 3634 0 0 0 34 0 0 0 11 0 89
97 0 0 1032 1193 1192 0 0 0 16 0 0 0 3 0 97
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
96 0 0 2941 3426 3425 0 0 0 44 0 0 0 12 0 88
97 0 0 997 1172 1170 0 0 0 18 0 0 0 3 0 97
Solaris 9:
Т.к. утилиты intrstat в Solaris 9 нет, то ориентироваться можно только на вывод
команды mpstat (колонка intr). Выбираем процессор или несколько процессоров с
наибольшим количеством прерываний и переносим их в сэт.
Если процессоров не так много, или сервер состоит из системных плат,
объединенных через общую шину (типа sf4800, sf6900, e25k итд) - то можно пойти
другим путем - привязать процессы к процессорному сэту и запретить прерывания
для этого сэта. Тем самым повышаем попадания в кэш, уменьшится трафик между
системными платами, можно выделить как бы гарантированный квант процессорных
ресурсов приложению.
Итак, пусть у нас средняя железка, 24 процессора.
Создадим процессорный сэт из процессоров 0-7
# psrset -c 0-7
created processor set 1
processor 0: was not assigned, now 1
processor 1: was not assigned, now 1
processor 2: was not assigned, now 1
..
Проверяем:
# mpstat 2 5
...
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
...
21 308 0 17969 1410 1132 955 304 391 380 0 1340 67 29 3 1
22 364 0 18396 469 1 1541 472 583 612 0 2056 80 10 10 0
23 301 0 11905 375 1 1121 376 464 342 0 2969 86 8 5 0
0 0 0 221 499 396 0 0 0 14 0 0 0 1 0 99
1 0 0 1 5 1 0 0 0 0 0 0 0 0 0 100
2 0 0 1 5 1 0 0 0 0 0 0 0 0 0 100
...
Ищем процесс, который мы собираемся отдать в процессорный сэт:
# ps -ef | grep lsnr
oracle 1811 1 0 Apr 12 ? 74:55 /oracle/dbase10g/bin/tnslsnr listener -inherit
Привязываем процесс (и подпроцессы, которые он порождает в сэт)
# psrset -b 1811
Запрещаем прерывания на этот сэт
# psrset -f 1
Проверяем:
# mpstat 2 5
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
...
22 470 0 10802 557 218 708 342 282 109 0 1982 89 9 2 0
23 132 0 12200 1501 1260 610 262 264 166 0 1120 86 12 2 0
0 0 0 1 6 1 0 0 0 0 0 0 0 0 0 100
1 0 0 1 6 1 0 0 0 0 0 0 0 0 0 100
2 0 0 1 6 1 0 0 0 0 0 0 0 0 0 100
Убеждаемся, что прерывания на процессорах из сэта заметно уменьшились (столбец intr).
Ну и в любой момент процессорный сэт можно удалить:
# psrset -d 1
|