Мьютекс сна занимает много процессора
Я профилировал свое приложение на основе событий с помощью 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++ в другом потоке.