Работа с динамическое отключение процессоров

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

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

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

Возможное влияние на приложения

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

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

Прим.: В дальнейшем словом CPU будет обозначаться логический ресурс, а словом процессор - физический ресурс.

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

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

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

Процедура динамического отключения процессора

Обычно процедура отключения процессора выглядит следующим образом:

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

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

Программные интерфейсы для работы с отдельными процессорами

В следующих разделах описаны доступные программные интерфейсы:

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

sysconf, функция

Функция sysconf возвращает количество процессоров в следующих параметрах:
  • _SC_NPROCESSORS_CONF: Количество настроенных процессоров
  • _SC_NPROCESSORS_ONLN: Количество включенных процессоров

Дополнительная информация приведена в описании функции sysconf в Технический справочник: базовая операционная система и расширения, том 2.

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

Поле _system_configuration.ncpus задает число активных CPU в системе. Это поле аналогично параметру _SC_NPROCESSOR_ONLN. Дополнительная информация приведена в разделе Файл systemcfg.h книги Справочник по файлам .

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

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

Прим.: Наибольший номер CPU для связывания можно узнать с помощью переменной ncpus_cfg.

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

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

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

Дополнительная информация об этих интерфейсах приведена в разделе Команда bindprocessor книги Справочник по командам, том 1 и Функция bindprocessor книги Технический справочник: базовая операционная система и расширения, том 1.

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

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

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

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

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

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

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

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

Формат ее вызова следующий:
int register_HA_handler(ha_handler_ext_t *)

Более подробная информация о вызове этой функции приведена в разделе register_HA_handler книги Управление операционной системой и устройствами.

При успешном завершении эта функция возвращает значение 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 символов (не включая последний символ NULL), которая однозначно идентифицирует расширение ядра. Это имя не должно совпадать с именами других зарегистрированных расширений ядра. Если при вызове функции HAEH расширения ядра произойдет ошибка, имя расширения ядра будет записано в поле подробной информации записи протокола ошибок CPU_DEALLOC_ABORTED.

Расширения ядра могут зарегистрировать свою функцию 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;     /* номер неисправного 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 *)

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

Более подробная информация о вызове этой функции приведена в разделе unregister_HA_handler в Технический справочник: ядро и подсистемы, том 1.

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

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

где:

номер-CPU - это логический номер CPU.

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