avva: (Default)
[personal profile] avva
Любопытная попытка написать супер-оптимизированный HTTP request/response parser. Намерения самые добрые, но... мне кажется, в этом небольшом модуле я смог бы набрать материала на часовую лекцию о том, когда не надо оптимизировать и как не надо.

Даже проглядев его вскользь, я вижу несколько мест, где на первый взгляд очень эффективный подход на самом деле даст относительно медленный код, который легко можно улучшить; а также заодно и место, где есть потенциальный buffer overflow. Утверждение автора, что его модуль "...is nearly optimal in its use of CPU instructions", конечно, слишком оптимистично. Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности, чем столь тщательно сынженированные ручные подгонки под названия HTTP-методов, или отсутствие malloc()-ов.

Меж тем проект, ради которого это затеяно, Node.js (быстрый V8-джаваскрипт на сервере), весьма интересен.

Date: 2009-12-01 03:23 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
ragel-то ему чем не угодил? он вроде бы то самое и делает, генерит оптимальный спагетти-код по описанию автомата.

Date: 2009-12-01 03:29 pm (UTC)
From: [identity profile] avva.livejournal.com
Не сомневаюсь, что по сравнению с рагелем можно вручную заметно убыстрить. Кроме того, ему было важно уместить все в constant space, не уверен, что рагель это позволяет.

"оптимальный" - опасное слово :)

Date: 2009-12-01 03:46 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
Ну, более-менее оптимальный. А то сейчас ему ragel не оптимально генерирует, а завтра - компилятор C нехорош, ассемблер подавай :)

Ну а в данном случае ragel лучше тем, что не нуждается в коллбэках - обработчик пишется просто инлайн. Хотя, конечно, и там boilerplate code нужно писать, так что тоже не идеал.

Date: 2009-12-01 04:45 pm (UTC)
From: [identity profile] dmzlj.livejournal.com
ragel позволяет

Date: 2009-12-01 03:24 pm (UTC)
From: [identity profile] wakes-up.livejournal.com
Супер быстрый парсер для супер-медленного языка. Зачем?

Date: 2009-12-01 03:28 pm (UTC)
From: [identity profile] avva.livejournal.com
С V8 это уже отнюдь не супер-медленный язык.

Date: 2009-12-01 03:48 pm (UTC)
From: [identity profile] arno1251.livejournal.com
Затормозился на слове "сынженированные", но возражений не нашёл :)

Date: 2009-12-01 04:02 pm (UTC)

Date: 2009-12-01 04:01 pm (UTC)
From: [identity profile] unbe.livejournal.com
А где потенциальный buffer overflow? Я нашел только неправильный индекс у usual[], но это не buffer overflow.

Date: 2009-12-01 04:07 pm (UTC)
From: [identity profile] avva.livejournal.com
c = lowcase[(int)ch];

обратите внимание, что ch - char, а не unsigned char.

Date: 2009-12-01 04:12 pm (UTC)
From: [identity profile] unbe.livejournal.com
да, верно, с usual[] та же история, но это не совсем buffer overflow.

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-12-01 04:16 pm (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2009-12-01 05:33 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-12-01 05:35 pm (UTC) - Expand

Date: 2009-12-01 04:11 pm (UTC)
From: [identity profile] brainslugs.blogspot.com (from livejournal.com)
Напомнило классику http://docs.huihoo.com/nginx/nginx-modules-guide.html

Date: 2009-12-01 04:14 pm (UTC)
From: [identity profile] avva.livejournal.com
Ну да, чувствуется влияние философии нгинкса. А ведь эта статья, по вашей ссылке, начинается с ужасного с точки зрения перформанса куска кода. Меня это в свое время очень позабавило. В самом нгинксе с тех пор это место исправили, если память не изменяет. Мне казалось, я даже писал об этом, но сейчас не могу найти; может, как нередко случается, хотел написать, да так и не собрался.

Date: 2009-12-01 05:33 pm (UTC)
From: [identity profile] s1m.livejournal.com
not a bad piece of code for an 8 bit CPU O.o

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-12-01 05:34 pm (UTC) - Expand

(no subject)

From: [identity profile] s1m.livejournal.com - Date: 2009-12-01 05:42 pm (UTC) - Expand

Date: 2009-12-01 06:19 pm (UTC)
From: (Anonymous)
а в чём проблема данного кода?

(no subject)

From: [identity profile] lazyreader.livejournal.com - Date: 2009-12-01 06:39 pm (UTC) - Expand

(no subject)

From: [identity profile] gianthare.livejournal.com - Date: 2009-12-01 08:00 pm (UTC) - Expand

(no subject)

From: [identity profile] lazyreader.livejournal.com - Date: 2009-12-01 08:41 pm (UTC) - Expand

(no subject)

From: [identity profile] gianthare.livejournal.com - Date: 2009-12-01 09:13 pm (UTC) - Expand

(no subject)

From: [personal profile] stas - Date: 2009-12-01 08:48 pm (UTC) - Expand

(no subject)

From: [identity profile] gianthare.livejournal.com - Date: 2009-12-01 09:09 pm (UTC) - Expand

(no subject)

From: [identity profile] faceted-jacinth.livejournal.com - Date: 2009-12-01 09:19 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-12-01 09:24 pm (UTC) - Expand

(no subject)

From: [identity profile] gianthare.livejournal.com - Date: 2009-12-01 09:28 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-12-01 09:23 pm (UTC) - Expand

(no subject)

From: [identity profile] gianthare.livejournal.com - Date: 2009-12-01 09:44 pm (UTC) - Expand

(no subject)

From: [identity profile] gianthare.livejournal.com - Date: 2009-12-01 09:49 pm (UTC) - Expand

Почитал еще

From: [identity profile] gianthare.livejournal.com - Date: 2009-12-01 10:17 pm (UTC) - Expand

(no subject)

From: [identity profile] msh.livejournal.com - Date: 2009-12-02 02:26 am (UTC) - Expand

Date: 2009-12-01 06:08 pm (UTC)
From: [identity profile] itman.livejournal.com
Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности.

Так там callbacks встраиваемые.

Date: 2009-12-01 06:31 pm (UTC)
From: [identity profile] cema.livejournal.com
В каком смысле встраиваемые? (Последнее слово с третьего раза написал правильно.)

(no subject)

From: [identity profile] itman.livejournal.com - Date: 2009-12-01 06:37 pm (UTC) - Expand

(no subject)

From: [identity profile] meshko.livejournal.com - Date: 2009-12-02 01:43 pm (UTC) - Expand

(no subject)

From: [identity profile] itman.livejournal.com - Date: 2009-12-02 03:30 pm (UTC) - Expand

Date: 2009-12-01 06:13 pm (UTC)
From: [identity profile] tretiy3.livejournal.com
сынженированные
какое страшное слово

Date: 2009-12-01 07:02 pm (UTC)
From: [identity profile] meshko.livejournal.com
Я не понимаю:

1) зачем вообще оптимизировать http parser. Неужели это составляют хоть сколько-нибудь значимую часть нагрузки на веб сервер?
2) зачем JavaScript на сервере?

