SASGIS

Веб-картография и навигация

HTTP-сервер-обменник для тайлового кеша

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Alexander » 22 дек 2008, 15:28

Alexander писал(а):У меня в программе сейчас вычисляется полный MD5 тайла перед тем как тот добавляется в кэш, скорость скачивания от 100Кб/с до 150Кб/с, операционка(Vista) с моей программой создаёт нагрузку на процессор в среднем 2% (среднее по диаграмме), сама программа менее 1%. Если посмотреть на алгоритм MD5 хэширования, то станет понятно что для хэширования нужно произвеси порядка 560 примитивных операций (которые занимаю <= 4 тактов процессора) на каждые 64байта, пусть будет 36 тактов на 1 байт, тогда более 50 Мбайт/с может хэшировать средний проц для ПК (При 100% загрузке). А MD5 10Кб/с может любой калькулятор сейчас =)Как это делается на скриптах я не знаю, может и не так эффективно.


Скажу точнее, одно ядро моего проца за 416 мс хэшировало 75Мб, также как за 3с 119мс хэшировало 570Мб.
Alexander
Соображающий
 
Сообщения: 78
Зарегистрирован: 14 июл 2008, 09:09
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Parasite » 22 дек 2008, 20:32

Alexander писал(а):Скажу точнее, одно ядро моего проца за 416 мс хэшировало 75Мб, также как за 3с 119мс хэшировало 570Мб.


Код: Выделить всё
use Digest::MD5;

    my $file = shift || "/test570mb.junk";
    open(FILE, $file) or die "Can't open '$file': $!";
    binmode(FILE);

    $md5 = Digest::MD5->new;
    while (<FILE>) {
        $md5->add($_);
    }
    close(FILE);
print $md5->b64digest, " $file\n";


Время выполнения - 2мин 45сек 18мсек, 8хXeon3.0 Ghz (впрочем сомневаюсь что в стандартном Digest::MD5 есть эффективное распараллеливание, особенно более чем на два потока - но на наст.этапе это неважно), Solaris 11, Perl 5.8.7. И это, уверяю Вас - далеко не самые плохие показатели.
Удачи.

PS: То, что MD5 одна из наиболее неповоротливых хэш-функций - это общеизвестно. Спорить с очевидным (и более того - в отношении решения, которого пока еще нет в природе, а только в идее) - нет никакого желания. Желаете MD5 - вводите оный, сорцы доступны и Вам. Опыт работы со скриптами подсказывает, что это решение на сервере ляжет уже при минимальной нагрузке - массированно MD5 скриптами никто не считает именно поэтому. Удачи в опытах.

PPS: За 3с и 119мс даже прочитать 570Мб сможет не каждая система, не говоря уж про хэширование.

PPPS: Вы так и не сказали, чем плохи более быстрые CRC/CRC32.
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Alexander » 22 дек 2008, 20:56

Parasite писал(а):
Alexander писал(а):Скажу точнее, одно ядро моего проца за 416 мс хэшировало 75Мб, также как за 3с 119мс хэшировало 570Мб.


Код: Выделить всё
use Digest::MD5;

    my $file = shift || "/test570mb.junk";
    open(FILE, $file) or die "Can't open '$file': $!";
    binmode(FILE);

    $md5 = Digest::MD5->new;
    while (<FILE>) {
        $md5->add($_);
    }
    close(FILE);
print $md5->b64digest, " $file\n";


Время выполнения - 2мин 45сек 18мсек, 8хXeon3.0 Ghz (впрочем сомневаюсь что в стандартном Digest::MD5 есть эффективное распараллеливание, особенно более чем на два потока - но на наст.этапе это неважно), Solaris 11, Perl 5.8.7. И это, уверяю Вас - далеко не самые плохие показатели.
Удачи.

PS: То, что MD5 одна из наиболее неповоротливых хэш-функций - это общеизвестно. Спорить с очевидным (и более того - в отношении решения, которого пока еще нет в природе, а только в идее) - нет никакого желания. Желаете MD5 - вводите оный, сорцы доступны и Вам. Опыт работы со скриптами подсказывает, что это решение на сервере ляжет уже при минимальной нагрузке - массированно MD5 скриптами никто не считает именно поэтому. Удачи в опытах.


