Следующие данные были получены при тестировании на моем собственном компьютере с 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 не имеет хороших решений для удовлетворения этого требования. Предложения и альтернативные решения приветствуются.