FastNetMon

вторник, 23 июня 2015 г.

Аггрегация огромных сетей

Довольно часто приходится работать с реально огромными списками сетей. Как пример - можно взять любой IX, я возьму ближайший географически ко мне DATA-IX.

Итак, выдернем все их сети с помощью BGPq3:
/opt/bgpq3/bin/bgpq3 AS-DATAIX|awk '{print $5}' > /root/dataix_networks_list.dat
Наберется очень много - 251 тыща сетей:
wc -l /root/dataix_networks_list.dat
251009 /root/dataix_networks_list.dat
Посчитаем, сколько это в хостах:
cat  /root/dataix_networks_list.dat | sed 's#/# #' |awk '{print $2}'|perl -e 'my$total=0; do{ $_ = int($_); next unless $_; $total += 2**(32-$_) } for <>; print "Total networks size: $total\nTotal Internet size: " . 2**32 . "\n"'
Total networks size: 410 650 370
Total Internet size: 4 294 967 296
Согласитесь, смотрится совершенно неплохо даже на фоне размера всего адресного пространства IPv4.

Но что если там есть дублирующиеся сети или сети вложенные друг в друга? Это реально сложно проверить и еще сложнее починить "в лоб".

Но есть чудесная тулза - aggregate.

Устанавливаем ее:
apt-get install -y aggregate
И запускаем аггрегацию:

cat /root/dataix_networks_list.dat| aggregate > /root/dataix_networks_list_aggregated_new.dat
Она будет потреблять приличное количество CPU ресурсов и будет работать несколько минут:
real    2m29.608s
user    2m29.564s
sys    0m0.012s
Но на выходе мы получим просто потрясающие результаты! Число сетей сократится в 10 раз:
wc -l  /root/dataix_networks_list_aggregated_new.dat
24628 /root/dataix_networks_list_aggregated_new.dat
А число хостов вдвое:
Total networks size: 232866112
Total Internet size: 4294967296
Это особенно актуально, когда Вы сильно стеснены в аппаратных ресурсах (число ACL на свиче, число route префиксов l3 свиче).

Такой же способ оптимизации можно использовать и для FastNetMon, чтобы зазря не выделять память для сетей, которые вложены друг в друга :) 



1 комментарий :

  1. Удобная утилита, но работает очень долго.
    Аналог на perl это делает более чем в 100 раз быстрее

    # time cat oix-full-snapshot-latest-networks.dat|cidrmerge.pl > oix-full-aggregated1.dat

    real 0m26.574s
    user 0m26.359s
    sys 0m0.199s

    # time cat oix-full-snapshot-latest-networks.dat|aggregate > oix-full-aggregated2.dat
    aggregate: maximum prefix length permitted will be 32

    real 58m40.039s
    user 58m32.442s
    sys 0m0.174s

    Результаты получились одинаковые:

    # diff oix-full-aggregated1.dat oix-full-aggregated2.dat
    # wc -l oix-full-aggregated1.dat oix-full-aggregated2.dat
    99043 oix-full-aggregated1.dat
    99043 oix-full-aggregated2.dat
    198086 total

    Сам скрипт: https://gist.github.com/yoris/809ad20cff902f015309

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.