FastNetMon

Friday, 15 November 2013

Проблемы с unordered_map в C++/11 на Debian Wheezy

Вот решил оптимизировать свой код, а он мне в ответ сегфолтами:
(gdb) core core
[New LWP 13007]
[New LWP 13002]
[New LWP 13006]
warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./fastnetmon'.
Program terminated with signal 11, Segmentation fault.
#0  0x000000000040e80a in std::__detail::_Hash_code_base<unsigned int, std::pair<unsigned int const, map_element>, std::_Select1st<std::pair<unsigned int const, map_element> >, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false> const*, unsigned long) const ()
То есть, ошибка где-то во внутренностях реализации хширования unordered_map.

А вот такой бэктрейс:
#0  0x000000000040e80a in std::__detail::_Hash_code_base<unsigned int, std::pair<unsigned int const, map_element>, std::_Select1st<std::pair<unsigned int const, map_element> >, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false> const*, unsigned long) const ()
(gdb) bt
#0  0x000000000040e80a in std::__detail::_Hash_code_base<unsigned int, std::pair<unsigned int const, map_element>, std::_Select1st<std::pair<unsigned int const, map_element> >, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false> const*, unsigned long) const ()
#1  0x000000000040b485 in std::_Hashtable<unsigned int, std::pair<unsigned int const, map_element>, std::allocator<std::pair<unsigned int const, map_element> >, std::_Select1st<std::pair<unsigned int const, map_element> >, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false>*) const ()
#2  0x00000000004093f8 in std::_Hashtable<unsigned int, std::pair<unsigned int const, map_element>, std::allocator<std::pair<unsigned int const, map_element> >, std::_Select1st<std::pair<unsigned int const, map_element> >, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>::count(unsigned int const&) const ()
#3  0x0000000000405c45 in parse_packet(unsigned char*, pcap_pkthdr*, unsigned char const*) ()
#4  0x0000000000406a8f in ulog_main_loop() ()
#5  0x0000000000417a63 in _ZNSt12_Bind_simpleIFPFvvEvEE9_M_invokeIJEEEvSt12_Index_tupleIJXspT_EEE ()
#6  0x00000000004179b3 in std::_Bind_simple<void (*())()>::operator()() ()
#7  0x0000000000417908 in std::thread::_Impl<std::_Bind_simple<void (*())()> >::_M_run() ()
#8  0x00007ff89362c400 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ff893a8eb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#10 0x00007ff892e2ea7d in clone () from /lib/x86_64-linux-gnu/libc.so.6
#11 0x0000000000000000 in ?? ()

Включение крэш дампов процессов для PHP-FPM на Debian Wheezy

Открываем настройки пула (обычно: /etc/php5/fpm/pool.d/www.conf ) и задаем там параметр:
rlimit_core = unlimited

Профайлинг кода на С/С++ на Linux

Довольно прост как и все на Linux :)

Для начала нужно для g++/gcc добавить флаги для сборки: -g -pg

После этого запустить программу, погонять приличное время и обнаружить в папке программы файлик gmon.out. Который в свою очередь можно прочесть программой:  gprof ./имя_отлаживаемой_программы.


Thursday, 14 November 2013

Еще одна причина использовать clang++ вместо g++


Сравните выдачу g++ при малюсенькой ошибке в шаблонах:
ip_lookup.cpp: In function ‘void insert_prefix_bitwise_tree(tree_leaf*, std::string, int)’:
ip_lookup.cpp:116:45: error: no match for ‘operator&’ in ‘std::cout.std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >(netmask_as_int) & (1 << i)’
ip_lookup.cpp:116:45: note: candidates are:
In file included from /usr/include/c++/4.7/ios:43:0,
                 from /usr/include/c++/4.7/ostream:40,
                 from /usr/include/c++/4.7/iostream:40,
                 from ip_lookup.cpp:1:
/usr/include/c++/4.7/bits/ios_base.h:77:3: note: std::_Ios_Fmtflags std::operator&(std::_Ios_Fmtflags, std::_Ios_Fmtflags)
/usr/include/c++/4.7/bits/ios_base.h:77:3: note:   no known conversion for argument 1 from ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ to ‘std::_Ios_Fmtflags’
/usr/include/c++/4.7/bits/ios_base.h:117:3: note: std::_Ios_Openmode std::operator&(std::_Ios_Openmode, std::_Ios_Openmode)
/usr/include/c++/4.7/bits/ios_base.h:117:3: note:   no known conversion for argument 1 from ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ to ‘std::_Ios_Openmode’
/usr/include/c++/4.7/bits/ios_base.h:155:3: note: std::_Ios_Iostate std::operator&(std::_Ios_Iostate, std::_Ios_Iostate)
/usr/include/c++/4.7/bits/ios_base.h:155:3: note:   no known conversion for argument 1 from ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ to ‘std::_Ios_Iostate’
In file included from ip_lookup.cpp:96:0:
/usr/include/c++/4.7/bitset:1418:5: note: template<long unsigned int _Nb> std::bitset<_Nb> std::operator&(const std::bitset<_Nb>&, const std::bitset<_Nb>&)
/usr/include/c++/4.7/bitset:1418:5: note:   template argument deduction/substitution failed:
ip_lookup.cpp:116:45: note:   ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ is not derived from ‘const std::bitset<_Nb>’



И выдачу clang (он ее еще посдсветил!!!):
clang ip_lookup.cpp -g -pg
ip_lookup.cpp:116:36: error: invalid operands to binary expression ('__ostream_type'
      (aka 'basic_ostream<char, std::char_traits<char> >') and 'int')
        std::cout<< netmask_as_int & (1 << i);
        ~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~
/usr/include/c++/4.6/bits/ios_base.h:76:3: note: candidate function not viable: no known conversion from '__ostream_type' (aka
      'basic_ostream<char, std::char_traits<char> >') to 'std::_Ios_Fmtflags' for 1st argument;
  operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
  ^
/usr/include/c++/4.6/bits/ios_base.h:116:3: note: candidate function not viable: no known conversion from '__ostream_type' (aka
      'basic_ostream<char, std::char_traits<char> >') to 'std::_Ios_Openmode' for 1st argument;
  operator&(_Ios_Openmode __a, _Ios_Openmode __b)
  ^
/usr/include/c++/4.6/bits/ios_base.h:154:3: note: candidate function not viable: no known conversion from '__ostream_type' (aka
      'basic_ostream<char, std::char_traits<char> >') to 'std::_Ios_Iostate' for 1st argument;
  operator&(_Ios_Iostate __a, _Ios_Iostate __b)
  ^
/usr/include/c++/4.6/bitset:1408:5: note: candidate template ignored: failed template argument deduction
    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y)

Версии (Debian Wheezy):
clang -v
Debian clang version 3.0-6.2 (tags/RELEASE_30/final) (based on LLVM 3.0) 
gcc  --version
gcc (Debian 4.7.2-5) 4.7.2

Sunday, 10 November 2013

Использование go на CentOS 5 и 6

На удивление фича статической компиляции используемая в языке Go дала огромные преимущества - будучи скомпилировал на CentOS 6 он отлично и без каких-либо проблем вообще запустился на CentOS 5!!! :)

[root@ovz ~]# cat /etc/issue
CentOS release 5.10 (Final)
Kernel \r on an \m
[root@ovz ~]# uname -a
Linux ovz.fastvps.ru 2.6.32-042stab079.6 #1 SMP Mon Aug 26 19:47:50 MSK 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@ovz ~]# file -s ./hello
./hello: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), statically linked, not stripped
[root@ovz ~]# ./hello
hello, world 

Friday, 8 November 2013

Установка samba сервера на Debian 7 Squeeze

В статье будет рассмотрено использование SAMBA как хранилища файлов в режиме "только чтение".

Стягиваем репозитории:
apt-get update -y