Как резко исчезла надпись о скоростях чтения ))) Вся инфа находилась в оперативке перед началом отсчёта времени.

Скрипт проверять пока не буду, но что-то мне подсказывает что вы читаете из файла? Даже без буферизации? Скорость хэширования и скорость чтения из файла без буферизации немного разные вещи.. Тем более не грешите на функцию, когда используете скипты, если что-то медленно в скриптах, а на дельфи например быстро, то значит всё-таки виноват интерпретатор.. Я предполагаю что если взять например встроенную функцию .Net по MD5 хэшированию, то она обойдёт мной реализованный вариант по скорости. Предложите функцию CRC32 на дельфи, для сравнения скорости с MD5.
Alexander
Соображающий
 
Сообщения: 78
Зарегистрирован: 14 июл 2008, 09:09
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Alexander » 22 дек 2008, 21:00

Parasite писал(а):PPS: Вы так и не сказали, чем плохи более быстрые CRC/CRC32.


CRC/CRC32 возможно чем то и хороши, не пользовался я ими для своих целей.
Alexander
Соображающий
 
Сообщения: 78
Зарегистрирован: 14 июл 2008, 09:09
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Parasite » 22 дек 2008, 21:12

Alexander писал(а):Скрипт проверять пока не буду, но что-то мне подсказывает что вы читаете из файла? Даже без буферизации? Скорость хэширования и скорость чтения из файла без буферизации немного разные вещи.

Я знаю. Вы предлагаете держать всю базу в уме? В память оно у Вас далеко не святым духом попадает. Особенно на стороне хостера, где на том же самом физическом сервере крутится еще кучка смежных проектов - каждый со своими запросами и со столь же "оптимизированными" решениями. А сервер-то (физический) не резиновый, и иногда даже банальные селекты идут по нескольку секунд...

Alexander писал(а):Тем более не грешите на функцию, когда используете скипты, если что-то медленно в скриптах, а на дельфи например быстро, то значит всё-таки виноват интерпретатор.

Ни разу вживую не видел веб-приложение на дельфи, извините. Вы предлагаете писать серверную часть на дельфях? В чем тогда удобство (конфигурирования и перестройки), как это было бы со скриптовым решением? Будет скомпиленный закрытый "блок кода", будет мускул и будет база в нем. Итого - три не самых понятных обывателю вещи без видимых достоинств, в противовес тому что оно "и щас работает безо всего этого".
Да, и как быть с многопользовательским режимом в server-side на дельфях?
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Alexander » 23 дек 2008, 00:19

Parasite писал(а):
Alexander писал(а):Скрипт проверять пока не буду, но что-то мне подсказывает что вы читаете из файла? Даже без буферизации? Скорость хэширования и скорость чтения из файла без буферизации немного разные вещи.

Я знаю. Вы предлагаете держать всю базу в уме? В память оно у Вас далеко не святым духом попадает. Особенно на стороне хостера, где на том же самом физическом сервере крутится еще кучка смежных проектов - каждый со своими запросами и со столь же "оптимизированными" решениями. А сервер-то (физический) не резиновый, и иногда даже банальные селекты идут по нескольку секунд...

Alexander писал(а):Тем более не грешите на функцию, когда используете скипты, если что-то медленно в скриптах, а на дельфи например быстро, то значит всё-таки виноват интерпретатор.

Ни разу вживую не видел веб-приложение на дельфи, извините. Вы предлагаете писать серверную часть на дельфях? В чем тогда удобство (конфигурирования и перестройки), как это было бы со скриптовым решением? Будет скомпиленный закрытый "блок кода", будет мускул и будет база в нем. Итого - три не самых понятных обывателю вещи без видимых достоинств, в противовес тому что оно "и щас работает безо всего этого".
Да, и как быть с многопользовательским режимом в server-side на дельфях?


