Задайте лимит на опашката чрез jetty.xml в приставката Jetty 9 Maven

Пулът от нишки в Jetty по подразбиране се изпълнява с неограничена опашка, след като пулът от нишки се запълни. Бих искал да поставя ограничение за размера на опашката. Има конструктор за BlockingArrayQueue, който приема стойност maxCapacity, но не виждам начин да го извикам с помощта на jetty.xml. От Jetty 9 няма настройка за пула от нишки в org.eclipse.jetty.server.Server, мога само да получа препратка към пула от нишки, който вече е създаден, и да го променя (вижте този отговор). И сетерът за полето на опашката в QueuedThreadPool хвърля UnsupportedOperationException, казвайки да се използва инжектиране на конструктор. Но това е невъзможно, ако мога само да променя пула от нишки, а не да задам нов на екземпляра на сървъра. Опитът за дефиниране на пула от нишки като аргумент на конструктор дава следното предупреждение:

2014-09-22 13:15:13.688:WARN:oejx.XmlConfiguration:main: Игнориран аргумент: | 200501000| 6000| невярно|

Това е с Jetty Maven Plugin v9.2.2.v20140723. Ето конфигурацията в моя pom.xml:

    <configuration>
      <jettyXml>${basedir}/jetty.xml</jettyXml>
      <stopKey>x</stopKey>
      <stopPort>7999</stopPort>
      <requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">
        <append>true</append>
      </requestLog>
      <webApp>
        <war>${basedir}/target/app</war>
        <contextPath>/app</contextPath>
      </webApp>
      <scanTargets>
        <scanTarget>${basedir}/src/main/webapp/WEB-INF/</scanTarget>
      </scanTargets>
      <reload>manual</reload>
    </configuration>

person Cameron    schedule 19.09.2014    source източник


Отговори (2)


Актуализация: Конструкторът на сървъра е начинът, по който конфигурирате пула от нишки, за съжаление, не можете да конфигурирате сървърния конструктор от jetty-maven-plugin. Това е извън обхвата на плъгина jetty-maven.


ThreadPool в Jetty 9 вече е настроен в Конструктор на екземпляра Server.

С помощта на XML можете да го преконфигурирате, дори е документирано в самия jetty.xml.

Чувствайте се свободни да го промените, просто имайте предвид, че е известно, че обвързаните пулове от нишки причиняват проблеми, ако ограничението е твърде малко.

Ето една удобна формула за салфетки.

Макс. нишки = (((брой процесорни ядра) * 4) * (брой конектори)) + (макс. едновременни заявки)

На практика повечето стойности под 400 ще ви създадат проблеми дори на леко натоварени сървъри. Не приемайте това твърдение като значение, че 400 е добра отправна точка, това би било крайно некоректно от ваша страна, трябва да тествате и наблюдавате и да продължите да коригирате, докато не намерите щастлива стойност за вашия сървър. (Не забравяйте да тествате за скокове на натоварване и какво се случва, когато вашите бази данни се повредят)

Мисленето, че трябва да зададете горни граници за ефективност, е форма на преждевременна оптимизация.

Вярно е, че QueuedThreadPool, който Jetty използва, е необвързан, но също така се почиства и премахва нишки от пула с течение на времето, позволявайки на сървъра да се справя с внезапни натоварвания и да се оттегли, когато натоварването намалее.

Ако неговата памет или други ресурси ви притесняват, знайте, че инсталацията на Jetty по подразбиране работи добре дори на Android 2.3 (Gingerbread) (забележка: Jetty 7 с QTP), Android 4.4 (Jetty 9) и Raspberry Pi (Jetty 7 до 9).

И накрая, как да зададете размера на вашата опашка за приемане.

Конфигурирайте своя ServerConnector (обикновено намерени в etc/jetty-http.xml)

<Set name="acceptQueueSize">40</Set>

Стойността по подразбиране е 0 и се отнася до параметъра backlog в ServerSocketChannel.bind(SocketAddress,int) извикване на най-ниските нива.

