Ocaml: получение данных об использовании процессора процессом

Что я хочу сделать

У меня есть приложение OCaml с интенсивными вычислениями, и я бы хотел, чтобы оно работало в фоновом режиме, не мешая нормальному использованию компьютера. Хочу представить пользователям два варианта:

(1) приложение запускается только тогда, когда загрузка ЦП практически равна 0%;

(2) приложение использует только «бесплатную» вычислительную мощность (например, если другие процессы добавляют до 100%, приложение OCaml приостанавливает работу; если другие процессы практически 0%, то для приложения OCaml нет ограничений; если другие процессы добавляют до, скажем, 50%, тогда OCaml будет использовать до 50%).

Некоторые мысли

Моя идея - проверять использование ЦП в различных контрольных точках кода и при необходимости приостанавливать выполнение.

В (1) мы просто проверяем, не опустился ли ЦП ниже, скажем, 2%, и, если нет, делаем паузу, пока он снова не станет ниже 2%.

В (2) все сложнее. Поскольку при отсутствии ограничений приложение всегда потребляет 100% ЦП, а контрольные точки будут довольно частыми, чтобы уменьшить использование ЦП, скажем, наполовину, мне просто нужно задерживать его на каждой контрольной точке точно на время, которое прошло между контрольными точками. Я бы сказал, что если контрольные точки встречаются часто, это будет похоже на использование 50% ЦП. Для других процентов мы можем сделать что-то подобное, приостановив действие на соответствующие периоды времени. Однако это выглядит очень надуманным, полным накладных расходов, и, прежде всего, я не уверен, что он действительно делает то, что я хочу. Лучшей альтернативой может быть вызов Unix.nice n с некоторым подходящим целым числом в начале приложения. Я полагаю, что установка n=15, вероятно, будет правильной.

Мои вопросы

(Q1) Как я могу узнать из моего приложения OCaml, каково использование ЦП для процесса приложения? (Я бы хотел сделать это с помощью функции OCaml, а не путем вызова "ps" или чего-то подобного в командной строке ...)

(Q2) Вы видите проблемы с моей идеей достижения (2). Каковы практические отличия от изменения аккуратности процесса?

(Q3) Есть ли у вас другие предложения по (2)?


person Surikator    schedule 13.07.2011    source источник


Ответы (2)


Используйте библиотеку Caml Unix, чтобы периодически фиксировать время процессора и прошедшее время. Использование вашего процессора - это соотношение. Попробуйте Unix.gettimeofday и Unix.times. N.B. Вам нужно будет установить ссылку с опцией -lunix.

Я бы тоже просто запустил процесс под nice и покончил с этим.

person Norman Ramsey    schedule 14.07.2011
comment
Спасибо! Просто попробовал, и вроде работает нормально. Одновременно запустить три экземпляра фиктивного интенсивного приложения, два с nice = 20 и еще один с nice = 0, и измерения составили 30%, 30% и 45% соответственно. В то же время это немного странно, так как он должен добавить менее 100% ... Монитор активности на MAC сообщает мне 50%, 50% и 80% (обратите внимание, что показатели монитора удвоены из-за двойного процессора). - person Surikator; 14.07.2011

Получите свой PID, затем проанализируйте содержимое /proc/<PID>/stat, чтобы получить информацию о вашем процессе, и /proc/stat, чтобы получить глобальную информацию о ЦП. У них обоих есть набор статистических данных, которые вы можете использовать, чтобы решить, когда работать, а когда ложиться спать. Сделайте man proc, чтобы просмотреть документацию по всем полям (длинные). Связанный вопрос с хорошей информацией: stackoverflow.com/questions/1420426

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

person Nathan Whitehead    schedule 13.07.2011
comment
Я использую Mac OS X, поэтому /proc/stat у меня нет. Но я мог бы использовать ps -v -p [PID] | grep [PID] и получить простую строку для синтаксического анализа. Проблема с этим подходом заключается в том, что к моменту запуска ps система предоставит мне информацию об использовании ЦП моим приложением при выполнении этого вызова ps, а не при выполнении моих вычислений, которые намного более интенсивны. . Вот почему я хотел, чтобы какая-то функция OCaml сделала это за меня. Я полагаю, что использование времени процессора и прошедшего времени (как предлагает Норман) должно быть лучшим вариантом. Спасибо! - person Surikator; 14.07.2011