Netflix TechBlog | Medium на русском
Подписаться
Java 21 Виртуальные потоки - Чувак, где мой блокировщик?
Netflix, известный своим обширным использованием Java, с энтузиазмом воспринял виртуальные потоки за счет преимуществ в производительности. Однако, во время миграции на Java 21, инженеры столкнулись с периодическими таймаутами и неработающими экземплярами в приложениях, использующих виртуальные потоки с SpringBoot 3 и встроенным Tomcat. Исследования выявили всплеск сокетов, застрявших в состоянии closeWait, что указывало на то, что приложения не могли закрыть соединения. Снимки потоков изначально показывали простаивающие JVM, но более тщательный анализ с помощью специальных команд выявил множество "пустых" виртуальных потоков, то есть потоков, созданных, но еще не запущенных. Это указывало на проблему с выполнением виртуальных потоков, где Tomcat создавал новый виртуальный поток для каждого входящего запроса, но основные потоки операционной системы были полностью заняты. Более глубокий анализ снимков потоков показал, что эти основные потоки операционной системы были прикреплены к виртуальным потокам, застрявшим в ожидании захвата блокировки в синхронизированном блоке кода. Причиной являлось удержание блокировки регулярным платформенным потоком, который не мог вновь захватить блокировку после завершения операции ожидания. Это тупиковая ситуация блокировки препятствовала планированию новых виртуальных потоков, что приводило к наблюдаемым проблемам производительности.