Мьютекс сна занимает много процессора

Я профилировал свое приложение на основе событий с помощью ruby-prof и нашел следующее интересное:

                  5,28    0,00    5,28    0,00          4/4     Mutex# синхронизировать
90,72%   0,00%    5,28    0,00    5,28    0,00            4     Mutex# сон

Я думаю, что ruby-prof считает только такты процессора, и, следовательно, я не могу понять, почему мьютекс-сон может занимать процессорное время. Я предположил бы, что это спит на уровне ядра, не считая времени волокна. Есть идеи? Более того, я бы хотел, чтобы Mutex#sleep передавал управление машине событий, чтобы он мог выполнять другие функции.

5 ответов

Если ruby-prof --mode=cpu действительно учитывает только процессорное время, тогда Mutex#sleep - это спин-блокировка:

http://en.wikipedia.org/wiki/Spinlock

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

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

Что 90% может означать, что вы "спите" 90% времени [?] в общем, с EM вам не нужно спать, вы просто отвечаете на события, и большинство процессоров будут отображаться как "запуск EM" метод

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

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

Здесь слишком мало информации, чтобы дать точный ответ, однако я бы посоветовал взглянуть на несколько других аспектов, например, отслеживает ли ruby-prof время, проведенное в реакторе?

Независимо от того, какой процент дает вам ruby-prof, как долго фактически работает ваш профиль и сколько времени фактически проводится в мьютексе? Вероятно, это только показывает потоки #defer или что-то подобное, и полностью игнорирует среду выполнения C++ в другом потоке.

Другие вопросы по тегам