The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Улучшение производительности Solaris на многопроцессорных системах
Для улучшения производительности в многопроцессорных (в том числе
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
 
14.12.2009 , Автор: ikorolev , Источник: http://www.unixpin.com/wordpress/20...
Ключи: solaris, cpu, interrupt, optimization, tune, speed / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Solaris специфика

Обсуждение [ RSS ]
 
  • 1, pavlinux, 03:36, 18/12/2009 [ответить] [смотреть все]
  • +/
    Мы круче, у Нас есть ядро и echo !!!

    # mkdir /dev/cpuset
    # mount -t cgroup -o cpuset cpuset /dev/cpuset
    # cd /dev/cpuset
    # mkdir TEST
    # cd TEST
    # echo 1 > cpuset.cpu_exclusive
    # echo 0-1 > cpuset.cpus
    # echo 1 > cpuset.mems
    # echo 'pidof Xorg' > tasks

     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor