Похоже на утечку памяти в FTS. Platform 7.0.6

Симптомы проявляются в случае, если в полнотексте попытаться выполнить в стандартном ftsField из главного окна приложения поиск по одному слову, заключенному в кавычки (“документация”, “регистрация” и т.п.)

Со стороны пользователя картина следующая:

  • ищем по фразе "настройка системы", получаем результат порядка 110-120 экземпляров сущностей за 2-3 сек;
  • ищем по настройка, затраченное время примерно то же, выдача ожидаемо больше за счет словоформ - порядка 160 экземпляров;
  • теперь ищем первый раз по "настройка", ждем результата примерно раз в 5 дольше, а выдача ожидаемо меньше (без словоформ);
    Далее если попытаться еще раз искать по одному слову в кавычках или новой ключевой фразе, то будет или сообщение “OutOfMemoryError: Java heap space” или стандартное сообщение Cuba: “Внутренняя ошибка, обратитесь к администратору”.

На стороне сервера при этом видим примерно следующее:

  • ищем по фразе "настройка системы" - при первом запуске полнотекста Tomcat с приложением отъедает дополнительно примерно +100 МБ;
  • ищем по настройка - похоже, что при запросе по новой фразе память освобождается, а затем снова потребляются примерно те же 100-110 МБ, а в итоге общее потребление остается стабильным;
  • теперь ищем первый раз по "настройка" - при таком запросе потребление Tomcat с приложением сразу растет минимум на +600 Мб!
  • пытаемся поискать по фразе "настройка системы" - видим, что память не высвобождается, потребление Tomcat с приложением переваливает за 1,5 Гб и получаем OutOfMemoryError: Java heap space.

Попробовали под одним пользователем поиграться выполнением запросов с разными ключевыми словами и понаблюдать за использованием памяти на сервере…
Получается, что до тех пор, пока мы не использовали в поиске одно ключевое слово, заключенное в кавычки - полнотекст потребляет на старте 100-110 МБ, а далее память освобождается и снова потребляется при новом запросе, но общее потребление стабильно.
Как только мы пытаемся провести поиск по одному ключевому слову, заключенному в кавычки - дополнительно потребляется от 600 Мб (даже если результатов поиска Значительно меньше, чем по запросу с 2-3 словами в кавычках).
Далее, при любых новых запросах эти 600 Мб уже не освобождаются.

Из дополнительной информации:

  • Пока приложение было на 6.10.х проблемы не замечали. Возможно именно не замечали, хотя, маловероятно, т.к. за несколько месяцев эксплуатации это бы всплыло.
  • Проявилась проблема после миграции на 7.0.6, буквально через 2 дня.
  • FTS используем “как есть” - подключили компонент, добавили на главный экран, убрали лишние сущности из fts.xml.
  • Полное сообщение из лога при “java.lang.OutOfMemoryError”:
java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3236) ~[na:1.8.0_131]
        at java.lang.StringCoding.safeTrim(StringCoding.java:79) ~[na:1.8.0_131]
        at java.lang.StringCoding.encode(StringCoding.java:365) ~[na:1.8.0_131]
        at java.lang.String.getBytes(String.java:941) ~[na:1.8.0_131]
        at com.vaadin.server.communication.UIInitHandler.commitJsonResponse(UIInitHandler.java:107) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
        at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:100) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
        at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
        at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1577) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
        at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.0.6.jar:7.0.6]
        at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.0.6.jar:7.0.6]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[servlet-api.jar:na]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
        at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:108) ~[cuba-web-7.0.6.jar:7.0.6]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-websocket.jar:8.0.50]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
        at com.haulmont.cuba.web.sys.singleapp.SingleAppWebContextLoader$SetClassLoaderFilter.doFilter(SingleAppWebContextLoader.java:269) ~[cuba-web-7.0.6.jar:7.0.6]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) ~[catalina.jar:8.0.50]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) ~[catalina.jar:8.0.50]
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) ~[catalina.jar:8.0.50]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) ~[catalina.jar:8.0.50]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) ~[catalina.jar:8.0.50]
2019-06-06 11:34:28.538 WARN  [http-apr-80-exec-2] com.haulmont.cuba.web.sys.CubaApplicationServlet - Too long request processing [20626 ms]: ip=xx.xx.xx.xx, url=/appname/UIDL/

