Можно ли контролировать загрузку процессора из приложения Java? - PullRequest
5 голосов
/ 21 января 2009

Я занимаюсь разработкой Java-приложения, которое транслирует музыку через HTTP, и одна проблема, с которой я столкнулся, заключается в том, что, когда приложение читает аудиофайл с диска и отправляет его клиенту, оно обычно загружает процессор 90-100% (что может вызвать проблемы пользователей при запуске других приложений).

Можно ли управлять потоком, выполняющим эту работу, чтобы использовать меньше ЦП, или это должно контролироваться ОС? Существуют ли способы управления интенсивностью вашего приложения в настоящее время?

Я знаю, что вы можете запускать темы с высоким / низким приоритетом, но, похоже, это не имеет никакого значения для меня в этом сценарии.

(Я не могу понять, что произошло: «Я попросил компьютер сделать что-то, так что он, очевидно, сделает это так быстро, как может ...»)

Спасибо!

стержень. * * +1011

Ответы [ 9 ]

6 голосов
/ 21 января 2009

Эта задача (чтение файла с диска и отправка его по HTTP) должна , а не использовать сколько-нибудь существенное количество ЦП, особенно на битрейтах, необходимых для потоковой передачи музыки (если вы не говорите о мульти канал несжатый PCM или что-то в этом роде, но даже в этом случае он должен быть привязан к вводу / выводу и не использовать много ЦП).

Вы, вероятно, делаете чтение / запись очень неэффективным способом. Вы читаете / пишете каждый байт отдельно или используете какой-то буфер?

2 голосов
/ 22 января 2009

Я бы проверил, сколько буферов вы используете. Если вы читаете / записываете по одному байту за раз, вы потребляете много ресурсов процессора. Однако, если вы читаете / записываете блоки размером, скажем, 4 КБ, он вообще не должен сильно загружать процессор. Если ваша сеть - интернет, ваш процессор не должен превышать 10% от одного клиента.

Одним из приближений размера буфера является задержка полосы пропускания *. например если вы ожидаете, что пользователи будут передавать данные со скоростью 500 КБ / с, а задержка в сети будет составлять до 0,1 с, тогда размер буфера должен составлять около 50 КБ.

2 голосов
/ 21 января 2009

Вы можете понизить его приоритет, используя методы в Thread (через Thread.currentThread (), если необходимо).

Вы также можете поместить задержки в цикл обработки (Thread.sleep ()).

Кроме этого, позвольте O / S позаботиться об этом. Если ваша программа может использовать 100% ЦП, и ничто другое не требует ЦП, ваше приложение может использовать его вместо того, чтобы позволить задаче O / S бездействия.

Также верно, что потоковые данные должны быть привязаны к вводу / выводу, поэтому вы обязательно должны проверить, что делается между чтением данных и их отправкой. Вы читаете / отправляете байты за байтом, небуферизованные, например?

РЕДАКТИРОВАТЬ: В ответ на комментарий marr75, я абсолютно не рекомендую вам писать плохой, неэффективный код, который тратит ресурсов ЦП - на моем веб-сайте есть статья , которая явно передает то, что я думаю об этом мышлении. Скорее, я хочу сказать, что если ваш код законно нуждается в процессоре, и вы расставили приоритеты, чтобы он вел себя хорошо, если пользователь хочет делать другие вещи, то нет никакого смысла искусственно откладывать результат, чтобы избежать привязки ЦП - это лишь медлительность пользователя, заставляющая его дольше ждать конечного результата, которого они, по-видимому, хотят получить как можно быстрее.

1 голос
/ 21 января 2009

У вас есть один или несколько из:

  • Программный RAID
  • Сжатая папка
  • Навязчивый антивирус
  • Loopback файловая система
0 голосов
/ 26 июня 2009

Следуйте моему комментарию "хорошо продуманные буферы", хорошее правило для буферизации TCP, размер буфера = 2 * пропускная способность * задержка

Так что, если вы хотите передавать потоковую музыку со скоростью 214 кбит / с (около 27 кБ / с) и иметь, скажем, 60 мс задержки, вы смотрите на 3,24 килобайта, и округление до хорошего буфера 4 КБ будет очень хорошо работать для вас широкий спектр систем.

0 голосов
/ 21 января 2009

VisualVM очень прост в использовании, чтобы узнать, на что тратится время вашего процессора на приложения Java, и он включен в последние версии JDK (названный jvisualvm.exe в Windows)

0 голосов
/ 21 января 2009

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

0 голосов
/ 21 января 2009

В дополнение к информации, указанной выше: JVM свободна в том, как она использует потоки ОС. Поток в вашем Java-приложении может выполняться в отдельном потоке ОС или совместно использовать этот поток с другими потоками. Для получения дополнительной информации ознакомьтесь с документацией по используемой вами JVM.

0 голосов
/ 21 января 2009

Я не думаю, что вы можете снизить приоритет, не потеряв функциональность (потоковая музыка). Ваша программа получает столько процессоров от ОС, потому что ей это нужно. Это не значит, что ОС отдает процессорное время без причины или потому, что «оно в настроении».

Если вы думаете, что вы можете выполнить задачу, не используя слишком много ресурсов ЦП, вы можете профилировать свое приложение и выяснить, где происходит такое высокое использование ЦП, а затем попытаться улучшить свой код.

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

Я повторяю, не думайте о том, чтобы уменьшить загрузку процессора, снизив приоритет процесса или сказав ОС: "Не давайте столько процессорного времени этому процессу". Вот и вся неправильная интуиция в моих глазах. Сократите использование ЦП, улучшив алгоритмы и код после профилирования.

Хорошим началом в профилировании Java является эта статья: http://www.ibm.com/developerworks/edu/os-dw-os-ecl-tptp.html

...