Балансирование очередей на выполнение в многопроцессорных системах
что Linux придерживается модели SMP (Symmetric Multiprocessing, симметричная многопроцессорная обработка). Это означает,что ядро не должно предпочитать какой-то один процессор другим. Однако многопроцессорные компьютеры изготавливаются в самых разных вариантах, и планировщик ведет себя по-разному в зависимости от аппаратных характеристик. В частности, мы рассмотрим три типа многопроцессорных машин:
- Классическая многопроцессорная архитектура— до недавнего времени это была самая распространенная архитектура многопроцессорных компьютеров. В таких компьютерах общий набор чипов оперативной памяти совместно используется всеми процессорами.
- Чип с поддержкой технологии Hyper-Threading— представляет собой микропроцессор, выполняющий несколько потоков одновременно. Он включает в себя несколько экземпляров каждого внутреннего регистра и быстро переключается между ними. Эта технология, изобретенная в компании Intel, позволяет процессору использовать машинные циклы для выполнения другого потока, пока текущий поток обращается к памяти. Физический многопоточный процессор представляется операционной системе Linux в виде нескольких различных логических процессоров.
- NUMA — чипы процессоров и оперативной памяти группируются в локальные "узлы” (обычно узел состоит из одного процессора и нескольких чипов оперативной памяти). Арбитр памяти (специальная электронная схема, упорядочивающая обращения к оперативной памяти от различных процессоров в системе; является узким местом для производительности классических многопроцессорных систем. В архитектуре NUMA, когда процессор обращается к локальному” чипу памяти внутри своего узла, конфликты практически отсутствуют, и обращение обычно занимает мало времени. Зато обращение к удаленному” чипу памяти за пределами узла происходит гораздо медленнее. Эти базовые типы многопроцессорных систем часто комбинируются. Например, материнская плата с двумя процессорами с поддержкой Hyper-Threading воспринимается ядром как четыре логических процессора.
Как мы видели в предыдущем разделе, функция schedule о выбирает новый процесс из очереди на выполнение, принадлежащей локальному процессору. Следовательно, каждый конкретный процессор может выполнить только выполняемые процессы, находящиеся в его очереди. С другой стороны, выполняемый процесс всегда стоит в одной и только одной очереди на выполнение; ни один процесс не находится в двух или более очередях. Таким образом, пока процесс остается выполняемым, он обычно привязан к одному процессору.
Такой подход обычно оптимален с точки зрения производительности системы, поскольку аппаратный кэш любого процессора, вероятнее всего, содержит данные, необходимые процессам, стоящим в очереди на выполнение. Однако в некоторых случаях привязка выполняемого процесса к конкретному процессору может сильно понизить производительность. Рассмотрим в качестве примера случай, когда много пакетных процессоров интенсивно используют процессор. Если большинство из них окажется в одной очереди на выполнение, то соответствующий процессор будет перегружен, в то время как остальные будут практически простаивать.
Поэтому ядро периодически проверяет, сбалансирована ли рабочая нагрузка в очереди на выполнение, и, если необходимо, переносит некоторые процессы из одной очереди в другую. Однако для достижения оптимальной производительности в многопроцессорной системе алгоритм балансировки нагрузки должен учитывать топологию организации процессоров. Начиная с версии ядра , в операционной системе Linux применяется сложный алгоритм балансирования очередей на выполнение, в основе которого лежит понятие области планирования”. Благодаря областям планирования алгоритм может быть легко настроен на любые существующие многопроцессорные архитектуры (и даже самые современные, например, с многоядерными” микропроцессорами).
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница