Имам 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 часа.
Очаква се, че е имало някаква грешка в основната клиентска или мрежова обработка. Изненадан съм, че няма изключение за изчакване или програмно изключение. Има някои ясни въпроси, които мога да задам сега.
- Какво може да се случи вътре в
HttpClient
, което може просто да закачиRequest.send()
- Какво е времето за изчакване при връщане на повикване? Мисля, че все още ще има абсолютни изчаквания или проверки за заключване и т.н. (не?)
- 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()
е заседнал в неизвестност
- Мога ли да огранича или по друг начин да направя почистване на тези заседнали теми?
Това се случваше преди да увеличим размера на пула от нишки. Това, което се случи, е, че „обвинението“ е станало по-фокусирано върху проблемната зона. също така сме подозрителни към основната система, защото също имахме блокирания с 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.
Някой знае ли начин за разрешаване на това?