Случайные замедления Java в Mac OS - PullRequest
2 голосов
/ 30 октября 2009

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

Моя проблема в том, что иногда, когда я запускаю программу, я получаю очень хорошую скорость, а иногда, когда я запускаю точно такую ​​же вещь, она работает очень медленно. Если я вижу, что он работает медленно и запускает ctrl-C и перезапускает, он обычно снова начинает работать быстро. Кажется, он переключается в медленный или быстрый режим на ранней стадии бега и никогда не переключается между режимами.

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

Моя машина - Mac Pro с чередующимся разделом RAID. Использование процессора никогда не прекращается, независимо от того, работает ли оно медленно или быстро, что можно было бы ожидать, если бы потоки тратили слишком много времени на блокировку чтения с диска, поэтому я не думаю, что это может быть проблемой чтения с диска.

Мой вопрос: какие проблемы с моим кодом могут вызывать это? Или это может быть проблемой ОС? Я не смог продублировать его на Windows-машине, но у меня нет Windows-машины с подобной настройкой RAID.

Ответы [ 4 ]

1 голос
/ 02 ноября 2009

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

Я не очень разбираюсь в OSX, но в linux для этой цели полезна команда "free".

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

1 голос
/ 01 ноября 2009

Во-вторых, вам следует делать это с профилировщиком, который просматривает представление потоков - сколько потоков, в каких состояниях они находятся и т. Д. Это может быть странное состояние гонки, возникающее время от времени. Также может быть так, что оснащение классов хуками профилировщика (что приводит к замедлению) сортирует состояние гонки, и вы не увидите замедления при подключенном профилировщике: /

Пожалуйста, посмотрите на этот пост , точнее, ответ, где упоминается проблема с конфликтом в кэше.

Вы порождаете один и тот же набор нитей каждый раз? Это число меньше или равно количеству потоков, доступных на вашей платформе? Это число можно проверить или угадать с достаточной точностью.

Пожалуйста, оставьте любые finidngs!

1 голос
/ 02 ноября 2009

У вас есть инструмент для измерения температуры процессора? Операционная система может регулировать нагрузку на процессор для решения проблем с температурой.

1 голос
/ 30 октября 2009

Возможно, у вас есть поток, который вошел в бесконечный цикл.

Попробуйте подключиться к VisualVM и использовать монитор потоков.

https://visualvm.dev.java.net

Возможно, вам придется подключиться, прежде чем возникнет проблема.

...