Как да предотвратите последователен модел на пауза на Java на Linux Mint

Имам Java приложение, работещо на Linux Mint. ВСЯКА минута програмата показва много забележимо забавяне -- пауза. Паузата е последователна от 3 до 4 секунди. Когато изпълняваме други екземпляри на същата програма, те също правят пауза от 3 до 4 секунди всяка минута. Всяка програма спира на различна секунда от минутата.

последна актуализация:

След последната актуализация (по-долу) увеличаването на броя на нишките на пула от нишки видя, че проблемът с GUI изчезва. След работа около ~40 часа наблюдавахме изтичане на нишка в извикването на Jetty HttpClient блокиране-GET (Request.send()). За да обясните механиката, използвайки класа Executor: основна нишка се изпълнява на всеки няколко минути. Той използва Executor за стартиране на независима нишка за извикване на хоста с команда HTTP GET, HttpClient.request.send() на Jetty.

След около 40 часа работа имаше скок в броя на нишките, изпълнявани в пула HttpClient. Така че в продължение на 40 часа същите нишки вървяха добре. Работната хипотеза е, че по това време едно или повече send() повиквания не са завършили или е изтекло и не са се върнали към извикващата нишка. По същество това/тези нишки са окачени вътре в Jetty Client.

Когато наблюдаваме всеки нормален цикъл в jVisualMV виждаме нормалното поведение на всеки цикъл; някои HttpClient нишки се задействат за хоста GET, изпълняват се и изчезват само за няколко секунди. Също така на монитора има около 10 нишки, принадлежащи към пула нишки Jetty HttpClient, които са били „присъстващи“ от (сега) 10 часа.

Очаква се, че е имало някаква грешка в основната клиентска или мрежова обработка. Изненадан съм, че няма изключение за изчакване или програмно изключение. Има някои ясни въпроси, които мога да задам сега.

  1. Какво може да се случи вътре в HttpClient, което може просто да закачи Request.send()
  2. Какво е времето за изчакване при връщане на повикване? Мисля, че все още ще има абсолютни изчаквания или проверки за заключване и т.н. (не?)
  3. Can the I/O system hang and leave the caller-thread hanging -- While Java obediently ...
    • Fires the manager thread at the scheduled time, then
    • Следващото Http.Request.send() се случва,
    • Нова(и) нишка(и) от подготовката на пула за следващото изпращане (както изглежда се е случило).
    • Докато по-ранният send() е заседнал в неизвестност
  4. Мога ли да огранича или по друг начин да направя почистване на тези заседнали теми?

Това се случваше преди да увеличим размера на пула от нишки. Това, което се случи, е, че „обвинението“ е станало по-фокусирано върху проблемната зона. също така сме подозрителни към основната система, защото също имахме блокирания с Apache HttpClient отново около същото (неспецифично) време на деня.

(предишна актуализация) ...

Наблюдаваното поведение на пауза е, че GUI на JavaFX не се актуализира/опреснява; часовника на дисплея (textView), setText() повикването беше регистрирано по време на замразяването с две x актуализации в секунда (това е нова информация). Часовникът не се актуализира (на Mint Linux), той продължава да се актуализира, когато работи на Windows. За да ме предотвратят да се повтарям за въпроси относно GC, регистрационни файлове, сонди и т.н., отговорът ще бъде същият; проведохме обширна диагностика в продължение на седмици. Проблемът безпогрешно е комбинация от: Linux JVM / Linux Mint / Threads (за JavaFX). Друга част от новите данни е, че увеличаването на броя на пула от нишки с +2 изглежда премахва замразяването -- необходимо е допълнително тестване, за да се потвърди това и да се коригират числата. Въпросът обаче е „Какви са параметрите, които правят разликата между двете платформи?

Изпълнихме няколко екземпляра на програмата на Windows в продължение на дни без паузи. Когато работим на платформа Mint Linux, виждаме замразяването, то е много последователно.

Програмата има няколко работещи нишки, работещи по график. Една нишка отваря интернет за http сокет. Когато коментираме тази област, паузата изчезва. Ние обаче не виждаме това поведение при използване на Windows. Експериментите сочат към нещо специфично за I/O мрежовата подсистема на Mint, планирането на Linux, Linux Java 8 JVM или някакво взаимодействие между двете.

Както може би се досещате, ние скъсваме косите си от този. Например, ние изключихме логването и паузата остана. Подновихме регистрирането и току-що направихме едно обаждане до http сървъра, пауза на всеки 60 секунди, при едно и също отброяване на секунди. Това се случва дори когато не извършваме друга обработка. Опитахме различни http библиотеки и т.н. Изглежда много ясно, че е в JVM или Linux.

Някой знае ли начин за разрешаване на това?


person will    schedule 16.08.2014    source източник
comment
Наблюдавали ли сте сметосъбирането? Може да е виновникът.   -  person assylias    schedule 16.08.2014
comment
Всичко, включително сметосъбирането, е следено. Ние сме много сигурни, че проблемът е между JVM, I/O и/или Linux. Разликата изглежда е в начина, по който ThreadPool-ите са внедрени за Linux JVM. Както казах, работи добре на Windows, пауза на Linux. Експериментите с размера на пула от нишки демонстрират известно подобрение. Не сме сигурни защо са различни; ако това всъщност е проблемът или ако размерът на пула крие първопричината.   -  person will    schedule 17.08.2014
comment
Какво се случва по време на пауза? Могат ли други нишки да напреднат? Или са замразени (както казвате) или просто са забавени? Какво поведение на системата наблюдавате, което ви казва, че е настъпила пауза? Каква е активността на процесора и I/O на системата по време на паузата?   -  person Stuart Marks    schedule 17.08.2014
comment
Пускали ли сте VisualVM срещу него и виждали ли сте какво може да се изпълнява, когато пауза?   -  person chrylis -cautiouslyoptimistic-    schedule 17.08.2014
comment
VisualVM току-що показа нишки, работещи според очакванията. GC не е проблемът. Нишките продължават да работят, JavaFX GUI не се актуализира до 3 - 5 секунди, както е описано. Има часовник, който се актуализира на всеки 0,5 секунди. Направихме System.out.println() на актуализацията на часовника setText(). SysOut показва други нишки, работещи по предназначение, екранът е замразен (на пауза).   -  person will    schedule 17.08.2014
comment
@will Основните разлики, за които се сещам спрямо JavaFX, са: (i) нишките се обработват по различен начин в Windows и Linux и може да имате проблем с безопасността на нишката, който се появява само на един (може би правите FX неща извън нишката FX? ) (ii) действителният дисплей се извършва от собствена библиотека, която се различава между windows и linux.   -  person assylias    schedule 17.08.2014
comment
@assylias ... По първата точка JavaFX хвърля изключение, когато правите нещо, свързано с JavaFX, в различна нишка. Така че успяхме да елиминираме тези бъгове -- също така има блокове Try/Catch във всички нишки за откриване на нещо подобно.   -  person will    schedule 23.08.2014
comment
Подобен проблем: stackoverflow.com/questions/12740741/   -  person will    schedule 29.08.2014
comment
Видях подобен проблем, при който http комуникацията беше обесена. Оказа се, че ротацията на лога (т.е. компресиране и завъртане на регистрационния файл), която постави на пауза целия процес.   -  person Elad Tabak    schedule 25.10.2018