Довольно часто приходится работать с реально огромными списками сетей. Как пример - можно взять любой IX, я возьму ближайший географически ко мне DATA-IX.
Итак, выдернем все их сети с помощью BGPq3:
Но что если там есть дублирующиеся сети или сети вложенные друг в друга? Это реально сложно проверить и еще сложнее починить "в лоб".
Но есть чудесная тулза - aggregate.
Устанавливаем ее:
Такой же способ оптимизации можно использовать и для FastNetMon, чтобы зазря не выделять память для сетей, которые вложены друг в друга :)
Итак, выдернем все их сети с помощью 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"'Согласитесь, смотрится совершенно неплохо даже на фоне размера всего адресного пространства IPv4.
Total networks size: 410 650 370
Total Internet size: 4 294 967 296
Но что если там есть дублирующиеся сети или сети вложенные друг в друга? Это реально сложно проверить и еще сложнее починить "в лоб".
Но есть чудесная тулза - aggregate.
Устанавливаем ее:
apt-get install -y aggregateИ запускаем аггрегацию:
cat /root/dataix_networks_list.dat| aggregate > /root/dataix_networks_list_aggregated_new.datОна будет потреблять приличное количество CPU ресурсов и будет работать несколько минут:
real 2m29.608sНо на выходе мы получим просто потрясающие результаты! Число сетей сократится в 10 раз:
user 2m29.564s
sys 0m0.012s
wc -l /root/dataix_networks_list_aggregated_new.datА число хостов вдвое:
24628 /root/dataix_networks_list_aggregated_new.dat
Total networks size: 232866112Это особенно актуально, когда Вы сильно стеснены в аппаратных ресурсах (число ACL на свиче, число route префиксов l3 свиче).
Total Internet size: 4294967296
Такой же способ оптимизации можно использовать и для FastNetMon, чтобы зазря не выделять память для сетей, которые вложены друг в друга :)
Удобная утилита, но работает очень долго.
ReplyDeleteАналог на 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