[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Динамическое отключение процессора

Начиная с систем 7044 модели 270, аппаратное обеспечение всех компьютеров с более чем двумя процессорами может автоматически регистрировать исправимые ошибки с помощью микрокода. Эти ошибки не критичны и, если они возникают достаточно редко, их можно игнорировать. Однако если число ошибок конкретного процессора продолжает увеличиваться, это может говорить о том, что в ближайшем будущем данный компонент системы полностью выйдет из строя. Подобный прогноз составляется микрокодом на основании числа ошибок и пороговых значений.

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

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

Потенциальное влияние на приложения

Отключение процесса никак не повлияет на большую часть приложений, включая драйверы и расширения ядра. Однако в AIX есть набор интерфейсов, позволяющих определить, работает ли приложение или расширение ядра на многопроцессорной системе, узнать число процессоров и связать нити с конкретными процессорами.

Интерфейс связывания нитей с процессорами использует логические номера процессоров. Логические номера процессоров лежат в диапазоне [0..N-1], где N - это общее число процессоров. Для того чтобы избежать ошибок, связанных с пропусками в нумерации процессоров, AIX всегда имитирует отключение последнего (с наибольшим номером) процессора. Например, в 8-процессорной системе есть процессоры с номерами [0..7]. После отключения одного процессора их общее число становится равным 7, и они нумеруются [0..6]. Для приложений это выглядит так, как если бы исчез седьмой процессор, вне зависимости от того, какой физический процессор был отключен. В оставшейся части этой главы логическое представление процессора будет называться CPU, а физическое устройство - процессором.

В приложениях и расширениях ядра могут возникнуть ошибки, если AIX неожиданно прервет связь нити с процессором или переместит нить на другой процессор. Функции динамического отключения процессоров содержат интерфейсы, позволяющие уведомлять приложения о предстоящем отключении процессора. Получив уведомление, приложения и расширения ядра должны прервать связь нитей и других ресурсов (например, таймеров) с последним CPU и адаптироваться к новой конфигурации.

Если, несмотря на уведомление, некоторые процессы не прервут связь своих нитей с последним логическим CPU, отключение выполнено не будет. В этом случае AIX занесет соответствующее сообщение в протокол ошибок и продолжит использование процессора. Сбой процессора вызовет сбой всей системы. Поэтому приложения и расширения ядра, связывающие свои нити с процессорами, обязательно должны получать и обрабатывать сообщения о предстоящем отключении процессора.

В тех редких случаях, когда системе не удается отключить процессор, она отправляет системным администраторам дополнительное сообщение. Соответствующая запись в протоколе ошибок позволяет администраторам своевременно удалить поврежденный процессор, не дожидаясь сбоя всей системы.

Отключение процессора: последовательность действий

Ниже показана обычная последовательность действий, выполняемых при отключении процессора:

  1. Микрокод определяет, что для одного из процессоров был превышен порог максимального числа ошибок.
  2. AIX заносит сообщение об ошибках процессора в протокол ошибок и начинает процесс отключения процессора.
  3. AIX уведомляет процессы и нити, связанные с последним логическим CPU.
  4. AIX ждет, пока не будет удалена связь всех нитей с последним CPU. Если через десять минут с процессором все еще будут связаны нити, AIX отменит операцию.
  5. В противном случае, AIX вызывает зарегистрированные ранее обработчики HAEH. Если HAEH возвратит сообщение об ошибке, то отключение будет отменено.
  6. В противном случае, AIX продолжит процесс и отключит поврежденный процессор.

В случае сбоя на каком-либо этапе процесса, AIX занесет сообщение об ошибке в протокол. Системный администратор должен просмотреть протокол, предпринять все необходимые действия по исправлению ошибки и начать процесс отключения заново. Например, если отключение процесса было прервано из-за того, что одно из приложений не прервало связь своих нитей с процессором, системный администратор должен остановить приложение, отключить процессор и перезапустить приложение.

Программные интерфейсы

Интерфейсы AIX, управляющие конкретными процессорами

Ниже приведен список существующих интерфейсов:

Интерфейсы, определяющие число CPU в системе

Функция sysconf

Функция sysconf возвращает число процессоров:

_SC_NPROCESSORS_CONF: Число настроенных процессоров.
_SC_NPROCESSORS_ONLN: Число включенных процессоров.

Более подробная информация приведена в разделе Функция sysconf в книге AIX 5L Version 5.1 Technical Reference: Base Operating System and Extensions Volume 2.

Значение, возвращенное функцией sysconf для _SC_NPROCESSORS_CONF, не изменяется при перезагрузке. Значение _SC_NPROCESSORS_ONLN, равно количеству активных CPU и уменьшается при каждом отключении процессора.

_system_configuration.ncpus

_system_configuration.ncpus указывает число активных CPU в системе. В системах с одним процессором (UP) это значение равно 1. Значения, превышающие 1, относятся к многопроцессорным системам (MP). Более подробная информация приведена в разделе systemcfg.h File в книге AIX 5L Version 5.1 Files Reference.

Значение ncpus уменьшается каждый раз при отключении процессоров. В программах, предполагающих, что значение ncpus не изменяется, это вызовет ошибку. При уменьшении числа процессоров такие приложения могут изменить режим работы с однопроцессорного (UP) на многопроцессорный (MP), поэтому если в системе осталось только два активных процессора, они отключены не будут. Следовательно, если значение ncpus больше единицы, то оно останется больше единицы при следующей перезагрузке.

Для программ, которым необходимо знать, сколько процессоров было в системе при загрузке, в таблицу _system_configuration было добавлено новое поле ncpus_cfg. Значение этого поля может изменяться без перезагрузки.

CPU идентифицируются номерами логических CPU в диапазоне [0..(ncpus-1)]. У процессора также есть номер физического CPU, зависящий от расположения процессора на карте адаптера, карты адаптера и т.п. Команды и функции, работающие с номерами CPU, всегда используют номера логических CPU. Для упрощения работы с переменным числом CPU, номера логических CPU всегда представляют собой в AIX 4.3.3 непрерывную последовательность [0..(ncpus-1)]. Поэтому при удалении процессора для пользователя это выглядит так, как если бы удалялся "последний" процессор (с наибольшим номером), вне зависимости от того, какой физический процессор был поврежден.

Примечание: Для определения наибольшего номера CPU рекомендуется использовать переменную ncpus_cfg.

Интерфейсы связывания нитей с процессорами

Программные интерфейсы bindprocessor и bindprocessor() позволяют связывать нить или процесс с конкретным CPU по логическому номеру. Оба интерфейса позволяют связывать нити и процессы только с активными CPU. Эти интерфейсы упоминаются в данном разделе по той причине, что программы, использующие API bindprocessor() или команду bindprocessor, должны правильно обрабатывать отключение процессора.

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

Более подробная информация об этих интерфейсах приведена в разделах bindprocessor Command в AIX 5L Version 5.1 Commands Reference, Volume 1 и bindprocessor Subroutine в AIX 5L Version 5.1 Technical Reference: Base Operating System and Extensions Volume 1.

Интерфейсы уведомления об отключении процессора

Для пользовательских приложений, нити которых связаны с последним процессором, и расширений ядра применяется разный механизм оповещения.

Оповещение пользовательских программ

Каждой нити пользовательского приложения, связанной с последним процессором, будет отправлен сигнал SIGCPUFAIL (по умолчанию он игнорируется). Приложения должны обработать этот сигнал и либо удалить связь нити с процессорами, либо связать ее с новым процессором.

Оповещение расширений ядра

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

Регистрация обработчика HAEH

Для оповещения расширений ядра о событиях, связанных с надежностью системы, в ядре создана новая функция.

Формат ее вызова следующий:

int register_HA_handler(ha_handler_ext_t *)

Более подробная информация о вызове этой функции приведена в разделе register_HA_handler в книге AIX 5L Version 5.1 Technical Reference: Kernel and Subsystems Volume 1.

При успешном завершении эта функция возвращает значение 0. Ненулевой код завершения означает, что произошла ошибка.

Аргумент этой функции - это указатель на структуру, описывающую обработчик событий HAEH в расширении ядра. Эта структура определена в новом файле заголовка <sys/high_avail.h> следующим образом:

typedef struct _ha_handler_ext_ { 
    int (*_fun)();        /* Вызываемая функция */
    long long _data;      /* Частные данные для (*_fun)() */
    char        _name[sizeof(long long) + 1]; 
} ha_handler_ext_t;

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

Поле _name - это строка длиной не более 8 символов (не включая завершающий пустой символ), используемая для однозначной идентификации расширения ядра. Это имя не должно повторяться среди зарегистрированных расширений ядра. Это имя будет показано в поле подробной информации в записи протокола ошибок CPU_DEALLOC_ABORTED, если при вызове функции HAEH произойдет ошибка.

Расширения ядра могут зарегистрировать свою функцию HAEH только один раз.

Вызов обработчика HAEH

При вызове функции HAEH передаются два параметра. Первый параметр - это содержимое поля _data структуры ha_handler_ext_t, переданной register_HA_handler. Второй параметр - это указатель на структуру ha_event_t, определенную в <sys/high_avail.h> следующим образом:

typedef struct {                    /* Событие HAEH */
    uint _magic;                    /* Тип события */
#define HA_CPU_FAIL 0x40505546      /* "CPUF" */ 
    union { 
        struct {                   /* Сбой процессора */
            cpu_t dealloc_cpu;     /* Логический ИД процессора */
                       ushort domain;         /* будущее расширение */
            ushort nodeid;         /* будущее расширение */
            ushort reserved3;      /* будущее расширение */
            uint reserved[4];      /* будущее расширение */
        } _cpu; 
        /* ... */                  /* Дополнительные типы событий -- */
        /* будущее расширение */
    } _u; 
} haeh_event_t;

Функция должна возвратить один из следующих кодов, также определенных в <sys/high_avail.h>.

#define HA_ACCEPTED 0     /* Успешное выполнение */
#define HA_REFUSED -1     /* Ошибка */

Если хотя бы одно из зарегистрированных расширений не возвратит HA_ACCEPTED, отключение процессора будет прервано. Функции HAEH вызываются в среде процесса и не требуют закрепления в памяти.

Если расширение ядра зависит от конфигурации CPU, связанная с ним процедура HAEH должна правильно обрабатывать предстоящее отключение процессора. Выполнение этих действий зависит от приложения. Для удаления процессора системе AIX будет достаточно, чтобы приложение отменило связь своих нитей с последним логическим CPU. Кроме того, если приложение использовало таймеры, запущенные из связанных нитей, такие таймеры также следует связать с другим CPU. Если работа программы зависит от того, с каким именно процессором связан таймер, таймер следует остановить и перезапустить после связывания нитей с другим CPU. За правильное выполнение этих действий ответственно только приложение.

Отмена регистрации обработчика HAEH

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

int unregister_HA_handler(ha_handler_ext_t *)

Более подробная информация приведена в разделе unregister_HA_handler книги AIX 5L Version 5.1 Technical Reference: Kernel and Subsystems Volume 1.

При успешном завершении эта функция возвращает значение 0. Ненулевое значение означает, что произошла ошибка.

Тестовая среда

Аппаратные неполадки, из-за которых приходится удалять процессор, возникают очень редко. Для тестирования приложений и расширений ядра, которые должны обрабатывать удаление процессоров, создана специальная команда, вызывающая удаление CPU с заданным номером. Формат ее вызова следующий:

cpu_deallocate номер_CPU

где:

номер_CPU - это допустимый номер логического CPU.

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


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]