Ставим samba сервер:
apt-get install -y samba samba-common-bin

Также для тестов ставим клиент:
apt-get install -y smbclient

Соглашаемся с именем рабочей группы "WORKGROUP", далее оказываемся от "Modify smb.conf to use WINS settings from DHCP?".

Убеждаемся, что samba запустилась и слушает 139 и 445 порты:
netstat -lnpt | grep smb
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 11104/smbd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 11104/smbd

Теперь самбу нужно сконфигурировать:
vi /etc/samba/smb.conf

Там в самом низу находим заголовки "[printers]" и "[print$]" и полностью комментируем как заголовки, так и содержимое блока диезом (#). Тоже самое делаем с блоком [homes] (отключаем шары для юзеров системы).

А теперь в самый низ добавляем нашу шару:
[fileserver]
comment = Some files
read only = yes
locking = no
path = /var/smbshare
guest ok = yes
Или если требуется запись: read only = no. guest ok дает доступ любому юзеру. Если хотите разрешите заданному юзеру: valid users = имя_системного_юзера. А потом задать ему повторно пароль: smbpasswd -a megaplan (пароль будет отличаться от системного, так используются иные механизмы)

Создаем папку для хранения файлов:
mkdir /var/smbshare

Кладем тестовый файл в папку:
touch /var/smbshare/testfile

Перезапускаем самбу:
/etc/init.d/samba restart

Теперь попробуем запросить листинг ресурсов, доступных на нашем сервере посредством smbclient:
smbclient -L xx.xx.xx.xx -N
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]

Sharename Type Comment
--------- ---- -------
fileserver Disk Some files
IPC$ IPC IPC Service (test server)
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]

Server Comment
--------- -------
test test server

Workgroup Master
--------- -------
WORKGROUP


Теперь подключаемся к ресурсу fileserver и пробуем скачать файл:
smbclient \\\\xx.xx.xx.xx\\fileserver -N
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]
smb: \> dir
. D 0 Tue Nov 9 02:40:35 2010
.. D 0 Tue Nov 9 02:39:13 2010
testfile 0 Tue Nov 9 02:40:35 2010

34286 blocks of size 16777216. 31219 blocks available
smb: \> get testfile
getting file \testfile of size 0 as testfile (0.0 kb/s) (average 0.0 kb/s)
smb: \>


Ну вот и все :)

По материалам: http://linux.byexamples.com/archives/99/access-windows-through-samba-using-smbclient/

Wednesday, 6 November 2013

Установка Adobe Crossdomain Policy силами nginx

Свитч D-Link DXS-3600-32S опыт тестирования

Друзья!

Кому лень читать - НЕ ВЗДУМАЙТЕ КУПИТЬ ЭТОТ УЖАС!!!! 

Сразу оговорюсь - речь про 32х портовый SFP+ (10 гигабит) оптический свитч производства D-Link.

Мы почти месяц тестировали данное устройство (хочется сказать что-то обидное про этот чудесный 10 гигабитный свич). Такого феерического фейерверка багов за 10 тысяч евро мы не видели ни разу.

У нас была ревизия А, так вот - оно чуть менее непотребно чем полностью. Все жалобы на откровенную неработоспособность тривиальнейших фич - "обратитесь в сервис для замены устройства".

Это пол беды - даже заменив устройство на более-менее удачную версию железа B Вы все равно огребете кучу фич в стиле "ой, а эта фича заявлена, но будет только в прошивке через полгода". Вот, зацените: http://forum.dlink.ru/viewtopic.php?f=2&t=162528

Да и вообще поиск по модели свича несет немыслимое число лулзов.

Друзья! НИКОГДА, НИКОГДА не смотрите в сторону этого дивайса. Такого откровенного плевка в потребителей на моей практике (не сильно короткой, к слову) не допускала ни единая компания, даже производящая роутеры за 500 рублей.