Date: 2009-12-01 07:18 pm (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
(2) чем javascript + JIT хуже Java + JIT в плане производительности? :)

(no subject)

From: [identity profile] meshko.livejournal.com - Date: 2009-12-01 07:23 pm (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2009-12-01 10:36 pm (UTC) - Expand

Date: 2009-12-01 07:19 pm (UTC)
From: [identity profile] avva.livejournal.com
1) очень правильный вопрос. essentially не надо. См. заголовок моей записи (отрывок цитаты из Кнута).

2) JS, в общем, хороший и мощный динамический язык, если правильно на него смотреть (см. Крофорд итд.). Под V8 он к тому же еще и очень быстрый, и наверное (говорю это от фонаря - сам не проверял!) вполне может поспорить по скорости, скажем, с Питоном или ПХП. А вместе с event-driven IO, который добавляет этот самый Node.js, он становится сравним с продвинутыми фреймворками на динамических языках, типа Twisted.

Так что писать на нем сайты - возможность как минимум интересная; хотя, конечно, несравнимо более бедные библиотеки, это да. С другой стороны, "все" уже знают Джаваскрипт.

(no subject)

From: [identity profile] meshko.livejournal.com - Date: 2009-12-01 07:41 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-12-01 09:16 pm (UTC) - Expand

(no subject)

From: [personal profile] stas - Date: 2009-12-01 08:52 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2009-12-01 09:17 pm (UTC) - Expand

(no subject)

From: [identity profile] meshko.livejournal.com - Date: 2009-12-02 02:38 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_winnie/ - Date: 2009-12-02 09:10 am (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2009-12-02 09:56 am (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_winnie/ - Date: 2009-12-02 07:02 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2009-12-06 08:27 pm (UTC) - Expand

Date: 2009-12-01 09:14 pm (UTC)
From: [identity profile] gianthare.livejournal.com
Ну, если он получает много malformed requests ...

Date: 2009-12-02 02:11 am (UTC)
From: [identity profile] msh.livejournal.com
Так не делают нынче сайтов на PHP, Java или Python. Это PHP + JS, Python + JS, Java + JS. Почему бы не сделать сразу JS + JS, все равно без него никуда

Из смешных приложений JS на сервере я тесно общался с VoiceXML. Там авторы хотели сделать, чтобы все выглядило типа как HTML (простим им, в середине 90-х многие были очарованы), но поскольку никакого броузера там нет, то парсить и исполнять JS приходилось на том же самом сервере

Date: 2009-12-02 07:42 am (UTC)
netch: (Default)
From: [personal profile] netch
> 1) зачем вообще оптимизировать http parser. Неужели это составляют хоть сколько-нибудь значимую часть нагрузки на веб сервер?

Ну вообще-то - да, составляет. Даже простой accept filter в ядре уже показывал десятки процентов прироста производительности для сервера _статики_.

Впрочем, я лично с HTTP в этом плане не работал, работал с SIP, у которого синтаксис сделан в тех же принципах и методах как HTTP, но ещё больше грамматизирован. Так вот - его парсинг представляет собой область, в которой можно достичь как высокой эффективности, так и наоборот - кошмарных тормозов на ровном месте. С тех пор я систематически посылаю лучи диареи народу из IETF.;(

(no subject)

From: [identity profile] meshko.livejournal.com - Date: 2009-12-02 01:42 pm (UTC) - Expand

(no subject)

From: [personal profile] netch - Date: 2009-12-02 01:47 pm (UTC) - Expand
From: [identity profile] gianthare.livejournal.com
Парсинг первой строки имело смысл вытащить из цикла, она все равно не повторяется - все эти состояния одноразовые.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 10:11 am
Powered by Dreamwidth Studios