Наиболее часто задаваемые вопросы по BogoMips

Несколько респондентов способствовали моему изучению BogoMips. В этой главе мне хочется их отблагодарить.

Что такое BogoMips

Это цитата из Internet, автор неизвестен, но оттуда вытащили ее Eric S Raymond esr@thyrsus.com, и Geoff Mackenzie freon@dialstart.net, далее следует юмористическое определение BogoMips, ''сколько миллионов раз в cекунду, процессор может ничего не делать.''

Более серьезное определение, написанное Lars Wirzenius' wirzeniu@kruuna.Helsinki.FI от 9 Сентября 1993, с добавлениями Alessandro Rubini, rubini@norgana.systemy.it, и моими:

"`MIPS - это аббревиатура, миллионы операций в секунду (Millions of Instructions Per Second). Это измерение скорости выполнения программы. Как и большинство таких мер, ей больше злоупотребляют, чем правильно используют (очень трудно сравнивать MIPS различных типов компьютеров). BogoMips - это изобретение Linus Torvalds. Ядру требуются (или это драйвер устройства?) временные задержки состоящие, из пустых циклов, которые должны быть отрегулированы по отношению к скорости процессора. Так как ядро вычисляет при загрузке, сколько времени занимает каждый тип цикла. "Bogo" происходит от "bogus" (фальшивый, поддельный). Так как величина BogoMips дает представление о скорости процессора, но она настолько антинаучна, что ее назвали не иначе, как BogoMips. Причины (а их две), почему это выводится во время загрузки, являются: a) удобство для отладки и проверки работы кэша и режима турбо, и b) потому что Linus любит посмеиваться над растерянными людьми в новостях. "

BogoMips определяются в /usr/src/linux/init/main.c (простой алгоритм на C), и записывает ее в переменную ядра loops_per_sec, которая используется некоторыми драйверами для более серьезных нужд. Реальная функция задержки udelay() написана на ассемблере, и поэтому каждый порт имеет свое собственное определение /include/asm/delay.h. Переменные loops_per_sec и функция udelay() используются многими драйверами:

cd /usr/src/linux	# или где еще у вас там лежат исходники
find . -name '*.[hcS]' -exec fgrep loops_per_sec {} /dev/null \; 
find . -name '*.[hcS]' -exec fgrep udelay {} /dev/null \;

Как определить, какой рейтинг BogoMips должен быть

По инициативе Ian Jackson, ijackson@nyx.cs.du.edu, и Przemek Klosowski, дополненной и расширенной мной.

Как весьма приближенный ориентир, BogoMips могут быть рассчитаны так:

Система                     BogoMips           Сравнение
 
Intel 8088                  clock * 0.004         0.02 
Intel/AMD 386SX             clock * 0.14          0.8 
Intel/AMD 386DX             clock * 0.18          1 (по определению) 
Motorola 68030              clock * 0.25          1.4 
Cyrix/IBM 486               clock * 0.34          1.8 
Intel Pentium               clock * 0.40          2.2 
Intel 486                   clock * 0.50          2.8
AMD 5x86                    clock * 0.50          2.8 
Mips R4000/R4400            clock * 0.50          2.8
Nexgen Nx586                clock * 0.75          4.2 
PowerPC 601                 clock * 0.84          4.7

Alpha 21064/21064A          clock * 0.99          5.5
Alpha 21066/21066A          clock * 0.99          5.5 
Alpha 21164/21164A          clock * 0.99          5.5 
Intel Pentium Pro           clock * 0.99          5.5 
Cyrix 5x86/6x86             clock * 1.00          5.6 
Intel Pentium II/III        clock * 1.00          5.6
Intel Celeron               clock * 1.00          5.6
AMD K7/Athlon               clock * 1.00          5.6
Mips R4600                  clock * 1.00          5.6 

Alpha 21264                 clock * 1.99         11.1
AMD K5/K6/K6-2/K6-III       clock * 2.00         11.1
UltraSparc II               clock * 2.00         11.1
Pentium MMX                 clock * 2.00         11.1 
PowerPC 604/604e/750        clock * 2.00         11.1
Motorola 68060              clock * 2.01         11.2 

Motorola 68040              недостаточно информации

IBM S390                    недостаточно информации

Примечание: данный способ вычисления BogoMips не является актуальным для параллельных систем, таких как Intel Pentium и Alpha 21164.

Примечание: способ вычисления BogoMips для процессоров, несовместимых с Intel, похож, но не такой же.

Как определить текущий рейтинг BogoMips

Существует три метода для определения BogoMips:

  1. Посмотрите в /proc/cpuinfo, напр., при помощи `cat /proc/cpuinfo`. Этот метод предпочтительнее других.

  2. Просмотрите то, что было написано во время загрузки в файле syslog (если потребуется, загляните в файлы dmesg или syslogk). В этих файлах указана точная информация.

  3. При помощи программы bogomips. Это рекомендуется для не-Linux систем, по причинам описанным ниже.

Программу BogoMips можно использовать для систем не-Linux, таких как Cray и т.д. Выдержка из файла readme, написанного Jeff Tranter, jeff_tranter@mitel.com:

"Устав перезагружать свою систему, вы можете посмотреть, сколько BogoMIPS она сегодня выдает [...] "Bogomips" - это отдельная программа, которая показывает быстродействие вышей системы, используя самый известный алгоритм. Программа использует тот же код, что и ядро Linux при загрузке, но работает как, пользовательская программа. [...] Версия 1.3 BogoMIPs может быть установлена и запущена на любой системе, которая поддерживает компилятор и библиотеку ANSI C."

Примечание: из-за загрузки системы Linux значение, вычисляемое этой программой, может быть ниже, чем на самом деле. На самом деле, любая пользовательская программа не может дать более точную информацию, чем BogoMips, вычисленное при загрузке системы. Поэтому ниже приводятся только значения вычисленные, при загрузке.

Удостоверьтесь, что файл sunsite.unc.edu:/pub/Linux/system/status/bogo-1.2.tar.gz/ содержит последнюю версию 1.3 (на текущий момент). Но благодаря своей высокой совместимости, она должна откомпилироваться почти на любой системе с компилятором C.

Разница в рейтингах BogoMips

Linus Torvalds, torvalds@cc.helsinki.fi объясняет, почему бывают различия в рейтингах BogoMips, в c.o.l.development, от 28 апреля 1994:

"BogoMips дает числовой результат, и вы хотите чтобы, он был одинаковым все время. Но обычно вы будете получать разные числа, если скорость работы близка к предельной."

Также, если вы не скомпилировали ядро специально для своего процессора, то может получиться несовпадение рейтинга BogoMips. Эта проблема присуща различным x86 процессорам (Intel и его клоны). Но, к счастью, она решается просто: откомпилируйте ядро специально для своего процессора.

Примечание: на алгоритм BogoMips, вопреки распространенному мнению, версия ядра НЕ влияет .

BogoMips ... failed

Эта глава родилась из огромного числа вопросов появившихся в новостях и полученных мною по почте, напр., Lily, lbliao@alumni.caltech.edu, и Pierre Frenkiel, frenkiel@cdfap2.in2p3.fr. в марте 1995 они спрашивали:

"Когда я загружаю Linux, то я получаю следующее сообщение: Calibrating delay loop.. ok - 23.96 BogoMips failed. Где/почему возникает ошибка в цикле настройки задержки?' "

Ошибки не было. Если бы она произошла, то вы бы получили сообщение "Calibrating delay loop.. failed"

Скорее всего, это случилось из-за драйвера какого-нибудь устройства, если у вас не подключено это устройство. Сразу после подсчета рейтинга BogoMips инициализируются все драйверы. Первыми идут устройства SCSI, затем сетевые устройства, и т.д. О любой неисправности сразу сообщается. Из-за частых отказов, достопримечательностью является драйвер AHA152x. Другими причинами, по которым произошел сбой драйверов (а не подсчета рейтинга BogoMips), являются - сбои системы, большие задержки, зависание системы, произошедшие близко по времени (немного до или сразу после) к выводу "ok - xx.xx BogoMips".

Так как в версии Linux 1.2 многие сообщения об ошибках доработаны, то установите эту версию или выше для того, чтобы узнать, какой именно драйвер является причиной неудач. А так же откомпилируйте машину, чтобы она содержала только нужные драйвера.

Похожие процессоры (Cyrix, NexGen, AMD)

Процессорам, типа Cyrix 486 необходима специальная программа, включающая кэш (эту программу иногда называют - BogoBoost). Рейтинг BogoMips у Cyrix 5x86 и 6x86 CPU резко увеличивается, если в BIOS включить опцию branch-prediction. Заметьте, что увеличение скорости работы имеет свой предел. Есть несколько пакетов для настройки процессоров Cyrix: bogoboost, cx5x86mod, set6x86. Их архивы можно найти на известных сайтах. Еще говорят, что Cyrix 6x86 показывает лучшие результаты с ядром, собранным для 486, а не для Pentium.

Информация о машине на основе процессора NexGen 386-enhanced (Nx586), приведена в одном разделе с 386. Несмотря на то, что они работают как Pentium, по рейтингу BogoMips они относятся именно к 386

AMD 5x86, так же называемые AMD 486DX5 - это учетверенные машины 486/33, поэтому они находятся в одном разделе с другими 486 CPU. Процессоры AMD K5 и K6 являются Pentium-совместимыми CPU.

Почему надо обращать внимание на рейтинг BogoMips

Разрешите объяснить мне две причины, по которым надо уделять внимание рейтингу BogoMips, получившемуся при загрузке Linux:

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

    • настройки кэша основной памяти (отложенная запись отрицательно влияет на рейтинг BogoMips, часто он бывает ниже 5; лучше использовать прямую запись)

    • кнопка turbo (должна быть включена)

    • программно эмулированный BIOS псевдо-кэш (включите настоящий кэш)

    • и другие подобные настройки кэша и рабочих частот, также иногда относящиеся к BIOS

  2. Вы хотите узнать, быстрее ли ваша система по сравнению с моей? Конечно, это абсолютно некорректно, ненадежно и ненужно, но это общая "болезнь" всех программ тестирования производительности. Поэтому, почему бы и нет? Эта глупость никогда никого не останавливала? :-)

Замечание: более серьезно эта тема затронута в Linux Benchmarking Howto, написанном Andru D. Balsa.