Чем заменить? Смотрите на продукцию Extreme серии x670 (почти месяц очень серьезных тестов и пара мелких неудобств), самое смешное, что стоит она дешевле, а уровень надежности и число фич - просто поражают (кто хочет реальный подробный фидбэк - в комментарии, попробуем свой опыт формализовать). 

Tuesday, 5 November 2013

Roadmap RHEL 7, куча всяких ништяков!

http://rhsummit.files.wordpress.com/2012/03/burke_rhel_roadmap.pdf

Кратко:

  1. Будет возможность апгрейда с RHEL 6 без переустановки! 
  2. KVM Exceptional features – Same OS for the host/guest
  3. Production ready LXC!
  4. Поддержка libteam! Новая, суперская реализация bonding! 
  5. Systemd - и сокращение времени загрузки вдвое!
  6. Большая работа по поддержке ARM в  Fedora!
  7. Поддержка создания RAID 4,5,6 силами LVM
  8. Новая реализация LVM снапшотов
  9. libStorageMgmt - API управления внешними системам хранения
  10. Полная поддержка BTRFS
  11. Официальная поддержка ext4 размером до 16 Тб
  12. Официальная поддержка XFS до 500 Тб
  13. Официальная поддержка GFS2 до 250 ТБ
  14. Переход на grub2 (наконец-то таки!!!)
  15. Centralized management of SSH Keys – Capability to deliver user's ssh public key to servers. Ну прямо праздник какой-то!
  16. Поддержка С++11 компиляторами!
  17. IPset искаропки
  18. Firewalld - крутая настройка над iptables! Велкам: https://fedoraproject.org/wiki/FirewallD?rd=FirewallD/ но возможно ее в RHEL7 не будет, только в Fedora 18.
  19. Еще много чего :)

Sunday, 3 November 2013

Фича системы управления конфигурациями Chef

upload The upload argument is used to upload one or more cookbooks (and any files that are associated with those cookbooks) from a local repository to the server. Only files that do not already exist on the server will be uploaded.

Это же волшебно! Хотеть в puppet!

Saturday, 2 November 2013

Хорошая книга по сетям TCP/IP - как она выглядит?

Уже довольно долгое время я пытаюсь найти книгу, с помощью которой смогу собрать воедино все свои урывочные знания по сетям.

Одной из первых книг в моей библиотеке по сетям была книга Олифер/Олифер, которая на долгие годы отбила малейшее желание изучать сети - ужасающе количество совершенно устаревших протоколов, не нужных подробностей и одностраничное описание TCP/UDP и прочих реально важных и нужных в ежедневной практике протоколов.

Одной из следующих попыток компенсировать свои не особо четкие познания о сетях были многократные попытки купить книги Таненбаума. Но при малейшем осмотре становится ясно - это тот же самый Олифер/Олифер, только от более именитого автора. Опять слишком много информации о GSM/ISDN/ATM и прочих уже канувших в лету вещах и как всегда мало информации о сетях сегодняшнего или хотя бы вчерашнего дня.

Где-то через 3 года мне на глаза попалась книга TCP Illustrated, более подробно Вы можете прочесть про нее на вики: http://en.wikipedia.org/wiki/TCP/IP_Illustrated

В этом трехтомнике, на мой взгляд, наиболее интересна первая книга, потому что там дается очень хороший набор информации по базовым протоколам (ее содержание Вы можете найти на Amazon). Вторая книга зовется "реализации" и там на примере стека BSD4 с максимумом подробностей рассказывается, как все протоколы работают на практике. Эту книгу можно рекомендовать всем желающим познать "в идеале", большинству же подробности реализации вряд ли будут интересны. В третьей книге рассматриваются совершенно уж футуристические вещи, например Transactional TCP, о котором вряд ли кто из читателей слышал в наши дни, поэтому интересна она лишь с исторической точки зрения :)

Отдельно стоит упомянуть автора, на мой взгляд, Ричард Стивенс - один из лучших авторов книг по программированию под Linux/UNIX и его книги все без исключения заслуживают Вашего внимания.

Ну и да - все книги серии можно найти на Amazon.com :)