[CLOSED] //cетевые карты, сокеты и стримы

kill-still

Если вкратце описывать проблему, то я сейчас исследую предельные возможности оптимизации скорости отдачи страницы.
Например, томкат сейчас отдаёт тяжёлую статическую страницу страницу с данными(5мб) скажем за 280мс.
Я написал сокет сервер, который не разбирая гет запрос сразу без разговоров отдаёт страницу в виде byte[] в оутпут стрим сокета. Это происходит за 250мс. Смысловая часть кода:

OutputStream out = new BufferedOutputStream(socket.getOutputStream;
out.write(data); // data - это byte[]
// out.flush;
socket.close;

Внутри там вызывается

class SocketOutputStream extends FileOutputStream
{
/**
* Writes to the socket.
*/
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;

У меня два вопроса:
1) можно ли ещё как-то ускорить процесс, или 250мс это предел к которому надо стремиться?
Ведь сетевая карта 1Гб, т.е. 5мб должны отдаваться ~ за 40мс(на самом деле немного дольше, т.к. там вроде ~20% трафика - служебная информация)?
2) где почитать про то, что там внутри происходит на нативном и апаратном уровне, и как оно всё устроено.
Буду благодарен за подсказки, в каком направлении копать дальше.

katrin2201

280 \ 250мс - это как и на чьей стороне меряется?
Еще важно мерять все то же самое с параллельными запросами. Тут обычно async io рулит. Это тебе к netty.

kill-still

таймлайн в хроме и фаербаге
ну и в профайлере в яве такие же значения
очень подозрительно, что с диска в среднем напрямую в браузер тот же файл тоже 250мс грузится. :confused:

kill-still

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

Marinavo_0507

не измеряй браузером для начала

Hastya

- Служебной информации гораздо больше, чем 20%
- От методики измерения сильно зависит
- Если очень хочется заполнить гигабитовый линк, то бери уж Tomcat c APR, выключай буферизацию и используй keep-alive
- А главное зачем?

kill-still

а чем? //я с вёбом 2ой день пока только работаю

kill-still

как зачем - чтобы клиентам удобно было. гораздо приятнее когда файлик за 100мс открывается, нежели за 3.5сек.

katrin2201

Твой сокет сервер потоки на каждого клиента рождает, или все в одном фигачит? Весь код целиком надо было постить. Ну и что ты там в профайлере увидел - тоже скриншот бы.
А вообще, видимо, эти 250мс уходят не туда, куда ты думаешь. Попробуй поиграться с другими размерами файлов.

kill-still

На каждого, но я один раз F5 жму и жду пока отдаст до конца.
Ёпт, как так не туда, если время в браузере с этим совпадает?:
          
System.out.println(socket.toString;
long start = System.currentTimeMillis;
OutputStream out = new BufferedOutputStream(socket.getOutputStream;
out.write(data);
out.flush;
socket.close;
long finish = System.currentTimeMillis;
long dur = finish - start;
System.out.println(" duration " + dur);

при других размерах линейно от объёма время растёт

yroslavasako

тайминг собственно пакетов удобно проверяется tcpdump'ом

kill-still

Я тут случайно обнаружил, что он два гет запроса шлёт на самом деле - html и фавикон, и я на оба отвечаю. Добавил проверку на то, что в гете пришло - фаерфокс стал в два раза быстрее файл забирать, а в хроме всё также осталось. Хрень какая-то. :(

kill-still

1) Поставил APR, с буферезацией пока ещё не разобрался, но томкат теперь тоже за 250мс отдвавть начал.
2) никак не пойму, почему хром дольше файл забирает:
хром:

Socket[addr=/0:0:0:0:0:0:0:1,port=57454,localport=8082]
duration 54
Socket[addr=/0:0:0:0:0:0:0:1,port=57455,localport=8082]
duration 52
Socket[addr=/0:0:0:0:0:0:0:1,port=57456,localport=8082]
duration 46
Socket[addr=/0:0:0:0:0:0:0:1,port=57457,localport=8082]
duration 47
Socket[addr=/0:0:0:0:0:0:0:1,port=57458,localport=8082]
duration 43

фаерфокс:

Socket[addr=/0:0:0:0:0:0:0:1,port=57461,localport=8082]
duration 25
Socket[addr=/0:0:0:0:0:0:0:1,port=57462,localport=8082]
duration 24
Socket[addr=/0:0:0:0:0:0:0:1,port=57463,localport=8082]
duration 20
Socket[addr=/0:0:0:0:0:0:0:1,port=57464,localport=8082]
duration 26

Marinavo_0507

а чем? //я с вёбом 2ой день пока только работаю
ну если ты написал программу, которая пихает данные в сокет, то можно теперь написать аналогичную, которая их с другой стороны забирает

katrin2201

Ээээ. Я правильно понимаю, что на одно F5 в браузере у тебя генерится по 5 посылок data[]?..
Если на один Ф5 одна duration, то тогда как у тебя "время в браузере" совпадает с "профайлингом"?

kill-still

Нет, просто время отдачи меняется в некоей дельте, привёл в качестве примера несколько попыток.

IvladV71

а зачем ты отдаёшь статику томкатом?

kill-still

Спасибо за совет, написал. Томкат с/без APR отдаёт 5мб за 41-43мс (с ARR вроде на 1мс быстрее, но хз сокетсервер который я написал - за 38-40мс, что близко к расчётной максимальной скорости. Т.е. дело в браузерах. Кстати, быстрее всех страницу (судя по профайлеру) забирает IE, как раз за те же 40-42мс.
Оставить комментарий
Имя или ник:
Комментарий: