Европейский Университет в Санкт-Петербурге
Опубликован: 19.10.2005 | Доступ: свободный | Студентов: 1764 / 169 | Оценка: 4.31 / 3.82 | Длительность: 18:28:00
Лекция 1:

Оптимизация работы процессов

Лекция 1: 1234 || Лекция 2 >

Приоритеты процессов, настройка таблиц диспетчера

Настройка таблиц диспетчера памяти (о них речь шла в лекции 7) производится в три этапа:

  • вывод существующей таблицы в текстовый файл;
  • редактирование этого файла;
  • загрузка новой таблицы диспетчера в ядро.

Работа по выводу и загрузке таблиц осуществляется с помощью программы dispadmin.

Попробуем модифицировать таблицу диспетчера для класса разделения времени так, чтобы ни один процесс не получил приоритета 59 и ни один процесс не лишился этого приоритета, если мы его присвоим. Это может быть полезно в тех случаях, когда какие-то задачи надлежит вручную запускать с повышенным приоритетом. Конечно, это привнесет несправедливость в таблицу приоритетов нашей системы, и слепо следовать нашему тестовому примеру не стоит.

Посмотрим, как сейчас себя ведут наши процессы:

top
last pid: 825; load averages: 0.05, 0.11, 0.12 20:35:24
68 processes: 67 sleeping, 1 on cpu
CPU states: 99.8% idle, 0.2% user, 0.0% kernel, 0.0% iowait, 0.0% swap
Memory: 128M real, 12M free, 206M swap in use, 387M swap free
PID    USERNAME    LWP  PRI    NICE    SIZE    RES      STATE    TIME    CPU      COMMAND
825    root        1    59     0       2260K   1340K    cpu      0:00    0.61%    top
345    root        1    59     0       57M     8648K    sleep    1:37    0.35%    Xsun
470    root        4    49     0       141M    55M      sleep    2:11    0.28%    soffice.bin
622    root        1    59     0       15M     2928K    sleep    0:02    0.03%    dtterm
461    root        1    49     0       15M     1864K    sleep    0:03    0.00%    dtterm
654    root        15   19     10      79M     10M      sleep    0:08    0.00%    java
434    root        5    59     0       22M     4060K    sleep    0:04    0.00%    dtwm
652    root        1    49     0       24M     3784K    sleep    0:01    0.00%    sdtimage
435    root        1    49     0       16M     1216K    sleep    0:00    0.00%    dtfile
672    root        1    49     0       4728K   740K     sleep    0:00    0.00%    bash
427    root        1    49     0       18M     0K       sleep    0:00    0.00%    dtsession
467    root        1    49     0       4728K   0K       sleep    0:00    0.00%    bash
650    root        1    49     0       3460K   0K       sleep    0:00    0.00%    more
649    root        1    49     0       3356K   0K       sleep    0:00    0.00%    sh
634    root        1    49     0       3304K   0K       sleep    0:00    0.00%    man
Пример 11.2. Таблица приоритетов

Теперь пусть приоритет 59 может получить только та программа, которой мы это разрешим, а все остальные по умолчанию не могут.

Для этого предварительно модифицируем таблицу диспетчера так, чтобы ни один процесс не получил приоритета 59. Вначале выведем текущую таблицу приоритетов:

dispadmin -c TS -g > prior

Файл prior выглядит так:

# Time Sharing Dispatcher Configuration
RES=1000
#   ts_quantum  ts_tqexp  ts_slpret  ts_maxwait  ts_lwait  PRIORITY LEVEL
    200         0         50         0           50        #        0
    200         0         50         0           50        #        1
    200         0         50         0           50        #        2
    200         0         50         0           50        #        3
    200         0         50         0           50        #        4
    200         0         50         0           50        #        5
    200         0         50         0           50        #        6
    200         0         50         0           50        #        7
    200         0         50         0           50        #        8
    200         0         50         0           50        #        9
    160         0         51         0           51        #        10
    160         1         51         0           51        #        11
    160         2         51         0           51        #        12
    160         3         51         0           51        #        13
    160                   51         0           51        #        14
    160         5         51         0           51        #        15
    160         6         51         0           51        #        16
    160         7         51         0           51        #        17
    160         8         51         0           51        #        18
    160         9         51         0           51        #        19
    120         10        52         0           52        #        20
    120         11        52         0           52        #        21
    120         12        52         0           52        #        22
    120         13        52         0           52        #        23
    120         14        52         0           52        #        24
    120         15        52         0           52        #        25
    120         116       52         0           52        #        26
    120         117       52         0           52        #        27
    120         118       52         0           52        #        28
    120         19        52         0           52        #        29
    80          20        53         0           53        #        30
    80          21        53         0           53        #        31
    80          22        53         0           53        #        32
    80          23        53         0           53        #        33
    80          24        53         0           53        #        34
    80          25        54         0           54        #        35
    80          26        54         0           54        #        36
    80          27        54         0           54        #        37
    80          28        54         0           54        #        38
    80          29        54         0           54        #        39
    40          30        55         0           55        #        40
    40          31        55         0           55        #        41
    40          32        55         0           55        #        42
    40          33        55         0           55        #        43
    40          34        55         0           55        #        44
    40          35        56         0           56        #        45
    40          36        57         0           57        #        46
    40          37        58         0           58        #        47
    40          38        58         0           58        #        48
    40          39        58         0           59        #        49
    40          40        58         0           59        #        50
    40          41        58         0           59        #        51
    40          42        58         0           59        #        52
    40          43        58         0           59        #        53
    40          44        58         0           59        #        54
    40          45        58         0           59        #        55
    40          46        58         0           59        #        56
    40          47        58         0           59        #        57
    40          48        58         0           59        #        58
    20          49        59         32000       59        #        59
