Заставить приложение работать с тем же приоритетом, что и у процессора

У меня есть сервер Solaris, который должен как можно быстрее запускать приложение, критичное по времени, хотя установка его на класс приоритетов RT не кажется хорошей идеей, поскольку для длительных периодов может потребоваться 100 CPU.

Я хотел бы использовать время простоя процессора для работы над другими процессами, но этот процесс вообще не должен получать никакого времени процессора, если у одного из них есть время. Как этого добиться, используя nice -19, вы не выделяете 100% процессорного времени на критический по времени.

2 ответа

Решение

Запустите ваше второе приложение с классом фиксированного приоритета и с его наименьшим возможным приоритетом. Если он уже запущен, вы можете установить его, используя его pid:

priocntl -c FX -m 0 -p 0 -s -i pid <pid>

Или сделайте это во время запуска:

priocntl -c FX -m 0 -p 0 -e command [arguments ...]

Редактировать:

Обратите внимание, что класс планирования FX не следует путать с классом RT. Хотя класс приоритета RT (реального времени) также является классом с фиксированным приоритетом, процессы, которым назначен приоритет RT, будут вытеснять системные потоки (то есть ядро), поэтому их следует использовать только с процессами с относительно короткими периодами вычислительной активности. Класс RT абсолютно не рекомендуется для процесса, требующего 100 потоков ЦП в течение длительного периода времени, подобного тому, который вы описываете. Эта проблема не существует с классом FX, диапазон приоритетов (по умолчанию) которого совпадает с обычным разделением времени.

Как заметил Едрик в своем ответе, установки приоритета процесса с низким приоритетом на 0 недостаточно, чтобы убедиться, что он вообще не будет работать, когда активен высокоприоритетный процесс.

Причина в том, что последний находится в классе с разделением времени, планировщик заметит, что процесс ждал какое-то время, поэтому снизит фактический приоритет критического процесса до 0, разрешая небольшие всплески активности из процесса с низким приоритетом.

Чтобы избежать этой ситуации, вы можете установить критический процесс на класс FX со средним приоритетом. В таком случае он никогда не уступит другому:

priocntl -c FX -m 30 -p 30 -c critical_command ...  

В структуре планирования Solaris невозможно установить жесткие ограничения, которые вы ищете. Ближайшие варианты:

  1. RT для критического процесса; или же,
  2. Завершение некритического процесса, когда критическому процессу требуется процессор, и перезапуск, как только эта потребность удовлетворена; или же,
  3. Использование сигналов процесса SIGSTOP/SIGCONT для перевода некритического процесса в спящий режим и его продолжения.

Предоставленный ответ @jlliagre приблизит вас к значениям по умолчанию стандартной модели планирования, но он все равно не помешает некритическому процессу получить процессорное время.

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

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