Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
mov ah,al
shr ah,4
xor ah,33h
sub al,ah
Зачем именно так сделано — на 100% мне неизвестно. Мне кажется что это связано с возможным отсутствием Content-Length в заголовках, когда файл принять надо, а сколько данных браузер заведомо не знает. Буду признателен если кто-то откроет тайну )))Вы или указывайте Content-Length, либо Transfer-Encoding: chunked. Или попробуйте отвечать HTTP/1.0.
же только ленивый не писал подобных статей, — сервер на perl, node.js, по-моему даже были попытки на php.
Вот только на ассемблере еще не было, — значит нужно заполнить пробелы.
The other noteworthy point is that there is a defect in the current implementation of TCP SO_REUSEPORT.
p.s. У nginx нет узкого места «в виде одного слушающего процесса».
In case #2, the proportion of connections accepted per thread tends
to be uneven under high connection load (assuming simple event loop:
while (1) { accept(); process() }, wakeup does not promote fairness
among the sockets. We have seen the disproportion to be as high
as 3:1 ratio between thread accepting most connections and the one
accepting the fewest. With so_reusport the distribution is
uniform.
Когда ядро раскладывает соединения, оно не знает, в каком из них будет легкий запрос, а в каком тяжелыйСобственно nginx тоже не знает, каким будет соединение, и какие запросы потом ещё придут.
итоге один воркер может получить много легких запросов и быстро с ними справиться, обслужит всю свою очередь соединений на своем дескрипторе, а затем будет простаиватьПростаивать точно не будет, так как запросы на сервер продолжают поступать (если это не бенчмарк).
Собственно nginx тоже не знает, каким будет соединение, и какие запросы потом ещё придут.
Простаивать точно не будет, так как запросы на сервер продолжают поступать (если это не бенчмарк).
Так что я думаю, что на момент accept()-а соединения, что у ядра, что у nginx-а примерно одинаковые возможности по балансировке — по загрузке процессора.
Если бы nginx поддерживал потоки, ситуация с равномерностью загрузки была бы красивее.В чем же разница между ядерными потоками и процессами в этом аспекте? =)
В легковесности — их можно создавать быстро и много.В Windows системах оно может быть и так. В *nix их создание эквивалентно по стоимости.
Оно принимается мастер-процессомМастер-процесс не работает с пользовательскими соединениями вообще. Его задача исключительно читать конфигурацию и перезапускать рабочие процессы.
Вот есть у нас 16 ядер, и, соответственно 16 воркеров. И заняты он тем, что все жмут gzip-ом большие HTML-страницы — ну очень процессороёмкая операция. Приходит новое соединение с запросом на маленькую картинку.… и ждёт, пока освободится воркер. А ведь ресурсов, чтобы его отдать прямо сейчас, практически не нужно.Как это связано с обсуждаемой темой про SO_REUSEPORT? =) Очевидно никак.
Мастер-процесс nginx-а, который читает конфигурацию, делает по одному listen() на каждый сокет
Мастер-процесс не работает с пользовательскими соединениями вообще
, а затем уже форкается на указанное количество рабочих процессов.Именно рабочие процессы зовут accept(). Мастер этим не занимается.
в один момент времени копаться в баке может только один.
ЖЭК говорит, спокойно — вот есть решение (SO_REUSEPORT) и выделяют каждому бомжу свой персональный мусорный бак.
Любой приличный веб-сервер уделает это чудо в разы.ИМХО, целью автора было совсем не скорость, т.к.
Времени было прилично, решил я немного извратиться и написать это на асме.И кроме того это чудо тоже уделает любой приличный веб-сервер! По размеру кода, разумеется.
Оптимизация на размер для веб-сервера — нонсенс, не заслуживающий упоминания.Если вы поработаете со встраиваемыми устройствами, то, скорее всего, измените свою точку зрения.
Я просто сказал, что в большинстве встраиваемых систем нету привычного int 80h, вот и все.А где-то утверждалось обратное? Открытие Америки — надо же, на других аппаратных платформах, используется другой ассемблер, и там нет x86-ых инструкций! Вау! К чему вообще был этот комментарий? Почему он получил плюсик? Почему мой, абсолютно корректный, получил минус?
Оптимизация на размер для веб-сервера — нонсенс, не заслуживающий упоминания.т.е. без привязки к конкретной платформе и применению. Веб-сервер может быть на погодной станции, где достаточно выдавать несколько чисел в браузер. Или на такой симпатичной x86 плате с 32МБ памяти.
не говоря уже про новую семантику tcp-сокетов
Оказывается что после отправки самого файла, браузер шлет заголовок, который сервер должен принять. Не важно какие там данные, — его все равно можно отослать в /dev/null но очень важно что бы сервер его прочел. Иначе браузер посчитает что с файлом что-то не то. Зачем именно так сделано — на 100% мне неизвестно. Мне кажется что это связано с возможным отсутствием Content-Length в заголовках, когда файл принять надо, а сколько данных браузер заведомо не знает. Буду признателен если кто-то откроет тайну )))
cmp al, 39hcmp al, '9'mov eax, 6 ; close() syscall
mov ebx, edi ; The socket descriptor
int 0x80 ; Call the kernelmov ebx, edi ; The socket descriptor
call closepush A
push B
push C
call Xinvoke X, A, B, CСразу скажу, что мы не будем использовать дополнительные библиотеки типа libc. А будем пользоваться тем, что предоставляет нам ядро.Поэтому через system call.
call:
mov eax, 6 ; close() syscall
int 0x80 ; Call the kernel
ret
...macro fclose sock
{
mov ebx, sock
mov eax, 6
int 0x80
}
fclose edi
Настоящий многопоточный веб-сервер на ассемблере под Linux