Можем ли мы обслуживать статические файлы из Tomcat FASTER, а не из NginX / Apache? - PullRequest
0 голосов
/ 19 мая 2019

Следующие данные были получены при тестировании на моем собственном компьютере с Windows (SSD) на localhost. Когда я загружаю статический контент из Nginx, я получаю до 120-140 Мбит / с (я уверен, что он может быть оптимизирован и дальше. Nginx фактически заявляет, что может достичь пропускной способности до 0,98 Гбит / с). И это было сделано с почти незначительным увеличением потребления ЦП / памяти. Я попытался сделать то же самое в Tomcat, и максимальная скорость при загрузке файлов до 25 Мбит / с. Кроме того, это потребляет 15-25% использования процессора в соответствии с диспетчером задач. На моей машине установлен SSD, поэтому нет, чтение файла не занимает много времени и не увеличивает использование процессора.

Может ли быть улучшена часть, обслуживающая файлы? I.E обеспечивает более высокую скорость загрузки при меньшем потреблении ресурсов процессора.

<Connector port="29022" protocol="org.apache.coyote.http11.Http11Nio2Protocol" useSendfile="true" connectionTimeout="300000"/>

Я использую разъем Nio2. Должен ли я изменить настройки разъема или использовать разъем Nio / apr?

Все запросы на загрузку файлов делегируются в пул потоков с помощью асинхронного вызова сервлета: request.setAttribute ("org.apache.catalina.ASYNC_SUPPORTED", true);

Потоки из пула потоков (размер пула потоков равен 2) будут обрабатывать каждый запрос циклическим образом в цикле. В каждой итерации цикла выполняется следующий код для отправки около 8 КБ (8192 байта).

if(bytesSent < toBeServedFileSize){
    if(!buffer.hasRemaining()){
        buffer.clear();
        fileChannel.read(buffer,bytesSent);
        buffer.flip();
    }
    int bytesToWrite = Math.min(buffer.remaining(), streamPacketSize);
    byte[] byteAr = new byte[bytesToWrite];
    for (int i = 0 ; i < bytesToWrite ; i++){byteAr[i] = buffer.get();}
    //I'm guessing below is the most cpu intensive line
    os.write(byteAr);
    //I am guessing above is the most cpu intensive line
    bytesSent += bytesToWrite;
}

Целью этого упражнения является как аутентификация, так и авторизация запросов на загрузку файлов. Я думаю, что обслуживание статического контента из Apache / NginX не имеет хороших решений для удовлетворения этого требования. Предложения и альтернативные решения приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...