пятница, 29 июля 2011 г.

О LevelDB и SQLite


Новость:
Компания Google открыла исходные тексты БД LevelDB

Кратко о LevelDB - хранилище ключ-значение, однопоточный доступ, нет гарантий целостности всех данных, в памяти держит копию всех данных лог-файлов.

Утилита для тестирования SQLite у них кривая, мои патчи к ней брать тут

Результаты тестирования с патчем для использования целочисленного Primary Key смотреть здесь

Как видим, LevelDB на тестах показывает местами так себе преимущество относительно реляционной транзакционной СУБД... а местами ухитряется быть еще и медленнее :) Неплохо бы сравнить с CDB от DJB с патчем, убирающем ограничение на "константность". В любом случае, по проведенным тестам нет смысла в использовании LevelDB - функционал урезан сильно, а заметного выигрыша в производительности не видно.

Равно есть куда улучшать и SQLite - некоторые результаты плохи на фоне остальных тестов. Значит, у нас многое еще впереди.

пятница, 22 июля 2011 г.

Обновление eglibc в debian

eglibc (2.13-8) unstable; urgency=low

Starting with the eglibc package version 2.13-5, the libraries are
shipped in the multiarch directory /lib/$arch instead of the more
traditional /lib.

The toolchain in Debian has been updated to cope with that, and most
build systems should be unaffected. If you are using a non-Debian
toolchain to build your software and it is not able to cope with
multiarch, you might try to pass the following options to your
compiler:

-I/usr/include/$arch --sysroot /usr/lib/$arch

-- Aurelien Jarno Sun, 26 Jun 2011 22:28:52 +0200


вторник, 19 июля 2011 г.

Семантический веб и формат RDF

В результате общения на форуме с разработчиком Virtuoso возникло желание поглядеть, что бы все это значило и не будет ли оно полезно мне. Итак, смотрим.

Немного ликбеза: Облако и куб: RDF в аналитической базе данных

Описание языка запросов: SPARQL

Набор утилит: Command Line Semantic Web With Redland

В дебиане доступны следующие пакеты: redland-utils (утилита rdfproc), rasqal-utils (утилита roqet) и raptor-utils (утилита rapper). На этих утилитах построен облачный сервис Triplr — Web Command Line

Запрос из найденных в сети примеров:
$ time roqet -e 'PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?website FROM    WHERE { ?person foaf:weblog ?website ; foaf:name ?name . ?website a foaf:Document}'
...
roqet: Query returned 74 results

real	0m1.929s
user	0m0.112s
sys	0m0.012s

$ openload http://planetrdf.com/bloggers.rdf -t|grep Content-Length:
URL: http://planetrdf.com:80/bloggers.rdf
Content-Length: 56645

Теперь попробуем протестировать самостоятельно. Для экспериментов я взял лог веб-сервера, сконвертировав его в файл test.ttl нижеприведенного формата:
@prefix : <http://mobigroup.ru/2011/ttl/example#> .
[] :host "localhost"; :prot "http"; :code 503; :length 12731; :url ""; :type ""; :version "" .
[] :host "localhost"; :prot "https"; :code 503; :length 12731; :url ""; :type "GET"; :version "HTTP/1.1" .
[] :host "localhost"; :prot "https"; :code 302; :length 611; :url "login"; :type "POST"; :version "HTTP/1.1" .
[] :host "localhost"; :prot "https"; :code 200; :length 8006; :url ""; :type "GET"; :version "HTTP/1.1" .
...

$ stat --format=%s test.ttl
8502820

$ wc -l test.ttl 
52593 test.ttl

Загружаем в специальное хранилище (используется BerkeleyDB) и выполняем запрос:
$ time rdfproc test.db parse test.ttl turtle -n
rdfproc: Parsing URI file:///tmp/test.ttl with turtle parser

real	1m35.248s
user	0m42.927s
sys	0m7.116s

$ stat --format="%n %s" test.db*
test.db-po2s.db 21569536
test.db-so2p.db 79216640
test.db-sp2o.db 62119936

$ time rdfproc test.db query sparql - 'PREFIX : <http://mobigroup.ru/2011/ttl/example#> SELECT  ?code ?url ?length WHERE   { ?x :code ?code . FILTER (?code=503) . ?x :url ?url . ?x :length ?length }'>log
rdfproc: Query returned bindings results:
rdfproc: Query returned 1457 results

