Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

https://visualvm.dev.java.net

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

Другие советы

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

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

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

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

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

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

Я мало что знаю об OSX, но в Linux для этой цели полезна команда «free».

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top