_spin_unlock_irqrestore() имеет очень высокую частоту дискретизации в моем kvm, почему?

Я запускаю тест SPECJbb на своей виртуальной машине KVM. Он показывает резкое падение пропускной способности между складом 2 и складом 3 (разница между ними заключается только в добавлении параллельной задачи).

Затем я использую perf на своей гостевой виртуальной машине. Это показывает, что _spin_unlock_irqrestore имеет очень высокую частоту дискретизации.

События: 31 тыс. циклов

  • 74,89% [ядро] [k] _spin_unlock_irqrestore

  • 7,36% перф-1968.карта [.] 0x7f84b913e064

  • 6,82% [ядро] [k] __do_softirq

  • 6,39% [ядро] [k] handle_IRQ_event

...

Кажется, что только 7,36% времени процессора запускают мою программу Java. Почему частота дискретизации _spin_unlock_irqrestore такая высокая? И что он делает?


person Sili    schedule 05.02.2013    source источник


Ответы (1)


Это плохие отчеты perf, а не циклы, использованные _spin_unlock_irqrestore.

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

Итак, все, что вы знаете, это то, что циклы использовались кодом, который отключил прерывания и включил их с помощью _spin_unlock_irqrestore.

Если вы можете заставить perf использовать NMI (немаскируемое прерывание), это может решить эту проблему.
Я знаю, что это можно сделать с помощью oprofile (предшественника perf), изменив make-файл, но не знаю о perf.

person ugoren    schedule 05.02.2013
comment
Спасибо за Ваш ответ. Не могли бы вы дать мне более подробное объяснение того, почему время отключения IRQ такое долгое? Это потому что я запускаю его в квм? Спасибо! - person Sili; 07.02.2013