В архитектуре на основе POWER не поддерживается 35 инструкций POWER (в том числе 5 для процессора-"моста" RISC PowerPC 601). Для обеспечения совместимости со старыми версиями программ, двоичный код которых может содержать эти инструкции, в ядре AIX версии 4 предусмотрены функции эмуляции удаленных инструкций. Попытка выполнить удаленную инструкцию приводит к возникновению исключительной ситуации "запрещенная инструкция". Ядро расшифровывает запрещенную инструкцию и, если она относится к числу удаленных, запускает функцию эмуляции этой инструкции.
Однако поскольку эмуляция удаленных инструкций повышает нагрузку на
процессор, она может привести к снижению производительности. Это
зависит от частоты выполнения удаленных инструкций и числа команд в процедурах
их эмуляции. Более того, даже если доля операций эмуляции мала,
снижение производительности может быть весьма ощутимым. В приведенной
ниже таблице указано примерное число команд в функциях эмуляции некоторых
удаленных инструкций:
Инструкция | Среда эмуляции | Приблизительное число команд |
abs | ассемблер | 117 |
doz | ассемблер | 120 |
mul | ассемблер | 127 |
rlmi | C | 425 |
sle | C | 447 |
clf | C | 542 |
div | C | 1079 |
Чаще всего негативное влияние эмуляции на производительность сказывается в системах RISC PowerPC 604. Типичным примером может служить система RISC PowerPC 601, модернизированная до уровня RISC PowerPC 604. Если вместо ожидаемого роста производительности наблюдается ее снижение, наиболее вероятная причина кроется в эмуляции инструкций.
Избежать проблем, связанных с эмуляцией, можно путем повторной компиляции приложения в обычном режиме. По умолчанию в операционной системе AIX версии 4 приложения компилируются для общей архитектуры. Однако в AIX версии 3 по умолчанию компиляция выполняется для архитектуры POWER, POWER2 и RISC PowerPC 601. При выполнении таких программ в системе RISC PowerPC 604 некоторые инструкции будут эмулироваться.
Если программу необходимо скомпилировать в AIX версии 3, то установите в этой системе APAR Full Common Mode и укажите в команде компиляции следующие опции:
-qarch=com -qdebug=useabs -bI:/lib/FCM/lowsys.exp
Кроме того, следует удалить указанные инструкции из кода, написанного на ассемблере, поскольку повторная компиляция влияет только на код высокого уровня.
Для того чтобы узнать, эмулируются ли некоторые инструкции, воспользуйтесь утилитой emstat (эта утилита предусмотрена в AIX версии 4.2.1 и выше).
Для того чтобы определить, установлена и доступна ли программа emstat, введите следующую команду:
# lslpp -lI bos.adt.samples
Эта утилита расположена в каталоге /usr/samples/kernel.
В операционной системе AIX старше 4.3.3 эта команда поставляется с набором файлов perfagent.tools, и ее вывод имеет несколько другой вид. Для того чтобы определить, установлена и доступна ли программа emstat, введите следующую команду:
# lslpp -lI perfagent.tools
Как и в команде vmstat, в команде emstat указывается интервал сбора информации в секундах и, при необходимости, число интервалов. Первый столбец вывода содержит общее число эмулированных инструкций с момента загрузки системы, а второй - число инструкций, эмулированных за указанный интервал. Если в секунду эмулируется до нескольких тысяч инструкций, то это может служить причиной снижения производительности.
# emstat 1 7 Общее число Число за интервал 21951937 21951937 21967488 15551 21974877 7389 21994354 19477 22007329 12975 22018171 10842 22018171 0
Обнаружив, что эмуляция действительно происходит, необходимо найти приложение, в котором эмулируются инструкции. Это гораздо более трудоемкая операция. Один из способов заключается в поочередном запуске приложений и отслеживании их работы с помощью программы emstat. Некоторые случаи эмуляции можно обнаружить с помощью точки трассировки. Их можно найти в текстовом отчете о трассировке по словам PROGRAM CHECK. Процесс или нить, связанные с этим событием трассировки, эмулируют либо собственные инструкции, либо инструкции применяемых библиотечных функций или модулей.