real	0m13.773s
user	0m13.569s
sys	0m0.132s

А здесь выполняем запрос прямо к файлу:
$ cat test.sparql
PREFIX : <http://mobigroup.ru/2011/ttl/example#>
PREFIX  src: <file:>
SELECT  ?code ?url ?length
FROM    src:test.ttl
WHERE   { ?x :code ?code . FILTER (?code=503) . ?x :url ?url . ?x :length ?length }

$ time roqet -qi sparql test.sparql >/dev/null
...подождал полчаса и прервал запрос...

Увы, очень уж тормознуто. Для сравнения, обычный grep:

$ time grep ":code 503;" test.ttl>/dev/null

real	0m0.046s
user	0m0.040s
sys	0m0.008s

$ grep ":code 503;" test.ttl|wc -l
1457

Теперь попробуем виртуозу. Ставим (запрошенный при установке пароль скоро понадобится!):
$ sudo aptitude install virtuoso-opensource

Открываем в браузере ссылку http://localhost:8890/conductor/ и идем в раздел RDF -> RDF Store Upload, где и грузим наш файл test.ttl ( за 2 минуты 45 секунд). Теперь в разделе RDF->SPARQL выполняем запрос:
PREFIX : <http://mobigroup.ru/2011/ttl/example#>
SELECT  ?code ?url ?length
WHERE   { ?x :code ?code . FILTER (?code=503) . ?x :url ?url . ?x :length ?length }

Время выполнения не показывает, но результат выдает почти мгновенно.

А вот так с помощью консольной isql-vt стереть нафиг все данные и загрузить новые (см. DB.DBA.TTLP_MT):
DB.DBA.RDF_GLOBAL_RESET() ;
DB.DBA.TTLP_MT (file_to_string_output ('/tmp/test.ttl'), '', 'http://localhost:8890/DAV/offline');




И пара запросов - на подсчет всех фактов указанного вида и отчет по URL определенного вида:
PREFIX : <http://mobigroup.ru/2011/ttl/haproxy/offline#>
SELECT  count(*) as ?count
WHERE   { ?x :timestamp ?timestamp }

PREFIX : <http://mobigroup.ru/2011/ttl/haproxy/offline#>
SELECT *
WHERE   { ?x :url ?url .
        ?x :length ?length .
        ?x :backend ?backend .
        ?x :session ?session .
        FILTER regex(?url, "q=") .
        FILTER regex(?url, "/share/") .
}

Ссылки:
Semantic Web
SPARQL — язык запросов к RDF
Знакомимся с RDF и Semantic Web через N3
<> a :RoughGuide; :to :Notation3 .
Primer: Getting into RDF & Semantic Web using N3
W3C Semantic Web Tutorial
A Prototype Knowledge Base for the Life Sciences

О виртуозе:
Extending SPARQL IRI Dereferencing with Virtuoso Sponger Middleware
Sindice, its startup company and 12 billion+ live triples SPARQL endpoint

Геоданные:
OGC Seeks Comment on candidate GeoSPARQL standard

Ресурсы:
RDF-ресурсы (диаграмма кликабельна!)
Currently Alive SPARQL Endpoints

Здесь есть и про bio2rdf
Virtuoso Universal Server AMI for Amazon EC2 Instantiation Guide

What is the Bio2RDF Project?

Страница проекта bio2rdf на sf
Bio2RDF - Demo queries

PubMed : U.S. National Library of Medicine National Institutes of Health

воскресенье, 3 июля 2011 г.

Haproxy и openload: 40ms проблема

При тестировании сервисов за реверс-прокси HAProxy посредством утилиты openload обнаружилась занимательная вещь: любой запрос выполняется не быстрее, нежели за 40 мс! Даже с "monitor-uri /TESTME" (при наличии этой директивы во фронтэнде HAProxy сам обрабатывает запрос, сообщая о состоянии текущего фронтэнда).

Запросы openload через HAProxy:
$ openload http://127.0.0.1/TESTME 1
URL: http://127.0.0.1:80/TESTME
Clients: 1
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 25
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 50
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 75
MaTps 25.00, Tps 25.00, Resp Time 0.040, Err 0%, Count 100