Здравствуйте,

Для начала стоит попробовать сделать heap dump через jvisualvm и затем посмотреть куда уходит память через EclipseMemoryAnalyzer.

Каких либо проблем с утечками памяти в issue tracker библиотеки lucene я не вижу.

1 симпатия

Попробовали посмотреть через EclipseMemoryAnalyzer после поиска по "регистрация" (выдача менее 100 сущностей).
Честно говоря, намного яснее не стало…
Analyzer показывает на возможную проблему в com.vaadin.server.VaadinSession и com.haulmont.cuba.web.AppUI (итого 73% памяти).
image
image

Если посмотреть в Details, то Analyzer выделяет вот такой, проблемный участок.
image
Почему при следующем запросе не происходит высвобождение памяти - у меня догадок нет.

Смотрим для сравнения дамп через EclipseMemoryAnalyzer после поиска по регистрация (выдача больше за счет словоформ, порядка 110 сущностей). Тут в числе возможных проблем com.haulmont.cuba.web.AppUI уже не значится, потребление памяти в 4 раза меньше и она освобождается при следующем поисковом запросе.
image

Куда дальше рыть??

1 симпатия

На втором скрине с объектами, почему то очень много объектов fts.SearchResults. Там если развернуть должно быть видно сколько их.

В fts.global.SearchResults количество результатов в штуках как раз похоже на правду.
В случает поиска по "регистрация" там 90 результатов.
image
И 148 шт в случае поиска по регистрация
image

Мне другое непонятно… При поиске по "регистрация" там 90 результатов и fts.global.SearchResults 195 МБ (43% памяти), а HashMap в нем занимает 191 МБ.
Если развернуть дальше эту ветку, то можно добраться до String в 65 МБ. Разобрали доступный в дампе кусок unicode, судя по всему, это один из файлов DOC размером 16 МБ в котором есть это ключевое слово, конвертированный в unicode. ВЕСЬ контент файла в результаты - это так и должно быть?
И там не один такой тяжелый HashMap с контентом файлов, т.к. реально есть несколько тяжелых DOC с таким ключевым словом.
image

Для сравнения, ветка fts.global.SearchResults после поиска по регистрация. fts.global.SearchResults всего 5.9 МБ (4.5% памяти). Тут явно в HashMap не прилетел ВЕСЬ контент файлов с ключевым словом.
image
А в выдаче в приложении, естественно, присутствуют все те же файлы, только результаты выдачи больше за счет словоформ, а использование памяти на порядок Меньше. :triumph:

И вот еще интересный результат. Пробуем искать по трем ключевым словам с кавычками - "первичная регистрация документов". Эта ключевая фраза взята из того самого файла DOC размером 16 МБ, контент которого целиком прилетал в результаты поиска по "регистрация". Файл есть в результатах поиска + еще 1 тяжелый DOC с этой фразой.
Но тут картина совсем другая. Тут нет тяжелых HashMap вообще и весь fts.global.SearchResults всего 1.4 МБ. Хотя, в HashMap есть String, но они адекватного объема, видимо с фрагментом текста с ключевой фразой, а не со всем контентом файла.
image

Получается, что все “волшебство” случается при поиске по одному слову в кавычках. В этом случает в результаты в HashMap прилетает String как бы не с полным контентом файла, содержащего фразу, только еще и преобразованного в unicode, с соответствующим “приростом в весе”.
В других вариантах поиска в результаты отдается фрагмент контента файла, вокруг ключевой фразы.

1 симпатия

Спасибо за анализ. Будем пробовать воспроизводить, разбираться почему файл хранится полностью и думать как ее решить.

1 симпатия

@subbotin, удалось воспроизвести?
От нас нужна еще какая-то помощь в диагностике?

Когда можно ожидать лекарство от этой проблемы?

Здравствуйте, на этой недели посмотрим по проблеме и сообщим по каким либо срокам.

Разобрался с причинами проблемы. Информации предоставленной вами достаточно. Спасибо.
Тикет: https://github.com/cuba-platform/fts/issues/56
Будем делать в одном из ближайших обновлений платформы. Если успеем релиз на этой или начале следующей неделе. Иначе через релиз, недели через 2-3.

1 симпатия

Проблема в 7.0.8 исправлена.
Обновились, протестировали - проблема решена.
Всем спасибо!