Я только что обновил Tomcat с версии 7.0.52 до 8.0.14.
Я получаю это для множества файлов статических изображений:
org.apache.catalina.webresources.Cache.getResource Невозможно добавить ресурс по адресу [/base/1325/WA6144-150x112.jpg] в кеш, так как после удаления просроченных записей кеша было недостаточно свободного места - рассмотрите возможность увеличения максимального размера кеша
Я не указал никаких конкретных настроек ресурса, и я не получил этого для 7.0.52.
Я нашел упоминание об этом при запуске в отчете об ошибке, который предположительно был исправлен. Для меня это происходит не при запуске, а постоянно при запросе ресурса.
У кого-нибудь еще есть эта проблема?
Пытаюсь хотя бы просто отключить кеш, но не могу найти пример того, как указать не использовать кеш. Атрибуты ушли из контекста в Tomcat версии 8. Попробовали добавить ресурс, но не смогли правильно настроить конфигурацию.
<Resource name="file"
cachingAllowed="false"
className="org.apache.catalina.webresources.FileResourceSet"
/>
Спасибо.
Ответы:
В вашем
$CATALINA_BASE/conf/context.xml
блоке добавления ниже перед</Context>
Для получения дополнительной информации: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
источник
У меня была такая же проблема при обновлении с Tomcat 7 до 8: непрерывный большой поток предупреждений журнала о кешировании.
1. Краткий ответ
Добавьте это в
Context
элемент xml вашего$CATALINA_BASE/conf/context.xml
:Таким образом, по умолчанию
10240
(10 мегабайт), поэтому установите размер больше, чем это. Затем настройте оптимальные настройки, при которых предупреждения исчезают. Обратите внимание, что предупреждения могут появиться снова при повышенном трафике.1.1 Причина (краткое объяснение)
Проблема вызвана тем, что Tomcat не может достичь своего целевого размера кэша из-за записей кеша, которые меньше TTL этих записей. Таким образом, у Tomcat не было достаточно записей в кеше, срок действия которых мог истечь, потому что они были слишком свежими, поэтому он не мог освободить достаточно кеша и, таким образом, выводил предупреждения.
Проблема не возникла в Tomcat 7, потому что Tomcat 7 просто не выводил предупреждения в этой ситуации. (Заставляет нас с вами использовать плохие настройки кеша без уведомления.)
Проблема возникает при получении относительно большого количества HTTP-запросов на ресурсы (обычно статических) за относительно короткий период времени по сравнению с размером и TTL кеша. Если кеш достигает своего максимума (по умолчанию 10 МБ) с более чем 95% своего размера со свежими записями в кеше (свежие означает менее 5 секунд в кеше), вы получите предупреждающее сообщение для каждого веб-ресурса, который пытается Tomcat. загрузить в кеш.
1.2 Дополнительная информация
Используйте JMX, если вам нужно настроить cacheMaxSize на работающем сервере без его перезагрузки.
Самым быстрым решением будет полное отключение cache :
<Resources cachingAllowed="false" />
, но это неоптимально, поэтому увеличьте cacheMaxSize, как я только что описал.2. Длинный ответ
2.1 Справочная информация
WebSource файл или каталог в веб - приложении. По соображениям производительности Tomcat может кэшировать веб-источники. Максимум кэш статического ресурса (все ресурсы в целом) является по умолчанию 10240 кбайт (10 мегабайт). WebResource загружается в кеш, когда запрашивается webResource (например, при загрузке статического изображения), затем он называется записью кеша. Каждая запись кэша имеет TTL (время жизни), то есть время, в течение которого записи кэша разрешено оставаться в кэше. Когда TTL истекает, запись кэша может быть удалена из кеша. Значение cacheTTL по умолчанию составляет 5000 миллисекунд (5 секунд).
О кешировании можно сказать больше, но это не имеет отношения к проблеме.
2.2 Причина
Следующий код из класса Cache подробно показывает политику кэширования:
При загрузке webResource код вычисляет новый размер кеша. Если рассчитанный размер больше максимального размера по умолчанию, необходимо удалить одну или несколько кэшированных записей, иначе новый размер превысит максимальный. Таким образом, код вычислит "targetSize", который представляет собой размер, при котором кэш хочет оставаться в пределах (как оптимальный), который по умолчанию составляет 95% от максимума. Для достижения этого targetSize записи должны быть удалены / исключены из кеша. Это делается с помощью следующего кода:
Таким образом, запись в кеше удаляется, когда истекает ее TTL, а targetSize еще не достигнут.
После попытки освободить кеш путем удаления записей из кеша код выполнит следующее:
Поэтому, если после попытки освободить кеш, размер по-прежнему превышает максимальный, будет показано предупреждающее сообщение о невозможности освободить:
2.3 Проблема
Итак, как говорится в предупреждающем сообщении, проблема в
Если ваше веб-приложение загружает много некэшированных веб-ресурсов (около максимального размера кеша, по умолчанию 10 МБ) в течение короткого времени (5 секунд), вы получите предупреждение.
Заблуждение заключается в том, что Tomcat 7 не отображал предупреждения. Это просто вызвано этим кодом Tomcat 7:
в сочетании с:
Таким образом, Tomcat 7 просто не выводит никаких предупреждений, когда не может освободить кеш, тогда как Tomcat 8 выводит предупреждение.
Итак, если вы используете Tomcat 8 с той же конфигурацией кэширования по умолчанию, что и Tomcat 7, и вы получили предупреждения в Tomcat 8, то ваши (и мои) настройки кэширования Tomcat 7 работали плохо без предупреждения.
2.4 Решения
Есть несколько решений:
2.4.1. Увеличить кеш (рекомендуется)
Как описано здесь: http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
Путем добавления
<Resources cacheMaxSize="XXXXX" />
внутриContext
элемента в$CATALINA_BASE/conf/context.xml
, где «XXXXX» означает увеличенный размер кэша, указанный в килобайтах. По умолчанию 10240 (10 мегабайт), поэтому установите размер больше этого.Вам нужно будет настроить оптимальные настройки. Обратите внимание, что проблема может вернуться, когда у вас внезапно увеличится количество запросов трафика / ресурсов.
Чтобы избежать перезагрузки сервера каждый раз, когда вы хотите попробовать новый размер кеша, вы можете изменить его без перезапуска с помощью JMX.
Чтобы включить JMX , добавьте это
$CATALINA_BASE/conf/server.xml
вServer
элемент:,<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="6767" rmiServerPortPlatform="6768" />
загрузитеcatalina-jmx-remote.jar
с https://tomcat.apache.org/download-80.cgi и вставьте$CATALINA_HOME/lib
. Затем используйте jConsole (поставляется по умолчанию с Java JDK) для подключения через JMX к серверу и просмотрите настройки для увеличения размера кеша во время работы сервера. Изменения в этих настройках должны немедленно вступить в силу.2.4.2. Понизьте TTL (не рекомендуется)
Уменьшите
cacheTtl
значение менее чем на 5000 миллисекунд и настройтесь на оптимальные настройки.Например:
<Resources cacheTtl="2000" />
Фактически это сводится к тому, что кэш в оперативной памяти заполняется без его использования.
2.4.3. Отключить предупреждения журнала кеширования (не рекомендуется)
Настройте ведение журнала, чтобы отключить средство ведения журнала для
org.apache.catalina.webresources.Cache
.Для получения дополнительной информации о входе в Tomcat: http://tomcat.apache.org/tomcat-8.0-doc/logging.html
2.4.4. Отключить кеш
Вы можете отключить кеш, установив
cachingAllowed
значениеfalse
.<Resources cachingAllowed="false" />
Хотя я помню, что в бета-версии Tomcat 8 я использовал JMX для отключения кеша. (Не знаю, почему именно, но может возникнуть проблема с отключением кеша через server.xml.)
источник
У вас есть больше статических ресурсов, для которых есть место в кеше. Вы можете сделать одно из следующего:
Дополнительные сведения см. В документации по этим параметрам конфигурации.
источник
Это не решение в том смысле, что оно не устраняет условия, вызывающие появление сообщения в журналах, но сообщение можно подавить, добавив следующее к
conf/logging.properties
:Это отфильтровывает журналы «Невозможно добавить ресурс», которые находятся на уровне ПРЕДУПРЕЖДЕНИЕ.
На мой взгляд, a
WARNING
- это не обязательно ошибка, которую необходимо устранить, но при желании ее можно игнорировать.источник