Ocaml: получение загрузки процессора процесс - PullRequest
5 голосов
/ 14 июля 2011

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

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

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

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

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

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

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

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

Мои вопросы

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

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

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

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

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

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

4 голосов
/ 14 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...