Выходит вы не прочитали топик полностью? Я написал что собираюсь делать и когда, не претендавал на скриптовую серверную часть никогда. Спор вышел "не о чём", я собираюсь написать серверную часть к своей программе, на сокетах. Меня интересует скорость для 1-3 соединений, а не ультрамногопользовательность. Скорости на сриптах не добиться, теперь я вижу ещё несколько причин этому.
В памяти необходимо держать для каждого аплоадера всего 1 тайл, который претендует на поподание в базу. Общая скорость (Загрузка в память + хэширование) выходит всего в 3 раза больше на моей машине, так файл 75Мб всего за 1,5 секунды хэшируется (при второй попытке всего за 715 мс). Если бы вы добавили хоть маломальское кэширование (если такое возможно на скриптах) то времени бы затратилось куда меньше чем 2 минуты.
Alexander
Соображающий
 
Сообщения: 78
Зарегистрирован: 14 июл 2008, 09:09
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Parasite » 23 дек 2008, 07:03

Alexander писал(а):Выходит вы не прочитали топик полностью? Я написал что собираюсь делать и когда, не претендавал на скриптовую серверную часть никогда.

Прочитать-то прочитал, но явные минусы сразу лезут в глаза (и не мне одному - тут ранее намекали на некоторую "избыточность" варианта с сокетами, например). За кои минусы тут и обсуждаем.
Впрочем, нравится - делайте, это ж я еще вчера сказал. Хоть какая-то подвижка на этом направлении все же лучше, чем вообще никакой... :(

Alexander писал(а):я собираюсь написать серверную часть к своей программе, на сокетах. Меня интересует скорость для 1-3 соединений, а не ультрамногопользовательность.

Многопользовательскость в своем принципе не может быть "ультра". Это как беременность: нельзя быть "немножко беременным". Либо решение позволяет параллельную работу себя любимого на много фронтов, либо работает сугубо в сингл-мод и никак иначе. Число параллельных потоков и лимитейшны оборудования и сервера - это уже техническая подробность (понятно, что чем больше одновременно подключенных клиентов - тем больше проблем, но это уже совершенно другой вопрос, мало относящийся к собственно идее приложения).

Alexander писал(а):Общая скорость (Загрузка в память + хэширование) выходит всего в 3 раза больше на моей машине, так файл 75Мб всего за 1,5 секунды хэшируется (при второй попытке всего за 715 мс). Если бы вы добавили хоть маломальское кэширование (если такое возможно на скриптах) то времени бы затратилось куда меньше чем 2 минуты.

В моем примере специально был отход от кэширования, чтобы мерять не сферического коня в вакууме - но реальную, приближенную к текущей ситуацию на конфигурации, приближенной к серверной. Я даже специально предварительно сбросил системный кэш, чтобы он не влиял на чистоту эксперимента - если бы мне был нужен "сферический конь", то я бы прохэшировал ту или иную часть RАМа или поток определенной длины из /dev/rnd. И в любом случае скорость MD5 была бы В РАЗЫ медленнее CRC - о чем и разговор.
Я еще раз повторяю, что никто на стороне среднестатистического хостера не будет постоянно держать Вашу глобальную базу в памяти, всегда предоставляя Вам исключительно хорошо прокэшированные данные. Опять же, при размере базы >512Мб прокэшировать ее так или иначе становится затруднительным по техническим соображениям, более того - тайлы теоретически могут класться\браться с любого отдельно взятого места базы рандомно, а не по порядку. В итоге при большой базе (либо маленькой памяти) получаем постоянное пережевывание оной еще и механизмом кэширования на фоне до упора занятой памяти + нагрузку самого решения и всей серверной обвязки + необходимость хоть какой-то работы и соседних задач и процессов.

Впрочем, создайте более-менее большой контейнер ТруКрипта (одним файлом например, 4Гб - это будет аналог совсем небольшой "базы", которая может быть создана юзерами даже за сутки), и попробуйте а)прокэшировать его весь в память б)активно поработать в multi-user конфиге, одновременно выполняя какие-то второстепенные действия на той же машине (либо желаем dedicated server?), причем работа должна вестись через сокеты прогой, написанной на дельфях (сомневаюсь, что оный дельфи чем-то особым выделяется при разработке server-side вообще, и при работе с сетью в частности - это изначально "виндузявый недоПаскаль для начинающих" без какой-то особой ориентации и оптимизации в сторону сетевых решений). Посмотрите за общую производительность такой конфигурации в течении более-менее долгого времени. Удачи.

