Сравнение геолокационных бинарных баз и их драйверов: GeoIP, Sypex Geo, TabGeo

Особенностью данного тестирования является некая приближенность к реальным условиям, когда есть необходимость определять страну одного посетителя на лету за один запуск скрипта, то есть: один запуск скрипта — один ip-адрес. В подобном тестировании от zapimir использовался другой принцип, который, как мне кажется, имеет мало общего с реальной необходимостью: один запуск скрипта — определение нескольких тысяч ip-адресов в цикле.

Первое, что мы сделаем — это сравним базы:
Разработчик База Дата обновления Количество диапазонов, тыс Размер базы, Kb
GeoIP GeoLite Country 2014.06.03 93 688
Sypex Geo Sypex Geo Country 2014.06.20 90 365
TabGeo tabgeo_country_v4 2014.06.20 200 998

Sypex Geo может похвастаться самой маленькой базой из всех представленных, но и самой низкой точность (90 000 диапазонов). Самая высокая точность у TabGeo — 200 000 диапазонов, но и, в связи с этим, самая пухлая база. GeoIP – по всем параметрам занимает промежуточное положение. Все базы на данный момент имеют регулярные обновления.

А теперь непосредственно перейдем к тестированию производительности разных баз. Особенностью тестирования было определение времени работы скрипта для определения одного ip-адреса за один запуск, затем данные интерпретировались в количество запусков на одну секунду.
Разработчик База Количество запросов в секунду (медиана)
GeoIP GeoLite Country 460
Sypex Geo Sypex Geo Country 910
TabGeo tabgeo_country_v4 1400

Из таблицы видно, что самым неспешным решением для геолокации является GeoIP – всего 460 запросов в секунду, для самого распространенного и популярного решения — это очень плохо, и хочется отметить, что GeoIP2 от MaxMind совсем не выход из данной ситуации (это больше информационная база, чем база для геолокации).

Серебряным призером данного соревнования является база и драйвер от Sypex Geo – 910 обращений в секунду, что в два раза лучше, чем результаты показанные GeoIP. Но абсолютным лидером в данной номинации является TabGeo – 1400 запросов в секунду при равных условиях, что в более чем в 1,5 раза лучше, чем Sypex Geo.

Также небольшой прирост производительности дает меньшее количество обращений к диску, сравнение при условии: одно определение страны — один запуск скрипта, показало, что минимальное значение этого параметра у TabGeo – от 1 до 3 дисковых операций, у Sypex Geo – 4 и полным аутсайдером в данном сравнении является GeoIP — от 23 до 52 на одну инициализацию и одно определение страны по ip-адресу.

Немаловажным значением является и размер памяти занимаемый скриптом: TabGeo – 26 Kb, Sypex Geo – 110 Kb и GeoIP – 285 Kb.

Из представленных данных можно сделать вывод, что самое популярное решение геолокации GeoIP – является одновременно и самым худшим для реальных проектов. Sypex Geo – занимает промежуточное положение в данной иерархии. Ну, и абсолютным лидером практически по всем параметрам (из представленных баз) — является TabGeo.