person Joakim Erdfelt    schedule 19.09.2014
comment
Благодаря за вашият отговор. Разглеждах възможността за задаване на размера на опашката въз основа на този документ: wiki.eclipse.org/ Jetty/Howto/High_Load, както и при опит за възпроизвеждане на тази грешка в моята кутия за програмисти: bugs.eclipse.org/bugs/show_bug.cgi?id=444031. Както и да е по отношение на действителното актуализиране на пула от нишки, опитах това, което предлага jetty.xml, но получавам това предупреждение: WARN:oejx.XmlConfiguration:main: Ignored arg: ‹Arg name=threadpool›‹New id=threadpool class=org .eclipse.jetty.util.thread.QueuedThreadPool/›‹/Arg› - person Cameron; 23.09.2014
comment
wiki.eclipse.org е за Jetty 7 и 8. не е jetty 9. (както пише в горната част на wiki) - person Joakim Erdfelt; 23.09.2014
comment
Единствената причина за този игнориран аргумент е, ако имате нещо, което конфигурира сървъра, преди този xml да има шанс да се изпълни. (ще са ми необходими подробности за вашето стартиране / конфигурация / ${jetty.base}, за да научите повече). Но това вече е МНОГО извън обхвата на този раздел за коментари. Задайте въпроса си в пощенския списък на jetty-users. - person Joakim Erdfelt; 23.09.2014
comment
Благодаря, няма да взема предвид информацията в Wiki. Но мисля, че опитът да се конфигурира този сървър чрез jetty.xml е в обхвата на този въпрос (докато частта защо може да не е). Актуализирах въпроса, за да бъде по-специфичен за приставката Jetty Maven, тъй като това е, което използвам. Добавих конфигурационната част на плъгина... не съм сигурен какви други подробности има да ви дам, всичко останало е готово. - person Cameron; 23.09.2014
comment
Благодаря, актуализацията отговори на въпроса ми. Изглежда, че не препоръчвате да зададете лимит на опашката за приемане, но това беше препоръчано като възможна стъпка в Коментар 20 от bugs.eclipse.org/bugs/show_bug.cgi?id=444031, така че ще го изпробвам и ще видя дали ще помогне. - person Cameron; 16.10.2014

Сблъскахме се с подобен проблем, при който искахме сървърът да отхвърля заявките, ако всички нишки са заети, вместо да ги постави на опашка за неопределено време.

Мисля, че това е истински въпрос, следният е подходът.

Тъй като не е възможно да замените размера на пула по подразбиране или да въведете в Jetty сървъра. Написахме персонализиран ServerConnector, където можете да зададете размера на опашката или вашия изпълнител за този въпрос.

jetty.addServerCustomizers((Server server) -> {
    LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue< (maxQueueSize);
    ExecutorService exceutorService =
        new ThreadPoolExecutor(minThreads, maxThreads, 1,
            TimeUnit.HOURS, queue);

    // extract host and port from existing connector...
    String host = "0.0.0.0";
    int port = 1900;
    for (Connector c : server.getConnectors()) {
        if (c instanceof ServerConnector) {
            host = ((ServerConnector) c).getHost();
            port = ((ServerConnector) c).getPort();
        }
    }


    ServerConnector connector = new ServerConnector(server, exceutorService, null, null, -1, -1, new HttpConnectionFactory());
    connector.setHost(host);
    connector.setPort(port);
    server.setConnectors(new Connector[] { connector });
}

минуси

1) Тъй като Jetty очаква пул от нишки на опашка, когато опитахме същото, той използваше, за да даде произволни резултати, когато стартирането на сървъра беше неуспешно, въпреки правилните конфигурации. Поведението не беше предвидимо.

2) Тъй като ExecutorService не прилага Threadpool, приставката за събиране на показатели за Jetty може да не работи правилно.

Ще актуализираме този отговор, когато стартираме производството.

person Anshul Sao    schedule 22.01.2017