Прямое подключение openload к серверу:
$ openload http://127.0.0.1/TESTME 1
URL: http://127.0.0.1:80/TESTME
Clients: 1
MaTps 2590.64, Tps 2590.64, Resp Time 0.000, Err 0%, Count 2601
MaTps 2609.15, Tps 2775.79, Resp Time 0.000, Err 0%, Count 5399
MaTps 2644.94, Tps 2967.00, Resp Time 0.000, Err 0%, Count 8366
MaTps 2649.39, Tps 2689.48, Resp Time 0.000, Err 0%, Count 11077

Как выяснилось, проблема таится в кривом сетевом коде openload: мало того, что сильно нагружается CPU и о тестировании производительных сервисов стоит забыть сразу, так еще и возникает указанный выше таймаут.

Забавно, конечно, что автор openload побайтово работает с данными - видимо, в Индии процессоры мощные, а интернет медленный :D Комментарий от Willy:

What is shown below clearly indicates that it will never be possible
to reach medium to high loads with this tool, it receives the response
one byte at a time ! Anyway, this is unrelated to what you're observing.

> recvfrom(3, 0x507340, 1, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
> select(1, [0], NULL, NULL, {0, 0}) = 0 (Timeout)
> select(4, [3], [], [3], {0, 200000}) = 1 (in [3], left {0, 160000})
> recvfrom(3, "H", 1, 0, NULL, NULL) = 1
> recvfrom(3, "T", 1, 0, NULL, NULL) = 1
> recvfrom(3, "T", 1, 0, NULL, NULL) = 1
> recvfrom(3, "P", 1, 0, NULL, NULL) = 1
> recvfrom(3, "/", 1, 0, NULL, NULL) = 1

Как обходной путь, для работы с openload можно добавить в конфиг фронтэндов HAProxy директиву "no option tcp-smart-accept". После тестирования лучше отключить эту директиву - для работы браузеров и т.п. она не нужна, а эффективность работы сети снижает.

Разбор проблемы от Willy:

Hehe as you can see the client's but is even more visible here,
with 40ms betweeen the two parts :

1) the connection comes in and the first half of the request is received :

10:05:38.831751 accept(4, 0x7fff071de650, [128]) = -1 EAGAIN (Resource temporarily unavailable) <0.000000>
10:05:38.831751 recvfrom(1, "GET /README HTTP/1.1\r\n", 8192, 0, NULL, NULL) = 22 <0.000000>
10:05:38.831751 recvfrom(1, 0x6a8096, 8170, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) <0.000000>
10:05:38.831751 epoll_ctl(0, EPOLL_CTL_ADD, 1, {EPOLLIN, {u32=1, u64=1}}) = 0 <0.000000>
10:05:38.831751 epoll_wait(0, {}, 5, 0) = 0 <0.000000>
10:05:38.831751 gettimeofday({1309413938, 831751}, NULL) = 0 <0.000000>

2) the clients remains silent for 40 ms, we're waiting for it to talk :

10:05:38.831751 epoll_wait(0, {{EPOLLIN, {u32=1, u64=1}}}, 5, 1000) = 1 <0.040000>
10:05:38.871751 gettimeofday({1309413938, 871751}, NULL) = 0 <0.000000>

3) the client finally decides to send the last part 40 ms later :

10:05:38.871751 recvfrom(1, "Connection: Close\r\nHost: 127.0.0.1\r\n\r\n", 8170, 0, NULL, NULL) = 38 <0.000000>

Большое спасибо Willy Tarreau (автор HAProxy) за помощь. Выше были приведены некоторые части нашей переписки для получения ясного представления о происхождении и решении проблемы.

TclCloud is an opensource tcl interface to the Amazon AWS webservices

Свершилось :) Полное описание и исходники см. по ссылке TclCloud

TclCloud is an opensource tcl interface to the Amazon AWS webservices api that enabled cloud automation of most AWS products and operations. Example use cases include the following:
* starting and stopping EC2 instances
* attaching EBS volumes
* creating and interfacing with SimpleDB and RDS instances
* managing EC2 Autoscale and Load Balancer configurations
* sending Simple Email Service messages
* creating, submitting and monitoring Elastic Map Reduce (Hadoop) jobs
* configuring VPC networks
* and so on ...
For more information on the Amazon AWS cloud products, see: http://aws.amazon.com/products/

Для удобства собрал пакет, брать в моем репозитории или по ссылке
Tcl cloud deb package

(C) Alexey Pechnikov aka MBG, mobigroup.ru