Пример 11.3. Файл prior

Теперь мы его изменяем так, как нам надо, и он становится иным (показаны только измененные последние две строки):

# ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait PRIORITY LEVEL
  40         48       58        32000      58       #        58
  20         59       59        0          59       #        59

Загружаем этот файл, запустив

dispadmin -c TS -s prior

Смотрим вывод top:

last pid:  836; load averages: 0.14, 0.14, 0.13  20:43:48
68 processes: 66 sleeping, 1 running, 1 on cpu
CPU states: 94.8% idle, 5.0% user, 0.2% kernel, 0.0% iowait, 0.0% swap
Memory: 128M real, 10M free, 204M swap in use, 389M swap free
PID    USERNAME    LWP    PRI    NICE    SIZE    RES    STATE    TIME    CPU      COMMAND
470    root        4      49     0       141M    57M    sleep    2:34    7.64%    soffice.bin
345    root        1      59     0       56M     7228K  sleep    1:46    0.86%    Xsun
836    root        1      59     0       2260K   1336K  cpu      0:00    0.77%    top
622    root        1      59     0       15M     2972K  sleep    0:02    0.03%    dtterm
672    root        1      48     0       4728K   1176K  sleep    0:00    0.03%    bash
654    root        15     49     0       79M     11M    run      0:08    0.02%    java
461    root        1      49     0       15M     1924K  sleep    0:03    0.02%    dtterm
434    root        5      59     0       22M     4084K  sleep    0:04    0.00%    dtwm
652    root        1      49     0       24M     3784K  sleep    0:01    0.00%    sdtimage
435    root        1      49     0       16M     1216K  sleep    0:00    0.00%    dtfile
427    root        1      49     0       18M     0K     sleep    0:00    0.00%    dtsession
467    root        1      49     0       4728K   0K     sleep    0:00    0.00%    bash
650    root        1      49     0       3460K   0K     sleep    0:00    0.00%    more
649    root        1      49     0       3356K   0K     sleep    0:00    0.00%    sh
634    root        1      49     0       3304K   0K     sleep    0:00    0.00%    man
Пример 11.4. Вывод команды top

Те процессы, которые по-прежнему имеют приоритет 59, можно перезапустить. Выявим их по команде

ps -ecL | grep 59

остановим и перезапустим. Кроме того, можно регулировать приоритет процесса напрямую с помощью команды priocntl, как показано ниже. Понизим на 20 единиц приоритет всех процессов в классе разделения времени:

priocntl -s -c TS -p -20

Снова запускаем top:

last pid:  987; load averages: 0.00, 0.03, 0.07 21:00:41
66 processes: 65 sleeping, 1 on cpu
CPU states: 99.4% idle, 0.0% user, 0.6% kernel, 0.0% iowait, 0.0% swap
Memory: 128M real, 6188K free, 202M swap in use, 391M swap free
PID    USERNAME    LWP    PRI    NICE    SIZE    RES    STATE    TIME    CPU      COMMAND
984    root        1      58     0       2260K   1336K  cpu      0:00    0.11%    top
345    root        1      58     0       56M     7184K  sleep    1:52    0.07%    Xsun
622    root        1      58     0       15M     3500K  sleep    0:03    0.02%    dtterm
470    root        4      48     0       141M    57M    sleep    2:40    0.00%    soffice.bin
654    root        15     58     0       79M     13M    sleep    0:08    0.00%    java
434    root        5      58     0       22M     4360K  sleep    0:04    0.00%    dtwm
461    root        1      58     0       15M     2628K  sleep    0:03    0.00%    dtterm
652    root        1      58     0       24M     5312K  sleep    0:01    0.00%    sdtimage
349    root        7      39     6       4532K   704K   sleep    0:00    0.00%    mibiisa
212    root        18     49     3       2872K   720K   sleep    0:00    0.00%    nscd
435    root        1      58     0       16M     1908K  sleep    0:00    0.00%    dtfile
436    root        1      58     0       16M     1864K  sleep    0:00    0.00%    sdtperfmeter
427    root        1      58     0       18M     1368K  sleep    0:00    0.00%    dtsession
672    root        1      58     0       4732K   1196K  sleep    0:00    0.00%    bash
276    root        1      58     0       2068K   580K   sleep    0:00    0.00%    xntpd
Пример 11.5. Вывод команды top

Настройку диспетчерских таблиц следует проводить с осторожностью. Неверные действия могут привести к потере устойчивости и неполадкам в работе производственной системы. Тестируйте внимательно!

Регулирование приоритетов

Регулировать приоритет процесса, как показано выше, можно с помощью команды priocntl. Ключ -s означает требование установить приоритет. Ключ -p позволяет задать относительное изменение приоритета, а для указания конкретного признака процесса (идентификатора и т.п.) следует использовать ключ -i (признак идентификатора обозначается pid, другие признаки поименованы в руководстве по priocntl ).

Например, для понижения приоритета процесса с PID, равным 200, используйте

priocntl -s -c TS -p -20 -i pid 200

Для вывода списка части процессов вместе с заголовком, используйте POSIX-совместимую программу grep:

/usr/bin/ps -ecL |/usr/xpg4/bin/grep -E 'nscd|PID'

Оптимизация пейджинга и свопинга посредством настройки ядра

Алгоритм пейджинга и свопинга в Solaris предусматривает возможность явного указания границ свободной памяти в системе, по достижении которых вначале происходит активный пейджинг (выгрузка отдельных страниц), а при дальнейшем уменьшении свободной памяти - свопинг (выгрузка всех страниц процесса сразу). Более подробно эти возможности настройки рассматриваются в лекции 7.

Лекция 1: 1234 || Лекция 2 >