В общем началось всё с того что я решил написать свой простенький многопоточный HTTP Server. Ну сказано сделано Не ну на скоростях ADSL интернета всё работает как надо, если скорость на отдачу у меня 32 кБ/с то с такой скоростью и закачикается файл на другой стороне инета. Но вот незадача, в локальной сети 100мб/с скорость закачки оказалась 350 кБ/с, да но по идее должно быть 12,5! Тут я вспомнил что в журнале "Сетевые решения" №10 2007 дета я видел статью "Четыре способа увеличить скорость выполнения ваших сетевых приложений под Linux" и одним из способов было увеличение размера TCP окна. Его можно вычислить по след формуле: (Пропускная способность * RTT)/8= Необходимый размер окна Байт, и как не странно с этой формулой соглашается половина сетевых программеров, и наверное все они пишут пол Linux. Потому что для моего случая 100Mb/s*0,001/8=12,5kB Дефолтный размер окна я узнал так: Код (Text): push offset SizeSndByfferSize push offset SndByfferSize push SO_SNDBUF push SOL_SOCKET push hSocket call getsockopt и он равен по крайней мере для моей Windows XP Alternative SP3 2000h Выставил я то что по рассчетам Код (Text): push offset SizeSndByfferSize push offset SndByfferSize push SO_SNDBUF push SOL_SOCKET push hSocket call setsockopt Удивительный результат! Скорость таже... Тогда взял да на абум забацал окно в 1MB, И СВЕРШИЛОСЬ, 9,5MB/s (не 12,5 но тоже не плохо) Так вот опять незадача, када сервер на XP, качаю файл на Server 2003 скорость 9,5MB/s, когда сервер на 2003 качаю на XP скорость опять 350 кБ/с. Так вот по какой же формуле высчитывать размер TCP окна, и почему на Windows Server 2003 изменение окна не дало результатов??? Информации в сети я чтото не нашел...
skyproc Это число имеет малое отношение к реалиям. Из теории СМО и очередей мы знаем что скорость определяется наиболее медленой операцией. Так как самая медленная операция это обработка прерывания или переключения в защищенный режим. То их надо свести к мнимому. Отсюда скорость интерфейса/"число прерываний". Число прерываний выбираем как нравится. Я бы подогнал под число прерываний таймера 62. Теоретически можно и 1000 взять. Но такая большая дискретность ни к чему хорошему не приведет. Так что от 30-100 мне кажется оптимальным вариантом. Напоминает мне это нашу сетку когда качали с FTP. Но суть была такая если сервер коннектился к клиенту то скорость была низкая. А вот если клиент подсоединялся к серверу и сервер начинал отдавать по этому же соединению данные то скорость была 10-11МБайт/с.
Pavia объясни подробней о чём вот здесь идет речь??? Так как самая медленная операция это обработка прерывания или переключения в защищенный режим. То их надо свести к мнимому. Отсюда скорость интерфейса/"число прерываний". Число прерываний выбираем как нравится. Я бы подогнал под число прерываний таймера 62. Теоретически можно и 1000 взять. Но такая большая дискретность ни к чему хорошему не приведет. Так что от 30-100 мне кажется оптимальным вариантом.
Да кстати както читал статьпро прорамера графических движков что ли, так он использовал какую то прогу чтобы смотреть какие API сколько времени занимают Хм было бы полезно...
Немного оффтоп: http://phrack.org/issues.html?issue=66&id=9#article - статья про использование TCP окна с нулевым размером и ошибки в реализации таймеров в TCP для проведения DOS-атак. Правда на английском.