Настройка производительности Tomcat

задняя часть Tomcat

1. Подведите итоги предыдущего дня

Из раздела тестирования производительности «Дня 3» мы узнали несколько важных показателей, определяющих тестирование производительности, а именно:

ü Пропускная способность

ü   Responsetime

ü   Cpuload

ü   MemoryUsage

Так же в третий день обучения мы внесли некоторые оптимизации в Apache для оптимизации показаний вышеперечисленных четырех основных индикаторов, затем был настроен наш Apache, а также внесены соответствующие коррективы в наш Tomcat.После сегодняшнего курса ваш "котенок" будет действительно "летают" в то время, так что прочитайте внимательно.С одной стороны, эта статья используется для того, чтобы рассказать человеку, который когда-то написал "Как Tomcat может выдержать 1000 пользователей" С одной стороны, это расширение этого оригинала текст, потому что она была решена после применения знания исходного текста к двум связанным крупным проектам:

1) иметь большее количество одновременных пользователей

2) Достигнута хорошая производительность и улучшения (средняя производительность системы увеличена в 20 раз, а экстремальная транзакция до 80 раз).

Также стоит упомянуть, что «котенок», который мы использовали в проекте, на тот момент работал на 32-битном компьютере, то есть наша JVM была ограничена максимальным объемом памяти в 2 Гб, и она уже успела столкнуться с «летающими ". . . . . . Если запустить этого "котёнка" под 64-битной машиной. . . . . . Каждый может себе представить, какой эффект будет получен? Пожалуйста, настройте его подробно ниже!

 

Во-вторых, все основано наОптимизация JVM (памяти)

2.1 32Сравнение JVM в 64-битной ОС и 64-битной ОС

Наши общие разработчики в основном используют 32-битные системы Windows, что приводит к серьезной проблеме: ограничению памяти 32-битных систем Windows.Давайте сначала посмотрим на сравнительную таблицу:

Операционная система

Биты операционной системы

лимит памяти

Решение

Winxp

32

4GB

супер кролик

Win7

32

4GB

Можно установить через /PAE

Win2003

32

Может пробить 4GB до 16GB

Должен быть установлен расширенный сервер Win2003 и пропатчен SP2.

Win7

64

неограниченный

Сколько памяти можно вставить в машину, сколько системной памяти можно поддерживать

Win2003

64

неограниченный

Сколько памяти можно вставить в машину, сколько системной памяти можно поддерживать

Linux

64

неограниченный

Сколько памяти можно вставить в машину, сколько системной памяти можно поддерживать

Unix

64

неограниченный

Сколько памяти можно вставить в машину, сколько системной памяти можно поддерживать

После того, как вышеуказанная проблема решена, мы сталкиваемся с новой проблемой, ограничением памяти JVM под 32-битной системой: она не может пробить 2 ГБ памяти, даже если ваша машина оснащена 8 ГБ-16 ГБ памяти под Win2003 Advanced Server, и ваш JAVA может использовать только 2 ГБ памяти.

На самом деле, я всегда хотел порекомендовать вам использовать операционную систему Linux или Mac и установить 64-битную, потому что в конце концов мы используем ее для разработки, а не для игр, а Java происходит из Unix и принадлежит Unix ( Линукс работает только на ПК) Сам Unix).

Поэтому многие разработчики работают на 32-битных системах Win32 и даже развертывают 32-битные системы Win32 в производственной среде.В настоящее время, если вы хотите оптимизировать свой Tomcat, вы должны обратить внимание на некоторые навыки.В 64-битной операционной системе ни системная память, ни JVM не подпадают под такое ограничение в 2 ГБ.

Оптимизация Tomcat разделена на две части:

ü Параметр оптимизации в командной строке запуска Tomcat — оптимизация JVM.

ü Оптимизация параметров самого контейнера Tomcat (этот очень похож на ApacheHttp Server)

Первое, о чем стоит поговорить в этом разделе, — это параметры оптимизации в командной строке запуска Tomcat.

Сначала Tomcat запускается на JVM, потому что его запуск на самом деле представляет собой просто командную строку Java.Во-первых, нам нужно настроить командную строку запуска JAVA.

нужно знать, это:

Обсуждаемая здесь оптимизация JVM основана на версии Oracle Sun jdk1.6 и выше, другие JDK или более ранние версии JDK неприменимы.

2.2 TomcatОптимизация параметров линии запуска

Параметры запуска Tomcat находятся в каталоге установки tomcat \bin каталоге.Если вы используете операционную систему Linux, это файл catalina.sh.Если вы работаете в операционной системе Windows, вам необходимо изменить файл catalina.bat. Откройте файл, как правило, заголовок файла представляет собой набор текста комментария, заключенного в ##, найдите последний абзац текста комментария, например:

# $Id: catalina.sh 522797 2007-03-27 07:10:29Z fhanik $

# -----------------------------------------------------------------------------

 

# OS specific support.  $var _must_ be set to either true or false.

Введите возврат каретки и добавьте следующие параметры

Параметры запуска tomcat в системе Linux

export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

Параметры запуска tomcat в системе Windows

set JAVA_OPTS=-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true

Параметров выше очень много.Возможно кто-то никогда не видел команду запуска tomcat с таким количеством параметров.Конечно эти параметры есть только на моей машине и могут вам не подойти,особенно значение после параметра обязательно. Установите в соответствии с вашей реальной ситуацией.

Объяснение параметра:

ü   -server

Мне все равно, каковы ваши причины, пока ваш кот работает в производственной среде, этот параметр должен быть добавлен мне

Поскольку tomcat по умолчанию работает в режиме, называемом java-client, сервер означает, что ваш tomcat работает в режиме реального производства, а это означает, что когда ваш tomcat работает в режиме сервера, он будет иметь: большую и более высокую производительность одновременной обработки, более быструю и более эффективный механизм сборки мусора JVM, можно получить больше нагрузки и пропускной способности. . . Четное. . . И больше. . .

Запомни Y для меня, иначе этот -сервер не добавится, будет порка.

ü -Xms–Xmx

То есть память JVM настроена. Лучше всего установить Xms и Xmx на одно и то же значение. Некоторые люди говорят, что Xms — это минимальное значение, а Xmx — максимальное значение, что не очень хорошо. гуманный и научный. человеческая природа? наука? твоя голова.

Рассмотрим этот сценарий:

По мере того, как количество параллелизма в системе увеличивается, ее использование памяти постепенно растет. Когда оно достигает наивысшей точки, оно больше не может расти. Оно начинает падать. Не думайте, что это падение — хорошо. Цена такова, что процессор начинает работать на высокой скорости для сбора мусора.В это время это даже приведет к тому, что ваша система «застрянет».Вы работаете хорошо, и вдруг веб-страница кажется мертвой на несколько секунд или даже десять секунд , так как выполняется сборка мусора JVM.

Поэтому мы установили эти два одинаковыми в начале, чтобы Tomcat мог полностью использовать эффективность системы, чтобы максимизировать параметры при ее запуске.Этот принцип такой же, как необходимость установки размера минпула и макспула size в пуле jdbcconnection до числа.

Как узнать, что моя JVM может использовать максимальное значение? Стрелять в голову? нет!

При установке максимальной памяти, а именно значения Xmx, откройте командную строку и введите следующую команду:

Посмотрите, информация о версии JDK может отображаться нормально, указывая на то, что вы можете использовать это значение. Разве это не означает, что 32-битная система может использовать до 2 ГБ памяти? То есть: 2048м, попробуем

Могу я? Не может! Не говорите 2048м, давайте поменьше, как насчет 1700м

Эй, даже не 1700 м, не говоря уже о 2048 м, 2048 м - это просто теоретическое значение, позвольте мне сказать так, у меня есть несколько машин, некоторые машины подходят с -Xmx1800, а некоторые машины могут работать только до -Xmx1500m.

Поэтому при установке значений -Xms и -Xmx вы должны не забыть сначала протестировать этот способ, иначе ваш кот не сможет снова встать, добавив его прямо в командную строку запуска tomcat.Просто кот.

ü –Xmn

Установите размер молодого поколения на 512 м. Размер всей кучи = размер молодого поколения + размер старого поколения + размер постоянного поколения. Постоянное поколение обычно фиксируется на уровне 64 м, поэтому после увеличения молодого поколения размер старого поколения будет уменьшен. Это значение сильно влияет на производительность системы, и Sun официально рекомендует устанавливать его равным 3/8 всей кучи.

ü   -Xss

Относится к установке размера стека каждого потока. Это зависит от вашей программы, чтобы увидеть, сколько памяти должен занимать поток, сколько потоков может выполняться одновременно и т. д. Как правило, установить больше 1M непросто, иначе легко появится нехватка памяти.

ü   -XX:+AggressiveOpts

Как следует из названия (агрессивно), включение этого параметра заставит вашу JVM использовать последние добавленные методы оптимизации (если таковые имеются) при каждом обновлении версии JDK.

ü   -XX:+UseBiasedLocking

Включите оптимизированную блокировку потока, мы знаем, что на нашем сервере приложений каждый HTTP-запрос представляет собой поток, некоторые запросы короткие, а некоторые запросы длинные, будет явление очереди запросов, и даже произойдет блокировка потока, эта оптимизация lock включает автоматическое оптимальное распределение обработки потоков на вашем сервере приложений.

ü   -XX:PermSize=128M-XX:MaxPermSize=256M

JVM использует -XX:PermSize для установки начального значения памяти без кучи, по умолчанию это 1/64 физической памяти;

При экспорте файла с большим объемом данных обязательно установите эти два значения, иначе возникнет ошибка переполнения памяти.

Максимальный размер памяти без кучи задается XX:MaxPermSize, по умолчанию это 1/4 физической памяти.

Затем, если физическая память составляет 4 ГБ, то 1/64 соответствует 64 МБ, что является значением по умолчанию PermSize, которое является начальным размером памяти бессмертного поколения;

Четверть составляет 1024 МБ, что является размером MaxPermSize по умолчанию.

ü   -XX:+DisableExplicitGC

Явные вызовы System.gc() в программном коде запрещены. Я видел два первоклассных проекта, которые вручную вызывают System.gc() в конце операции DAO. Я чувствую, что это, кажется, решает их проблему нехватки памяти. Плата за это заключается в том, что время отклика системы серьезно сокращается. , так же, как Принцип моего объяснения в Xms и Xmx одинаков Вызов GC таким образом вызовет сильное колебание JVM системы, и производительность никуда не денется!

ü   -XX:+UseParNewGC

Для молодого поколения используется многопоточная параллельная коллекция, которая работает быстрее.

ü   -XX:+UseConcMarkSweepGC

То есть CMS gc. Эта функция доступна только в jdk1.5 и последующих версиях. Она использует триггер оценки gc и триггер занятости кучи.

Мы знаем, что частая сборка мусора вызовет взлеты и падения JVM и, таким образом, повлияет на эффективность системы.Поэтому после использования CMS GC время отклика каждого GC очень мало при увеличении количества GC.Например, использование Сборщик мусора CMS После наблюдения за jprofiler сборщик мусора запускается много раз, и каждый сборщик мусора занимает всего несколько миллисекунд.

ü   -XX:MaxTenuringThreshold

Установить максимальный возраст мусора. Если установлено значение 0, объекты молодого поколения напрямую входят в старое поколение, не проходя через область Survivor. Для приложений с большим количеством старых поколений можно повысить эффективность. Если для этого значения установлено большее значение, объект молодого поколения будет реплицироваться несколько раз в области Survivor, что может увеличить время выживания объекта в молодом поколении и увеличить вероятность повторного использования в молодом поколении.

Установка этого значения является идеальным значением, полученным после мониторинга локальным jprofiler, и не может быть обобщена и скопирована.

ü   -XX:+CMSParallelRemarkEnabled

В случае использования UseParNewGC постарайтесь уменьшить время маркировки

ü   -XX:+UseCMSCompactAtFullCollection

В случае использования параллельного gc, чтобы предотвратить фрагментацию памяти, живой объект дефрагментируется, чтобы уменьшить фрагментацию памяти.

ü   -XX:LargePageSizeInBytes

Указывает размер страницы подкачки кучи Java.

ü   -XX:+UseFastAccessorMethods

методы get, set преобразованы в собственный код

ü   -XX:+UseCMSInitiatingOccupancyOnly

Указывает параллельному сборщику начать сбор только после того, как старое поколение использовало инициализированный масштаб.

ü   -XX:CMSInitiatingOccupancyFraction=70

CMSInitiatingOccupancyFraction, эта настройка параметра имеет отличные навыки, в основном удовлетворяющие(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=XmnТам не будет продвижение не удалось. В моем приложении Xmx — 6000, Xmn — 512, затем Xmx-Xmn — 5488 мегабайт, то есть у старого поколения 5488 мегабайт CMSInitiatingOccupancyFraction=90 означает, что старое поколение начинает выполняться, когда старое поколение заполнено на 90%. Параллельная сборка мусора (CMS), на этот раз также Оставшиеся 10% пространства составляют 5488*10%=548 МБ, так что даже если все объекты в Xmn (то есть 512 МБ в молодом поколении) переместить в старое поколение, места в 548 МБ будет достаточно, так поскольку приведенные выше требования соответствуют формуле, при сборке мусора не произойдет сбой продвижения;

Поэтому установка этого параметра должна быть связана с Xmn.

ü   -Djava.awt.headless=true

Этот параметр обычно используется в конце. Функция этого параметра заключается в следующем. Иногда мы будем использовать некоторые инструменты построения диаграмм, такие как jfreechart, в нашем проекте J2EE, который используется для вывода потоков, таких как GIF/JPG, на веб-страницах. winodws, как правило, наш сервер приложений не столкнется с какими-либо проблемами при выводе графики, но в среде linux/unix мы часто сталкиваемся с исключением, из-за которого изображения хорошо отображаются в среде разработки winodws, но в среде linux/unix. , его нельзя отобразить ниже, поэтому добавьте этот параметр, чтобы избежать такой ситуации.

Вышеупомянутая конфигурация может в основном достичь:

ü Время отклика системы увеличивается

ü Скорость перезапуска JVM увеличена, не влияя на скорость отклика системы

ü Максимальное использование памяти JVM

ü Блокировка резьбы сведена к минимуму

2.3 TomcatВнутриконтейнерная оптимизация

Ранее мы оптимизировали команды при запуске Tomcat, увеличили количество доступных JVM системы, эффективность сборки мусора и блокировки потоков, повысили эффективность отклика системы.Есть еще один очень важный показатель.Его мы не оптимизировали, то есть пропускную способность .

Помните, что мы говорили в третий день обучения, сама система может обрабатывать 1000, а вы по умолчанию можете обрабатывать только 25 без оптимизации и настройки. Итак, давайте посмотрим на оптимизацию внутри контейнера Tomcat.

Откройте файл каталог установки tomcat\conf\server.xml и найдите эту строку:

<Connector port="8080" protocol="HTTP/1.1"

В этой строке задаются параметры производительности нашего контейнера tomcat. Обычно она имеет значение по умолчанию. Этих значений по умолчанию далеко недостаточно для нашего использования. Давайте посмотрим на измененную конфигурацию этого раздела:

<Connector port="8080" protocol="HTTP/1.1"

          URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"

          enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"

          acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5"

          useURIValidationHack="false"

                                               compression="on" compressionMinSize="2048"

                                               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

               redirectPort="8443"

/>

Какой большой. . . . . .

Неважно, я объясню по одному

URIEncoding="UTF-8"

Очень удобно разрешить tomcat парсить url файлов с китайскими названиями, в отличие от apache там есть mod_encoding, который нужно компилировать вручную.

ü   maxSpareThreads

maxSpareThreads означает, что если количество бездействующих потоков больше заданного числа, эти потоки будут прерваны, что уменьшит общее количество потоков в пуле.

ü   minSpareThreads

Минимальное количество запасных потоков, количество инициализированных потоков при запуске tomcat.

ü   enableLookups

Эта функция аналогична HostnameLookups в Apache, но отключена.

ü   connectionTimeout

connectionTimeout — время ожидания сетевого подключения в миллисекундах.

ü   maxThreads

maxThreads Tomcat использует потоки для обработки каждого получаемого запроса. Это значение представляет максимальное количество потоков, которые может создать Tomcat, то есть максимальное количество параллелизма.


ü   acceptCount

acceptCount заключается в том, что когда количество потоков достигает maxThreads, последующие запросы будут помещены в очередь ожидания. acceptCount — это размер очереди. Если очередь заполнена, соединение будет отклонено напрямую.


ü maxProcessors и minProcessors

В Java поток — это путь выполнения программы, сегмент кода в программе, который не имеет ничего общего с другими потоками управления и может выполняться независимо. Они используют одно и то же адресное пространство. Многопоточность помогает программистам писать эффективные программы, максимально использующие ЦП, сводящие к минимуму время простоя и принимающие больше запросов.

Обычно Windows около 1000, Linux около 2000.

ü   useURIValidationHack

Давайте посмотрим на кусок исходного кода в tomcat:

security

        if (connector.getUseURIValidationHack()) {

            String uri = validate(request.getRequestURI());

            if (uri == null) {

                res.setStatus(400);

                res.setMessage("Invalid URI");

                throw new IOException("Invalid URI");

            } else {

                req.requestURI().setString(uri);

                // Redoing the URI decoding

                req.decodedURI().duplicate(req.requestURI());

                req.getURLDecoder().convert(req.decodedURI(), true);

            }

        }

Видно, что если для useURIValidationHack установлено значение «false», это может уменьшить количество ненужных проверок некоторых URL-адресов и уменьшить накладные расходы.

ü   enableLookups="false"

Чтобы устранить влияние DNS-запроса на производительность, мы можем отключить DNS-запрос, изменив значение параметра enableLookups в файле server.xml.

ü   disableUploadTimeout

Похоже на keeyalive в Apache

ü Настройте функцию сжатия gzip (сжатие HTTP) для Tomcat

compression="on" compressionMinSize="2048"             

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

Сжатие HTTP может значительно повысить скорость просмотра веб-сайтов. Его принцип заключается в том, что после того, как клиент запрашивает веб-страницу, файл веб-страницы сжимается с сервера и загружается клиенту. По сравнению с обычным процессом просмотра HTML, CSS, Javascript, Text, он может сэкономить около 40% трафика. Что еще более важно, он может сжимать динамически созданные веб-страницы, включая CGI, PHP, JSP, ASP, Servlet, SHTML и т. д., с удивительной эффективностью сжатия.

1)compression="on" включает функцию сжатия

2)compressionMinSize="2048" Включить размер сжатого выходного содержимого, который по умолчанию равен 2 КБ.

3) noCompressionUserAgents="gozilla, traviata" Для следующих браузеров сжатие не включено

4) CompressableMimeType="text/html,text/xml" Тип сжатия

Наконец, не забудьте добавить ту же конфигурацию к порту 8443, потому что, если мы перейдем к протоколу https, мы будем использовать конфигурацию порта 8443, верно?

<!--enable tomcat ssl-->

    <Connector port="8443" protocol="HTTP/1.1"

               URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"

          enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"

          acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5"

          useURIValidationHack="false"

                    compression="on" compressionMinSize="2048"

                    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

                SSLEnabled="true"

           scheme="https" secure="true"

           clientAuth="false" sslProtocol="TLS"

           keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa"

      />

Что ж, все оптимизации Tomcat добавлены. В сочетании с оптимизацией производительности Apache на третий день наша архитектура может «летать».Конечно, здесь упоминаются какие-либо шаги по оптимизации базы данных, но только с этими двумя шагами наша система уже имеет большой прирост.

Приведу реальный пример: в последнем проекте, после 4 раундов тестирования производительности, первый раунд заключался в поиске проблемы, второй раунд — оптимизация apache+tomcat/weblogic, третий раунд — оптимизация кластера, а четвертый раунд должен был сделать оптимизацию кластера.Это оптимизация sql и кодов.

Во сколько раз мы улучшили свои показатели к моменту выхода во второй раунд? Давайте посмотрим на скриншот загрузчика:


Первая колонка слева — это отчет о стресс-тесте первого раунда без какой-либо настройки.

Столбец справа — это отчет о стресс-тестах, полученный после оптимизации Apache и Tomcat.

Давайте посмотрим, насколько это увеличилось? Это только улучшение без изменения кода, и теперь я понимаю, что хороший тюнинг - это

Насколько важны Apache и Tomcat? Если вы добавите код позади, настройку SQL, настройку базы данных. . . . . . Итак, в моем последнем проекте был экстремальный пример, когда производительность одной транзакции (будь то пропускная способность, время отклика) была улучшена в 80 раз.