У меня есть Java-программа для выполнения набора научных расчетов на нескольких процессорах, разбивая его на части и выполняя каждый фрагмент в отдельном потоке. Проблема тривиально разбивается, поэтому между потоками нет конфликтов или связи. Единственными общими данными, к которым они получают доступ, являются некоторые общие статические кэши, которым не требуется синхронизировать доступ, и некоторые файлы данных на жестком диске. Потоки также непрерывно записывают на диск, но в отдельные файлы.
Моя проблема в том, что иногда, когда я запускаю программу, я получаю очень хорошую скорость, а иногда, когда я запускаю точно такую же вещь, она работает очень медленно. Если я вижу, что он работает медленно и запускает ctrl-C и перезапускает, он обычно снова начинает работать быстро. Кажется, он переключается в медленный или быстрый режим на ранней стадии бега и никогда не переключается между режимами.
Я подключил его к jconsole, и, похоже, это не проблема с памятью. Когда я обнаружил, что он работает медленно, я попытался подключить к нему профилировщик, но он не подключился. Я пытался запустить с -Xprof, но дамп между медленным и быстрым прогоном, похоже, не сильно отличается. Я также пытался использовать разные сборщики мусора и разные размеры разных частей пространства памяти.
Моя машина - Mac Pro с чередующимся разделом RAID. Использование процессора никогда не прекращается, независимо от того, работает ли оно медленно или быстро, что можно было бы ожидать, если бы потоки тратили слишком много времени на блокировку чтения с диска, поэтому я не думаю, что это может быть проблемой чтения с диска.
Мой вопрос: какие проблемы с моим кодом могут вызывать это? Или это может быть проблемой ОС? Я не смог продублировать его на Windows-машине, но у меня нет Windows-машины с подобной настройкой RAID.