Рекомендую всем, что работает с OpenVZ!
Thursday, 29 October 2015
Tuesday, 27 October 2015
Бесплатный журнал Интернет изнутри от MSK-IX
Прошу любить и жаловать всех, кто так или иначе связан с сетью Интернет.
Сетевикам прочтение крайне обязательно: http://www.ccni.ru/download/InternetInside/InternetInside_N1.pdf
Сетевикам прочтение крайне обязательно: http://www.ccni.ru/download/InternetInside/InternetInside_N1.pdf
Thursday, 8 October 2015
Реалии использования динамических библиотек скомпилированных силами Go из С/С++
Всем известно, что начиная с версии 1.5 Golang научился делать бинарные динамические .so библиотеки (go build -buildmode=c-shared -o libgobgp.so *.go), которые можно прилинковать к православному C коду.
Но если копнуть дальше, на деле это не совсем .so библиотека и привычного нам машинного кода там нету.
А есть обертки, которые вызывают код из Golang и подставляют себя С функциями.
Дада, Вы верно догадываетесь, Go's runtime запускается рядом. Не заметить это сложно - появляется 5ка тридов рядом с вашей программой Смайлик «smile»
Но это пол беды - этот рантайм запускается в момент запуска Вашего С-приложения, автоматически.
И если оно форкается или форкается и потом использует popen - горевать Вам очень долго, потому что многопоточное приложение, которым с момента запуска int main стал Ваш любимый софт из-за Go рантайма нельзя форкать, будет все крайне плохо Смайлик «smile»
Я даже молчу, что этот самый Го рантайм подменяет обработчики привычных нам сигналов и заворачивает их на себя, что может вызвать серьезный баттхерт у любителей поиграться с сигналами.
Как чинить? Линковаться динамически в рантайме, силами dlopen/dlsym, как сделал я - тут.
Вот так вот друзья - не все так просто, за все нужно платить Смайлик «smile»После этого фикса все стало работать решительно приличнее, но совершенно никаких гарантий, что так будет и впредь.
Но если копнуть дальше, на деле это не совсем .so библиотека и привычного нам машинного кода там нету.
А есть обертки, которые вызывают код из Golang и подставляют себя С функциями.
Дада, Вы верно догадываетесь, Go's runtime запускается рядом. Не заметить это сложно - появляется 5ка тридов рядом с вашей программой Смайлик «smile»
Но это пол беды - этот рантайм запускается в момент запуска Вашего С-приложения, автоматически.
И если оно форкается или форкается и потом использует popen - горевать Вам очень долго, потому что многопоточное приложение, которым с момента запуска int main стал Ваш любимый софт из-за Go рантайма нельзя форкать, будет все крайне плохо Смайлик «smile»
Я даже молчу, что этот самый Го рантайм подменяет обработчики привычных нам сигналов и заворачивает их на себя, что может вызвать серьезный баттхерт у любителей поиграться с сигналами.
Как чинить? Линковаться динамически в рантайме, силами dlopen/dlsym, как сделал я - тут.
Вот так вот друзья - не все так просто, за все нужно платить Смайлик «smile»После этого фикса все стало работать решительно приличнее, но совершенно никаких гарантий, что так будет и впредь.
Thursday, 27 August 2015
Недостатки используемых в данный момент способов доставки приложений и библиотек
Меня всегда удивлялся идиотическая черта пропагандируемая всеми без исключения дистрибутивами, построенными на бинарных пакетах.
Кто эти люди, кто считает, что старый, неактуальный код полутора летней давности НАДЕЖНЕЕ того же самого кода, который был выправлен от пары-тройки критичных багов, скажем, неделю назад?
Я изо дня в день выбиваю баги, которых нету в актуальной версии библиотеки/программы, но они есть и цветут в красе в той версии, которую сунул чудесный дистрибутиво-собиратель.
Единственные, кто хотя бы отчасти радует в этом мире идиотизма - это Ubuntu LTS, которые нарушили все кармические запреты и обновляют ядро до разумных версий!
Red Hat со своим чудо-ядром класса 2.6.32 на стероидах с тыщей бэкапорт патчей сверху (да пропади оно пропадом сто раз - баголовище и багокостылище) не просто задрал, а задрал - нисказанно Смайлик «smile»
Алсо, друзья, какие выходы из этой патовой ситуации Вы видите?
Мы уже местами упоролись в конец и собираем то-что-нам-нужно (на богобоязныенных Го и Си Плас Плас) вручную и нужных-нам-версий, используя от дистрибутива лишь базовые вещи (хотя под час там даже базовый компилятор - старье и им просто-напросто не собрать актуальный проект, скажем, на С++ 11).
Докеры и прочее прошу не рекомендовать - я хочу решение, а не костыль и желательно без 7ми слоев виртуализаци и изоляции даже если она делается во благо мне Смайлик «smile»
Gentoo/LFS это кому-то может быть и вариант, но не для продакшена явно. Радуют в вопросе CoreOS - но там богобоязнныенне конейнеры и нарушение многих привычных мне парадигм.
Хочется дистибутив, который использует в меру стабильное, но актуальное ядро, имеет полный арсенал языков программирования и ключевых библиотек актуальных стабильных версий (с соотвествующим обновлением).
Но при этом хочется возможности фиксировать библиотеки. Скажем - я опираюсь на xxx, yyy, zzz и просто не хочу получать обновления на их следующие версии, а только обновления, скажем, безопасности.
Из готовых решений имеющих более-менее адекватных разработчиков кеомендую присмотреться к пакетному менеджеру Nix и ОС на его базе - Nix OS.
Также вместо докера с его огромным ворохом проблем рекомендую посмотреть на CoreOS + Rocket (годная и адекватная замена Doker спроектированная инженерами, а не хипстерами).
А что думаете Вы?
Остерегайтесь! Криптеры файлов дошли до мира Linux серверов
Кажется эре наплевательского отношения к безопасности в сфере хостинга наступает конец.
Буквально несколько дней назад столкнулись с о взломами клиентских выделенных серверов и VPS, когда вместо очередного ботнет-контроллера, спам-скрипта или же флудера гостевых книг (c) (tm) появилось нечто новое.
Это "нечто" заимев root полномочия на машине (отдельный вопрос - как, но в целом данный вектор атаки работает даже без рутания) зашифровало к чертям все от начала до конца файлы (а это - десятки гигабайт) на сервере относящиеся к сайтам (текст скриптов) и базам данных (все внутренности mysql) и услужливо разложило везде файлик info с указанием Bitconin кошелька куда класть выкуп если вдруг образовалось желание вернуть свои файлы обратно.
Друзья, искренне рекомендую всем иметь надежный бэкап!
Friday, 24 July 2015
Effectiveness of ZFS usage for OpenVZ
This article is a detailed answer to conversation about simfs vs ploop vs ZFS from OpenVZ maillist.
gzip compression on ZFS
We have enabled ZFS gzip compression and move all data to new created ZFS volume.
And we got following result:
As you can see we save about 160 GB of data. New ZFS size of this data is: 3340 GB, old size: 3500 GB.
lz4 compression on ZFS
So, ZFS developers do not recommend gzip and we will try lzr4 compression as best option.
We copy same data to new ZFS storage with lz4 compression enabled and got following results:
ZFS deduplication
As you know, ZFS has another killer feature - deduplication! And it's best option when we store so much containers with fixed number of distributions (debian, ubuntu, centos).
But please keep in mind, we have disabled compression on this step!
We have enabled deduplication for new storage and copy all production data to new storage with deduplication.
When data copy was finished we got this breath taking results:
We have saved 840 GB of data with deduplication! We are really close to save 1Tb!
For very curious readers I could offer some internal data regarding ZFS dedup:
That's why we have only single file system which ready for 21 century. And ext4 with derivative file systems should be avoided everywhere if possible.
So, will be fine if you help ZFS on Linux community with bug reporting and development!
Because I have finished very detailed tests of ZFS for VPS storage I would like to share they with my Dear Community.
Source data (real clients, real data, different OS templates, different OS templates versions, server running for ~1year, production server full copy):
Size: 5,4T
Used: 3,5T
Avail: 1,7T
Usage:69%
This data from HWN with OpenVZ with ploop.
Our internal toolkit fastvps_ploop_compacter show following details about this server:
Total wasted space due to ploop bugs: 205.1 GbWasted space means difference between real data size and ploop disks size, i.e. ploop overhead.
gzip compression on ZFS
We have enabled ZFS gzip compression and move all data to new created ZFS volume.
And we got following result:
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
data
8
,16T
3
,34T
4
,82T
40
%
1
.00x ONLINE -
As you can see we save about 160 GB of data. New ZFS size of this data is: 3340 GB, old size: 3500 GB.
lz4 compression on ZFS
So, ZFS developers do not recommend gzip and we will try lzr4 compression as best option.
We copy same data to new ZFS storage with lz4 compression enabled and got following results:
ALLOC: 2,72TbWow! Amazing! We save about 600 Gb of data! Really!
ZFS deduplication
As you know, ZFS has another killer feature - deduplication! And it's best option when we store so much containers with fixed number of distributions (debian, ubuntu, centos).
But please keep in mind, we have disabled compression on this step!
We have enabled deduplication for new storage and copy all production data to new storage with deduplication.
When data copy was finished we got this breath taking results:
zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
data
8
,16T
2
,53T
5
,62T
31
%
1
.33x ONLINE -
We have saved 840 GB of data with deduplication! We are really close to save 1Tb!
For very curious readers I could offer some internal data regarding ZFS dedup:
zdb -D dataZFS compression and deduplication simultaneously
DDT-sha256-zap-duplicate: 5100040 entries, size 581 on disk, 187 in core
DDT-sha256-zap-unique: 27983716 entries, size 518 on disk, 167 in core
dedup = 1.34, compress = 1.00, copies = 1.02, dedup * compress / copies = 1.31
So, ZFS is amazingly flexible and we could use compression and dedulication in same time and got even more storage save. And this tests is your own home task :) Please share your results here!
ConclusionSo, will be fine if you help ZFS on Linux community with bug reporting and development!
Tuesday, 7 July 2015
How to enable Autonomus System Lookup for tshark/wireshark?
In article http://www.stableit.ru/2015/04/how-to-enable-geoip-support-in-tshark.html we discuss GeoIP feature. If you interested in AS numbers of client hosts, please execute this reference.
Install GeoIP:
Install GeoIP:
apt-get install -y geoip-databaseThen download ASN database:
wget http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gzThen you should specify folder with GeoIP databases to Wireshark:
gunzip GeoIPASNum.dat.gz
mv GeoIPASNum.dat /usr/share/GeoIP/
mkdir -p ~/.wiresharkLet's start:
echo '"/usr/share/GeoIP"' > ~/.wireshark/geoip_db_paths
tshark -i eth0 -n -T fields -e ip.geoip.src_asnum -o "ip.use_geoip: TRUE"And you will get following output:
AS60781 LeaseWeb B.V.
AS34757 Sibirskie Seti Ltd.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS60781 LeaseWeb B.V.
AS200000 Hosting Ukraine LTD
AS60781 LeaseWeb B.V.
AS23947 PT.Mora Telematika Indonesia
AS60781 LeaseWeb B.V.
AS2914 NTT America, Inc.
AS60781 LeaseWeb B.V.
AS18881 Global Village Telecom
Saturday, 4 July 2015
Селективный блэкхол
Видимо, пошло оно от selective blackhole. На удивление недавно (на ENOG9) обнаружил, что термин частенько не понимается многими и вовсе не является обще принятым :)
Что же он означает? Речь идет о RTBH (remote triggered black hole), который обычно висит на BGP комьюнити 666. При его активации он блокирует весь трафик с/на узел.
Селективный же блокирует либо заданный протокол (часто - UDP) либо же набор протоколов по определенным параметрам (например, популярные UDP амплификаторы).
Операторы, кто поддерживает это дело - редки, делимся в комментах :)
Что же он означает? Речь идет о RTBH (remote triggered black hole), который обычно висит на BGP комьюнити 666. При его активации он блокирует весь трафик с/на узел.
Селективный же блокирует либо заданный протокол (часто - UDP) либо же набор протоколов по определенным параметрам (например, популярные UDP амплификаторы).
Операторы, кто поддерживает это дело - редки, делимся в комментах :)
Tuesday, 23 June 2015
Настройка роутинг демона BIRD для экспорта содержимого локальной роутинг таблицы по BGP
Все тесты будут вестись на CentOS 6 :)
Итак, установим Bird:
Откроем его конфиг:
И закомментируем там все, что нам не закомментировано дабы избежать конфликтов.
После этого забиваем следующий конфиг:
После этого применяем изменения (в лоб, потому что тесты. В продакшене нужно делать через birdc):
Убеждаемся, что BGP сессия поднялась:
Все! :)
Итак, установим Bird:
yum install -y bird
Откроем его конфиг:
vim /etc/bird.conf
И закомментируем там все, что нам не закомментировано дабы избежать конфликтов.
После этого забиваем следующий конфиг:
protocol kernel {Данный конфиг приводит к тому, что будет установлена BGP сессия с заданным узлом и в нее будут проанонсированы все маршруты из локальной таблицы Linux (в моем случае это маршруты до OpenVZ VPS).
persist; # Don't remove routes on bird shutdown
learn; # Learn all alien routes from the kernel
export none; # Default is export none
import all;
scan time 20; # Scan kernel routing table every 20 seconds
device routes yes;
}
protocol device {
scan time 10; # Scan interfaces every 10 seconds
}
filter test_filter {
# filter out private subnets
if net ~ 10.0.0.0/8 then reject;
if net ~ 192.168.0.0/16 then reject;
if net ~ 172.16.0.0/12 then reject;
# filter link local for IPv4
if net ~ 169.254.0.0/16 then reject;
accept;
}
protocol bgp {
local as 65000;
source address 10.0.131.2;
# do not connect to remote peers, work as route server now!
# passive;
import all;
export filter test_filter;
neighbor 10.0.129.2 as 65000;
}
После этого применяем изменения (в лоб, потому что тесты. В продакшене нужно делать через birdc):
/etc/init.d/bird restart
Убеждаемся, что BGP сессия поднялась:
show protocols all bgp1
name proto table state since info
bgp1 BGP master up 15:07:32 Established
Preference: 100
Input filter: ACCEPT
Output filter: test_filter
Routes: 0 imported, 27 exported, 0 preferred
Route change stats: received rejected filtered ignored accepted
Import updates: 0 0 0 0 0
Import withdraws: 0 0 --- 0 0
Export updates: 29 0 2 --- 27
Export withdraws: 0 --- --- --- 0
BGP state: Established
Neighbor address: 10.0.129.2
Neighbor AS: 65000
Neighbor ID: 10.0.129.2
Neighbor caps: AS4
Session: internal multihop AS4
Source address: 10.0.131.2
Hold timer: 109/180
Keepalive timer: 2/60
Все! :)
Аггрегация огромных сетей
Довольно часто приходится работать с реально огромными списками сетей. Как пример - можно взять любой 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, чтобы зазря не выделять память для сетей, которые вложены друг в друга :)
Generate BGP filters with BGPQ3
Build it:
Great thanks to author, Alexander Snarski.
Official site: here.
В случае ошибки:
cd /tmpGenerate filter list by ASN (actually you could use AS-SET here too):
wget http://snar.spb.ru/prog/bgpq3/bgpq3-0.1.31.tgz
tar -xvzf bgpq3-0.1.31.tgz
cd bgpq3-0.1.31/
./configure --prefix=/opt/bgpq3
sudo mkdir -p /opt/bgpq3/bin
sudo make install
/opt/bgpq3/bin/bgpq3 AS24940This toolkit supports so much options for diffrent vendors (and even json!).
no ip prefix-list NN
ip prefix-list NN permit 5.9.0.0/16
ip prefix-list NN permit 46.4.0.0/16
ip prefix-list NN permit 78.46.0.0/15
ip prefix-list NN permit 85.10.192.0/18
ip prefix-list NN permit 88.198.0.0/16
ip prefix-list NN permit 91.220.49.0/24
ip prefix-list NN permit 91.233.8.0/22
ip prefix-list NN permit 136.243.0.0/16
ip prefix-list NN permit 138.201.0.0/16
ip prefix-list NN permit 144.76.0.0/16
ip prefix-list NN permit 148.251.0.0/16
ip prefix-list NN permit 176.9.0.0/16
ip prefix-list NN permit 176.102.168.0/21
ip prefix-list NN permit 178.63.0.0/16
ip prefix-list NN permit 185.12.64.0/22
ip prefix-list NN permit 185.50.120.0/23
ip prefix-list NN permit 188.40.0.0/16
ip prefix-list NN permit 193.25.170.0/23
ip prefix-list NN permit 193.28.90.0/24
ip prefix-list NN permit 193.110.6.0/23
ip prefix-list NN permit 193.223.77.0/24
ip prefix-list NN permit 194.42.180.0/22
ip prefix-list NN permit 194.42.184.0/22
ip prefix-list NN permit 194.145.226.0/24
ip prefix-list NN permit 195.248.224.0/24
ip prefix-list NN permit 197.242.84.0/22
ip prefix-list NN permit 213.133.96.0/19
ip prefix-list NN permit 213.169.144.0/22
ip prefix-list NN permit 213.239.192.0/18
Great thanks to author, Alexander Snarski.
Official site: here.
В случае ошибки:
FATAL ERROR:Partial write to radb, only 7 bytes written: Connection reset by peerНа Linux делаем вот так:
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.core.rmem_max=33554432
sysctl -w net.core.wmem_max=33554432
sysctl -w net.ipv4.tcp_rmem="4096 87380 33554432"
sysctl -w net.ipv4.tcp_wmem="4096 65536 33554432"
Saturday, 20 June 2015
How to run netmap on single queue and use another queues for Linux stack
Hello, folks!
I will do some ixgbe magic here! Please stay tuned =)
Here I could provide short reference about netmap compilation with patched ixgbe driver.
First of all you should get my patched driver. In this driver I have assigned first (0) queue to netmap and assigned another queues to Linux network stack.
Get driver sources and put they to "fake" Linux kernel source tree (netmap build system expect this):
We should check it. For tests I will use flow director and flow all udp packets to 53 port to first queue:
Please compule test netmap receiver:
Yes, we are ready for tests!
Please run linux network stack receiver app in one console session:
And netmap reciver app in another console session:
For udp packets generation you could use nc:
And you will saw:
Folks, be aware. This patch is very rude and not tested well. And we need some way for detaching this queue from Linux side because for ICMP packets case Linux try to send reply packets over detached queue. Haha, actually, we could do it very simple. We could disable tx queue detaching and use it for Linux.
And we need do some custom RING number tuning for ixgbe driver.
Finalyly, this approach working but need some enhancements :)
I will do some ixgbe magic here! Please stay tuned =)
Here I could provide short reference about netmap compilation with patched ixgbe driver.
First of all you should get my patched driver. In this driver I have assigned first (0) queue to netmap and assigned another queues to Linux network stack.
Get driver sources and put they to "fake" Linux kernel source tree (netmap build system expect this):
cd /usr/srcLet's get netmap:
mkdir -p /usr/src/fake_linux_kernel_sources/drivers/net/ethernet/intel
cd /usr/src/fake_linux_kernel_sources/drivers/net/ethernet/intel
git clone https://github.com/pavel-odintsov/ixgbe-linux-netmap-single-queue.git ixgbe_temp
mv ixgbe_temp/ixgbe-3.23.2.1/src/ ixgbe
cd /usr/srcDo some netmap patching:
git clone https://github.com/luigirizzo/netmap.git -b next
cd netmap/LINUX/
sed -i 's/#define ixgbe_driver_name netmap_ixgbe_driver_name/\/\/\0/' ixgbe_netmap_linux.hLet's compile it:
sed -i 's/^char ixgbe_driver_name\[\]/\/\/\0/' ixgbe_netmap_linux.h
sed -i '/$t\s\{1,\}if \[ \-f patches/d' configure
./configure --kernel-sources=/usr/src/fake_linux_kernel_sources --drivers=ixgbeUnload old ixgbe not patched driver:
make
rmmod ixgbeLoad netmap:
insmod /usr/src/netmap/LINUX/netmap.koWell, we have netmap which could process only first NIC hardware queue.
insmod /usr/src/netmap/LINUX/ixgbe/ixgbe.ko
We should check it. For tests I will use flow director and flow all udp packets to 53 port to first queue:
ethtool -K eth5 ntuple onThen we should built test environment.
ethtool --config-ntuple eth5 flow-type udp4 dst-port 53 action 0
Please compule test netmap receiver:
cd /usr/src/netmap/examples/
make
Yes, we are ready for tests!
Please run linux network stack receiver app in one console session:
tcpdump -n -i eth5
And netmap reciver app in another console session:
/usr/src/netmap/examples/pkt-gen -f rx -X -i netmap:eth5Actually, we need external machine and please start pinging of target host from it and let's send udp packet to it from another session.
For udp packets generation you could use nc:
echo asdasda| nc -u 10.10.10.221 53
And you will saw:
./pkt-gen -f rx -i netmap:eth5 -XAnd in tcpdump window:
689.290532 main [1651] interface is netmap:eth5
689.290977 extract_ip_range [288] range is 10.0.0.1:0 to 10.0.0.1:0
689.291015 extract_ip_range [288] range is 10.1.0.1:0 to 10.1.0.1:0
689.517212 main [1848] mapped 334980KB at 0x7fcf508ea000
Receiving from netmap:eth5: 1 queues, 1 threads and 1 cpus.
689.517331 main [1910] --- SPECIAL OPTIONS:
689.517345 main [1934] Wait 2 secs for phy reset
691.517508 main [1936] Ready...
691.517870 nm_open [456] overriding ifname eth5 ringid 0x0 flags 0x1
691.522007 receiver_body [1184] reading from netmap:eth5 fd 4 main_fd 3
692.523020 main_thread [1448] 0 pps (0 pkts in 1001104 usec)
692.525560 receiver_body [1191] waiting for initial packets, poll returns 0 0
693.524487 main_thread [1448] 0 pps (0 pkts in 1001468 usec)
693.528806 receiver_body [1191] waiting for initial packets, poll returns 0 0
694.525850 main_thread [1448] 0 pps (0 pkts in 1001363 usec)
694.532073 receiver_body [1191] waiting for initial packets, poll returns 0 0
695.526988 main_thread [1448] 0 pps (0 pkts in 1001137 usec)
695.535358 receiver_body [1191] waiting for initial packets, poll returns 0 0
696.528438 main_thread [1448] 0 pps (0 pkts in 1001450 usec)
696.538669 receiver_body [1191] waiting for initial packets, poll returns 0 0
697.529608 main_thread [1448] 0 pps (0 pkts in 1001170 usec)
697.542189 receiver_body [1191] waiting for initial packets, poll returns 0 0
698.530749 main_thread [1448] 0 pps (0 pkts in 1001141 usec)
698.545628 receiver_body [1191] waiting for initial packets, poll returns 0 0
699.531875 main_thread [1448] 0 pps (0 pkts in 1001126 usec)
699.549208 receiver_body [1191] waiting for initial packets, poll returns 0 0
700.532999 main_thread [1448] 0 pps (0 pkts in 1001124 usec)
700.552431 receiver_body [1191] waiting for initial packets, poll returns 0 0
ring 0x7fcf50954000 cur 0 [buf 4611 flags 0x0000 len 60]
0: 90 e2 ba 83 3f 25 90 e2 ba 78 26 8d 08 00 45 00 ....?%...x&...E.
16: 00 24 ce 85 40 00 40 11 43 49 0a 0a 0a 0a 0a 0a .$..@.@.CI......
32: 0a dd ed 13 00 35 00 10 4f 47 61 73 64 61 73 64 .....5..OGasdasd
48: 61 0a 00 00 00 00 00 00 00 00 00 00
701.534128 main_thread [1448] 1 pps (1 pkts in 1001129 usec)
702.535260 main_thread [1448] 0 pps (0 pkts in 1001132 usec)
703.536380 main_thread [1448] 0 pps (0 pkts in 1001120 usec)
tcpdump -n -i eth5As you can see. Linux haven't saw UDP packets to 53 port but still process icmp packets. Everything works well! Hurra!
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth5, link-type EN10MB (Ethernet), capture size 262144 bytes
08:01:36.520074 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 21, length 64
08:01:36.520114 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 21, length 64
08:01:37.519971 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 22, length 64
08:01:37.520009 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 22, length 64
08:01:38.520028 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 23, length 64
08:01:38.520060 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 23, length 64
08:01:39.520091 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 24, length 64
08:01:39.520130 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 24, length 64
08:01:40.520096 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 25, length 64
08:01:40.520134 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 25, length 64
08:01:41.520030 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 26, length 64
08:01:41.520064 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 26, length 64
08:01:42.520016 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 27, length 64
08:01:42.520053 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 27, length 64
08:01:43.520086 IP 10.10.10.10 > 10.10.10.221: ICMP echo request, id 6581, seq 28, length 64
08:01:43.520125 IP 10.10.10.221 > 10.10.10.10: ICMP echo reply, id 6581, seq 28, length 64
^C
16 packets captured
16 packets received by filter
0 packets dropped by kernel
Folks, be aware. This patch is very rude and not tested well. And we need some way for detaching this queue from Linux side because for ICMP packets case Linux try to send reply packets over detached queue. Haha, actually, we could do it very simple. We could disable tx queue detaching and use it for Linux.
And we need do some custom RING number tuning for ixgbe driver.
Finalyly, this approach working but need some enhancements :)
Friday, 19 June 2015
Сборка libbgpdump на Debian 8 Jessy
Офсайт: http://www.ris.ripe.net/source/bgpdump/
apt-get install -y libbz2-dev zlib1g-devДобавляем:
cd /usr/src
wget http://www.ris.ripe.net/source/bgpdump/libbgpdump-1.4.99.15.tgz
tar -xf libbgpdump-1.4.99.15.tgz
cd libbgpdump-1.4.99.15
./configure --prefix=/opt/libbgpdump
make install
echo "/opt/libbgpdump/lib" > /etc/ld.so.conf.d/libbgpdump.conf
ldconfigВызываем:
/opt/libbgpdump/bin/bgpdump
Самый простой способ использовать новое ядро в Debian Jessie - взять из Sid
Друзья! Этот вариант для суровых экспериментаторов, которые знают, как починить систему после такого вандализма! Если Вы не знаете - то и ядро Вам обновлять не нужно, честно говорю!
Скачать отсюда: https://packages.debian.org/sid/amd64/linux-image-4.0.0-2-amd64/download
Так:
И поставить через:
Скачать отсюда: https://packages.debian.org/sid/amd64/linux-image-4.0.0-2-amd64/download
Так:
wget http://ftp.us.debian.org/debian/pool/main/l/linux/linux-headers-4.0.0-2-amd64_4.0.5-1_amd64.deb
wget http://ftp.us.debian.org/debian/pool/main/l/linux/linux-image-4.0.0-2-amd64_4.0.5-1_amd64.deb
wget http://ftp.us.debian.org/debian/pool/main/l/linux/linux-compiler-gcc-4.9-x86_4.0.5-1_amd64.deb
wget http://ftp.us.debian.org/debian/pool/main/l/linux/linux-headers-4.0.0-2-common_4.0.5-1_amd64.deb
wget http://ftp.us.debian.org/debian/pool/main/l/linux-tools/linux-kbuild-4.0_4.0.2-1_amd64.deb
И поставить через:
dpkg -i linux-compiler-gcc-4.9-x86_4.0.5-1_amd64.deb linux-kbuild-4.0_4.0.2-1_amd64.deb
dpkg -i linux-image-4.0.0-2-amd64_4.0.5-1_amd64.deb
dpkg -i linux-headers-4.0.0-2-common_4.0.5-1_amd64.deb
dpkg -i linux-headers-4.0.0-2-amd64_4.0.5-1_amd64.deb
Tuesday, 16 June 2015
How to run netmap on ixgbe Virtual Function on Debian 8 Jessie
UPDATE: folks, please be AWARE! In this mode netmap working only in single-copy mode and will not work enough fast (1-2 mpps is a limit). For full support we need another patch for ixgbevf driver.
If you want zero copy support, please poke netmap guys here: https://github.com/luigirizzo/netmap/issues/63
First of all, install Netmap and ixgbe module: http://www.stableit.ru/2014/10/netmap-debian-7-wheezy-intel-82599.html
Please add this code to /etc/rc.local (please remove -e flag from /bin/sh in first line of /etc/rc.local):
Then, I have physical NIC eth6 which represented as 2 virtual NICs (ip link show):
If you want zero copy support, please poke netmap guys here: https://github.com/luigirizzo/netmap/issues/63
First of all, install Netmap and ixgbe module: http://www.stableit.ru/2014/10/netmap-debian-7-wheezy-intel-82599.html
Please add this code to /etc/rc.local (please remove -e flag from /bin/sh in first line of /etc/rc.local):
insmod /usr/src/netmap/LINUX/netmap.koAnd reload server!
modprobe mdio
modprobe ptp
modprobe dca
insmod /usr/src/netmap/LINUX/ixgbe/ixgbe.ko max_vfs=2,2
insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/ixgbevf/ixgbevf.ko
Then, I have physical NIC eth6 which represented as 2 virtual NICs (ip link show):
8: eth6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000Then, I configure MAC's for both virtual functions:
link/ether 90:e2:ba:4a:d8:e8 brd ff:ff:ff:ff:ff:ff
vf 0 MAC 90:e2:ba:55:aa:bb, spoof checking on, link-state auto
vf 1 MAC 90:e2:ba:55:bb:cc, spoof checking on, link-state auto
15: eth10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 90:e2:ba:55:aa:bb brd ff:ff:ff:ff:ff:ff
16: eth11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 90:e2:ba:55:bb:cc brd ff:ff:ff:ff:ff:ff
ip link set eth6 vf 0 mac 90:e2:ba:55:aa:bbAnd reload ixgbevf driver (required for configuration):
ip link set eth6 vf 1 mac 90:e2:ba:55:bb:cc
rmmod ixgbevfAfter this operations all interfaces become ready:
modprobe ixgbevf
ethtool eth6And run pkt-get example app on ixgbe VF:
Settings for eth6:
Supported ports: [ FIBRE ]
Supported link modes: 1000baseT/Full
10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 1000baseT/Full
10000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Speed: 10000Mb/s
Duplex: Full
Port: FIBRE
PHYAD: 0
Transceiver: external
Auto-negotiation: on
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
root@filteredclient ~ # ethtool eth10
Settings for eth10:
Supported ports: [ ]
Supported link modes: 10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: No
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Speed: 10000Mb/s
Duplex: Full
Port: Other
PHYAD: 0
Transceiver: Unknown!
Auto-negotiation: off
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
root@filteredclient ~ # ethtool eth11
Settings for eth11:
Supported ports: [ ]
Supported link modes: 10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: No
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Speed: 10000Mb/s
Duplex: Full
Port: Other
PHYAD: 0
Transceiver: Unknown!
Auto-negotiation: off
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
./pkt-gen -f rx -i netmap:eth10
361.732713 main [1651] interface is netmap:eth10
361.733491 extract_ip_range [288] range is 10.0.0.1:0 to 10.0.0.1:0
361.733506 extract_ip_range [288] range is 10.1.0.1:0 to 10.1.0.1:0
361.734155 main [1848] mapped 334980KB at 0x7f5f9804f000
Receiving from netmap:eth10: 1 queues, 1 threads and 1 cpus.
361.734182 main [1934] Wait 2 secs for phy reset
363.734288 main [1936] Ready...
363.734328 nm_open [456] overriding ifname eth10 ringid 0x0 flags 0x1
363.734384 receiver_body [1184] reading from netmap:eth10 fd 4 main_fd 3
364.735415 main_thread [1448] 3 pps (3 pkts in 1001042 usec)
365.736481 main_thread [1448] 1 pps (1 pkts in 1001065 usec)
366.737542 main_thread [1448] 1 pps (1 pkts in 1001061 usec)
^C367.134692 main_thread [1448] 0 pps (0 pkts in 397151 usec)
Subscribe to:
Posts
(
Atom
)