PS: предлагаю прекратить этот спор ни о чем. Нравится Ваш вариант - делайте, кто ж против-то, сорцы есть в паблике. От любых опытов MD5 само по себе не станет быстрее, прекомпиленная серверная часть не станет гибче (особенно с закр.кодом), а прекэшируемая база рано или поздно перестанет влазить в локальный RAM, насколько бы этот RAM ни был бы велик. Смею предположить, что в скором времени этот вариант окажется очередным тупиковым, ибо каждый раз изобретать новый велосипед решения общеизвестных граблей - несколько затруднительно и накладно по времени. Минусы же предложения очевидны (и должны будут быть так или иначе решены\обойдены) - а откровенных плюсов своего решения по сравнению с уже существующим Вы пока еще так и не обозначили.
Если же просто хочется тематических экспериментов - то удачи. :)
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение vdemidov » 23 дек 2008, 11:53

Parasite писал(а):Я еще раз повторяю, что никто на стороне среднестатистического хостера не будет постоянно держать Вашу глобальную базу в памяти, всегда предоставляя Вам исключительно хорошо прокэшированные данные.

Обратите внимание, что для вычисление хеша нам нужно всего 1 раз при добавлении тайла. Перехешировать всю базу никому не нужно. А добавляемый тайл уже будет в памяти. Так что тут как раз нужно мерять только скорость вычисления хеша, а не как вы сами написали "сферического коня в вакууме". Я тоже не одобряю написание серверной части на делфи с использованием сокетов. IMHO MD5 алгоритм можно реализовать даже в PHP достаточно эффективно.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение Parasite » 23 дек 2008, 12:46

vdemidov писал(а):Я тоже не одобряю написание серверной части на делфи с использованием сокетов. IMHO MD5 алгоритм можно реализовать даже в PHP достаточно эффективно.

Тут опять в который раз задам все тот же вопрос: ЗАЧЕМ реализовывать MD5 в PHP под данную задачу? Я не говорил что этого сделать вообще нельзя, я спрашивал - ЗАЧЕМ использовать именно MD5 (в разы более медленный по определению)? Для чего, именно в данной задаче? Какие выгоды дает MD5 по сравнению с CRC32 к примеру, кроме как повышенной нагрузки на камень, помноженной на число хэширований, помноженной на число сессий от юзеров? У нас же не стоит задача например криптования или создания защищенного хранилища с ключами, в конце-то концов - нам надо просто узнать, есть ли точно такой же тайл в "стопке" таких же, но разных версий (коя версия даже на гугле на наст.момент 2.89 - то есть в лучшем случае 289 тайлов в каждой "стопке" за кучку лет существования), а по факту - очень много где просто единственный тайл не только на всех версиях, но и на всех зумах - в океанах например.

Посадить-то хоть на SHA512 можно - но ЗАЧЕМ :?: Обоснования повышенной ресурсоемкости решения - где? На это никто почему-то до сих пор не ответил. Просто потому что "программеру так захотелося"? Так его право, конечно, хай делает (как я и сказал ранее) - но лично я например такое решение качать, разворачивать и использовать не вижу практического смысла - с гугла и так всё качается безо всяких MD5, баз и вот прямо щас.
Кстати, выгоды именно от создания и развертывания подобного решения (САС+закрытый сервер на дельфях и MD5+база) тоже никто не хочет озвучить. Что это дает - особенно в свете закрытого, прекомпиленного и посему крайне негибкого сервера? Ответа тоже нет...
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: HTTP-сервер-обменник для тайлового кеша

Сообщение vdemidov » 23 дек 2008, 13:13

Закрытый сервер это действительно плохо и не инетерсно :) А если еще и обменивающийся информацией по своему самописному протоколу через сокеты, то и вообще бессмысленно.
А вот какую хеш-функцию использовать, так это уже исключительно дело того, кто будет реализовывать сервер. Просто на этой задаче скорость вычисления хеша очень мало повлияет на общую производительность сервера.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Пред.След.

Вернуться в SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15