Случайные замедления Java на Mac OS


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

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

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

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

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

4 2

4 ответа:

У вас может быть нить, которая вошла в бесконечный цикл.

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

Https://visualvm.dev.java.net

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

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

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

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

Пожалуйста, разместите любые finidngs!

Есть ли у вас инструмент для измерения температуры процессора? ОС может регулировать процессор, чтобы справиться с проблемами температуры.

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

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

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