Сайты испытуемых баз:
TabGeo
Sypex Geo
GeoIp
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 34

    0
    TabGeo бесплатный пакет? Как часто обновляется? GeoIP с припиской Lite содержит далеко не полный перечень диапазонов. Платная версия точнее, но удовольствие дорогое
      +1
      Да, бесплатный и безлимитный (можно свободно пихать в проприетарные продукты). Планирую — раз в месяц (ибо неделю парсятся whois-сервера).
      Я сравнивал и равнялся на бесплатные продукты по странам, city-базы не трогал пока.
        +3
        нужен модуль для nginx для этой базы
      0
      Для nodejs руками писать парсер?
        0
        На данный момент только PHP.
        +1
        Скажите, почему у вас весь обзор (сравнение) взято с сайта TabGeo?
        Я как-то надеялся на независимое тестирование, а тут даже данные идентичны.
          0
          мне кажется dostelon и есть автор этой базы :)
            0
            Мне кажется, я достаточно тонко намекнул :)
            +4
            Я — автор данной базы и драйвера.
            Делал бесплатный продукт, который будет лучшим. Обогнать GeoIP не составило труда, а вот с Sypex пришлось постараться: два раза менял структуру базы и раз пять переписывал драйвер. Несколько раз хотел бросать разработку ибо попадал в тупики.
              0
              Тогда извольте поставить тег «Я пиарюсь».
            +2
            А почему код не на GitHub, раз бесплатно? И документация по формату базы не помешала бы, чтобы портировать драйвер на другие языки…
              –2
              Там библиотека из 15 строчек, в принципе и так понятно.
              • UFO just landed and posted this here
              +1
              На TabGeo не хватает демки
                0
                В блоке «Подключение библиотеки TabGeo» на сайте в зоне «output» — там определяется IP и страна. Или имелось в виду что-то другое?
                +1
                Не хватает базы городов.
                  0
                  Города (хотя бы российские) — планируется?
                    0
                    Планируется. Но это титанический труд, так как для страны есть строка «country», а с городами во whois — кто на что горазд (вписывают их и криво, и косо).
                      0
                      Если бы там были именно города… В geoip для Москвы запросто можно встретить Очаково или какое-нибудь Марьино. :)

                      Я в свое время составлял «базы синонимов» по окрестностям долготы-широты (которые на удивление более-менее корректны), получалось вполне приемлемо.
                    +3
                    А как обстоят дела с определением города?
                    Я пока лучшего (наиболее точного) решения чем GeoLite для определения страны + уточнение по базе с ipgeobase.ru для RU локаций не нашел.
                    А так слишком громкий заголовок, если это только для определения страны.
                    На реальных проектах, как раз чаще нужно именно страна+город (гипермаркеты, локальные сервисы обслуживания, доставки, субдомены и т.д.).
                    Лично я ни разу не встречал задачи определить просто страну. Всегда в комплексе.
                      0
                      1. Если слить соседние диапазоны из одной страны в один, то «точность базы» по вашей логике уменьшится, что неправда.
                      2. Приложение на python с загруженной в память базой диапазонов на виртуалке Ubuntu дает примерно сто пятьдесят тысяч ответов на запрос страны по IP в секунду.

                      Для того, чтобы решать только эту задачу (только страна), годятся очень простые и эффективные средства.
                        0
                        В базе все диапазоны склеены. Изначально для этой базы было проанализировано 5 711 790 диапазонов.
                        Интересно, а что выдаст приложение на с++ с загруженной в память базой по сравнению с питоном?
                      0
                      Не планируете ли сделать выгрузку базы в более читабельном виде? Там, конечно, кода на 10 строк и структура понятна, но из плейнтекст-формата было бы удобнее банальным шелл-скриптом генерировать соответствующий блок конфигурации nginx для ngx_http_geo_module, который заведомо быстрее, чем любое решение на php, т.к. все грузится в память на этапе конфигурации nginx.
                      –1
                      Сделайте лучше репозиторий на github и распространяйте через composer.
                        +3
                        Раз уж меня упомянули, прокомментирую :)

                        1. Для начала, так мерять скорость алгоритмов бессмысленно, так как время инициализации скрипта занимает больше времени (причем в десятки раз), чем сам поиск IP. И вполне естественно, что чем менее функциональный php скрипт который нужно подключать, тем больше запросов в секунду он будет выдавать. Особенно, если не использовать кэширование байткода.

                        2. Скорость как-то странно замеряна, похоже у SxGeo включен режим BATCH. Так как при тестировании с помощью ab (с параметрами -n 10000 -c 10, Apache 2.4.9 + PHP 5.5.10) получил результат 1200 SxGeo и 1500 TabGeo. Это без включения OPcache. Если же включить OPcache, то разница становится на уровне погрешности, оба скрипта показывают скорость в районе 2100 запросов в секунду (± 50). Так что, более высокая скорость выполнения TabGeo по сути только благодаря тому, что нужно меньше времени, чтобы интерпретировать php-код, который у TabGeo вполне естественно значительно меньше, так как работает только со странами, одним форматом базы, да и нет даже проверки на валидность IP. К примеру:

                          echo tabgeo_country_v4('33.355.66.77'); // Выдаёт US, без всяких предупреждений или ошибок
                          

                          Но при этом в batch режиме (когда один раз инициализация и много раз поиск IP) SxGeo работает в 5 раз быстрее без кэширования базы, и в 10 раз быстрее с кэшированием базы в памяти.

                        3. Что касается точности, наличие большого количества диапазонов вообще ничего не говорит о точности. А тем более, когда вы берете данные из country в whois. Там зачастую бывает фигня написана. Для примера есть IP в которых указана страна RU, а дальше написано, что это Киев. GeoIP на этом раньше попадались, даже нашли какой-то поселок Киев на Дальнем Востоке.
                          Ну или еще пример 185.89.14.222 у вас он значится, как EU (хотя такой страны нет, и в SxGeo её нет), по сути этот IP просто входит в число IP-блоков принадлежащих RIPE, но он еще никакому реальному пользователю не присвоен. В SxGeo такие блоки считаются пустыми, и не учитываются в статистике.

                        4. SxGeo изначально задумывался под BATCH режим, именно в таком режиме он будет работать, как демон, либо как модуль apache/nginx, а в таком режиме даже без кэширования он работает в 5-10 раз быстрее вашего решения, и на поиск каждого IP нужно лишь одно обращение к диску/кэшу.
                          0
                          По этому и пришлось отказаться от оформления в виде класса, ибо жрет немерено времени и памяти.

                          Кстати, я размышлял: делать мне валидацию ip в функции или нет (одна строчка кода). И посчитал, что ip адрес должен быть провалидирован до передачи в функцию (ибо суть функции совсем не в валидации) и ip может быть использован в дальнейшем коде (или в предшествующем) и именно там надо проверять верность ip. Я бы сказал, что данное различие — идеологическое.

                          Это «мертвые» диапазоны, я посчитал их менее важными, где-то в базе они сохранились где-то нет, а код страны у них обычно возникает из-за склейки диапазонов (в aunic тьма таких мертвых диапазонов) — их отсутствие или наличие ничего не решает, с них никто не придет. Страны EU нет, но код есть (около 1 200 вхождений) — и определить некоторые ip точнее, чем EU — сложно. Тоже самое и с AP.
                          Определение некоторых связок страна-ip, как гадание на кофейной гуще, например, есть пул адресов, которые принадлежат водафону, метка страны у них GB, а используются они в Индии, такое, конечно не часто, но встречается.
                          0
                          del
                            0
                            Если нужна скорость, люди в первую очередь отказываются от php скриптов в пользу C api или к примеру ngx_http_geoip_module. Вот с ними бы и мерялись…
                              0
                              В целом, я за позицию «больше печенек вкусных и разных»…

                              Для меня важно не только страну определять, но и город. Так что пока мимо меня, но начало интригует.
                              Надо отметить, что еще будет сильным аргументом качество данных (а с исходными данными, в этом плане, по России — беда).

                              Пока вижу единственный неоспаримый плюс — возможность простого обновления базы из скрипта. У Sypex'а этого вроде нет.
                                0
                                До городов дело так и не дошло? :) Кстати, а как вы парсите whois? С какого сервиса берёте эту инфу? Может тоже попарсить :)
                                  0
                                  Не подскажите что сейчас с tabgeo стало? Вроде бы сайт не работает, обновлений нет.

                                  Only users with full accounts can post comments. Log in, please.