FastNetMon

Tuesday, 31 December 2013

С Новым Годом!

С Новым Годом, дорогие мои читатели!

Желаю, чтобы Новый Год принес Вам как можно больше радости, солнечных дней и поменьше проблем с софтом и оборудованием :)

Monday, 30 December 2013

Гарант Парк Телеком или r01.ru - пример худшего доменного Регистратора из возможных

Мучения с данной компанией у нас длятся уже несколько лет, основная жалоба - это, конечно же, на их до ужаса кривая система, которая даже не позволяет изменить IP адрес одного из DNS серверов без привлечения технической поддержки (а зачем кроме этого и регистрации доменов вообще нужен Регистратор, а?).

Дополнительным очень неприятным моментом является скорость ответа поддержки, которая достигает подчас 12 часов, даже в экстренных и очень срочных случаях.

Но последний раз Гарант Парк превзошел сам себя - их система удалила нам 1 из DNS серверов.

Все начиналось довольно просто - нам потребовалось добавить несколько IP адресов для одного из DNS серверов. Казалось бы, банальнейшая операция, но увы - в документации ни слова, а попытка указать несколько IP адресов через запятую или пробел (как у ряда других Регистратором) приводит лишь к ошибке "неверное латинское наименование". Решено было обратиться в поддержку! Первый раз нам повезло и сотрудник поддержки самостоятельно выполнил все операции и всего через 3 часа после нашего запроса и все заработало на ура.

А вот когда нам понадобилось поменять эти самые адреса через менее чем неделю началось дивное. На наш запрос в поддержку "выполните ручную смену IP адресов для DNS сервера" пришло чудесное:
Изменить данные Вы можете в разделе "Домены", далее, рядом с именем Вашего домена нажмите на ссылку "Смена DNS-серверов" выполненную в виде стилизованного карандаша в графе "Действия", внесите требуемую правку и сформируйте заказ на изменение, после чего, в течение 6-8 часов домен будет повторно делегирован на те же DNS, с учётом внесённых Вами правок.
Департамент по работе с клиентами R01
Телефоны:
+7 495 783-3-783
 8 800 775-37-83 (для регионов России)
Факс: +7 495 930-88-00
http://r01.ru
Ок, ну мы не дураки, отвечаем, что:
К сожалению, мы не можем этого сделать самостоятельно и вынуждены
обращаться в поддержку. При попытке внести указанные правки система
Ваша выдает "Неправильный формат ввода латинского наименования".
На что получаем фикс! Оказывается, это-таки можно сделать это самостоятельно! 
Здравствуйте!
Учитывая получаемое Вами сообщение, скорее всего Вы пытаетесь указать IP адрес без указания имени NS сервера, которому принадлежит IP.
Соответственно Вам следует указать две записи с одним именем, но разными IP:
ns1.domain.ru xx.yy.zz.aa
ns1.domain.ru aa.bb.cc.zz
После этого задание должно быть сформировано корректно.
Департамент по работе с клиентами R01
Телефоны:
+7 495 783-3-783
 8 800 775-37-83 (для регионов России)
Факс: +7 495 930-88-00
http://r01.ru
Самое волшебное, что этот вариант сработал и система не выдала ошибки. Но результат его действий заставил встать волосы дыбом - указанный ns1.domain.ru был вообще удален из DNS серверов для данного домена и whois принял вид:
nserver:       ns1. domain.ru.
nserver:       ns2.domain.ru. xx.yy.zz.aa
nserver:       ns3. domain.ru. xx.yy.zz.ab
nserver:       ns4. domain.ru. xx.yy.zz.ac
И никакие попытки вручную вернуть удаленный с корнями ns1 не увенчались успехом. И снова пришлось писать злобное письмо в регистратора.

Я специально не указываю контакты сотрудника отвечавшего нам, его вины в этом нет ни на грамм. Это исключительно проблема руководства (все же техническое), что у Доменного Регистратора ГОДАМИ не работают настолько типовые функции.

Никаких выводов я делать не буду, я просто делюсь информацией, чтобы никто из коллег по ИТ не попался в сети данной компании.

Saturday, 28 December 2013

Защита от DoS/DDoS атак с помощью фильтрации по номеру автономной системы (ASN)

Всем привет! Уж простите за откровенную рекламу, но вот мой недавний пост на Хабре, уверен, многим пригодится. 

Wednesday, 25 December 2013

Аггрегация данных на Bash

Довольно часто в системном администрировании и обработке данных в целом встает задача аггрегации данных (либо, кто знаком с алгоритмом map-reduce - редукция).

Что значит это заумное слово?

Например, у нас на входе есть данные по трафике по странам:

IR 195534
IR 2352503
IR 318617
IS 0
IS 4302
IS 6568
IT 172796
IT 44845798
IT 9604406
JE 0
JE 0
JE 0
JM 0
JM 16988
JM 956
JO 11528479
JO 569127
JO 98058
JP 1030332
JP 1103192
Особенность в том, что данные получены из нескольких источников и чтобы получить итоговые цифры, нужно для совпадающих первых полей сложить числа справа.

Как это красиво сделать на Bash?

А вот так:
cat raw_data| sort | awk '{sums[$1] += $2} END {for (a in sums) print a, sums[a]}' 
И на выходе мы получим аккуратную табличку:
JE 0
JM 17944
JO 12195664
IR 2866654
JP 2133524
IS 10870
IT 54623000
За мысли о реализации спасибо: http://stackoverflow.com/questions/13258902/simple-aggregation-using-linux-scripting

Tuesday, 24 December 2013

Сборка и установка DNS демона Yadifa на Debian 7 Wheezy

Очень интересный и быстрый DNS сервер, используемый реестром зоны .eu. К сожалению, он не имеет пакета для Debian ни в официальном репо, ни у разработчиков. Так что придется собрать его вручную. Также в случае интереса рекомендую посмотреть презентацию:  https://ripe64.ripe.net/presentations/132-RIPE64-YADIFA.pdf

Стягиваем и распаковываем код для сборки актуальной версии (на момент тестов, она была 1.3, актуальную смотрите на http://www.yadifa.eu/download):
cd /usr/src
wget http://cdn.yadifa.eu/sites/default/files/releases/yadifa-1.0.3-2880.tar.gz
tar -xf yadifa-1.0.3-2880.tar.gz
cd yadifa-1.0.3-2880


Стягиваем зависимости для сборки:
apt-get install libssl-dev gcc make automake autoconf

Собираем:
./configure --prefix=/opt/yadifa_1.0.3
make
make install
Копируем пример конфига в боевой конфиг:
mkdir /opt/yadifa_1.0.3/etc
cp /opt/yadifa_1.0.3/share/doc/yadifa/yadifad.conf.example /opt/yadifa_1.0.3/etc/yadifad.conf
После этого открываем в редакторе файл конфига: 
vim /opt/yadifa_1.0.3/etc/yadifad.conf
Создаем набор служебных папок (стандартно папка /usr/local/var никем более обычно не используется и после тестов ее можно удалить, не сломав ничего):
cd /usr/local
mkdir -p var/run var/log var/zones/keys var/zones/masters var/zones/slaves var/zones/xfr
И стираем там строку "edns0 on", почему-то он ругается на нее:
/opt/yadifa_1.0.3/sbin/yadifad
error setting variable: main.edns0 = 'on': CONFIG_UNKNOWN_SETTING_ERR
config: <main>: CONFIG_UNKNOWN_SETTING_ERR ( 'edns0' = 'on' [] )
config: at /opt/yadifa_1.0.3/etc/yadifad.conf:31: CONFIG_UNKNOWN_SETTING_ERR)
error: CONFIG_UNKNOWN_SETTING_ERR
2013-12-24 18:54:58.241476 | server   | E | config: <main>: CONFIG_UNKNOWN_SETTING_ERR ( 'edns0' = 'on' [] )
2013-12-24 18:54:58.241484 | server   | E | config: at /opt/yadifa_1.0.3/etc/yadifad.conf:31: CONFIG_UNKNOWN_SETTING_ERR)
Все, теперь мы можем запускать демона:
/opt/yadifa_1.0.3/sbin/yadifad 
С конфигурацией все довольно просто. Нужно в основной конфиг внести следующее:


<zone>
    type master
    domain domain.ru
    file masters/domain.ru.zone
</zone>

А сам файл зоны положить по пути: /usr/local/var/zones/masters/domain.ru.zone со следующим содержимым. Пример зоны можно взять с документа http://www.yadifa.eu/sites/default/files/yadifa-reference-manual.pdf страница 40.

Пока столкнулся с неприятной фишкой, что Yadifa отбрасывает зоны без ORIGIN макроса. Буду разбираться...



Monday, 23 December 2013

Как пописать несколько IP адресов для DNS сервера, размещенного на самом .ru домене?

Суть задачи сформулирована в сабже, пример приведу DNS серверами того же REG.RU:

dig @193.232.128.6 reg.ru
; <<>> DiG 9.4.3-P3 <<>> @193.232.128.6 reg.ru
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24999
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 12
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;reg.ru. IN A
;; AUTHORITY SECTION:
reg.ru. 345600 IN NS ns1.reg.ru.
reg.ru. 345600 IN NS ns2.reg.ru.
;; ADDITIONAL SECTION:
ns1.reg.ru. 345600 IN A 31.31.205.73
ns1.reg.ru. 345600 IN A 31.31.204.25
ns1.reg.ru. 345600 IN A 31.31.204.37
ns1.reg.ru. 345600 IN A 31.31.204.52
ns1.reg.ru. 345600 IN A 31.31.205.39
ns1.reg.ru. 345600 IN A 31.31.205.55
ns1.reg.ru. 345600 IN AAAA 2a00:f940::25
ns2.reg.ru. 345600 IN A 198.100.149.22
ns2.reg.ru. 345600 IN A 31.31.205.56
ns2.reg.ru. 345600 IN A 31.31.205.74
ns2.reg.ru. 345600 IN A 88.212.207.122
ns2.reg.ru. 345600 IN AAAA 2a00:f940::37
;; Query time: 16 msec
;; SERVER: 193.232.128.6#53(193.232.128.6)
;; WHEN: Sat Dec 21 01:21:05 2013
;; MSG SIZE  rcvd: 276
Так вот, если у REG.RU еще не будет это отображено в документации, то при добавлении DNS сервера нужно просто через запятую в поле IP адрес указать несколько IP адресов, на которых будет стоять DNS сервер. Таким образом удастся добиться повышенной отказоустойчивости за счет того, что вместо двух-четырех серверов можно поставить до сотни и более DNS машин!

Update: REG.RU анонсировал данную фичу официально: https://www.reg.ru/company/news/3241

ГарантПарк телеком r01.ru также делает подобное, но лишь вручную. Так как их интерфейс напрямую не позволяет ни через пробел, ни через запятую указать несколько IP адресов.

Если Ваш регистратор утверждает, что так сделать нельзя - он лжет :) ТехЦентр зоны .RU это поддерживается без проблем.

Обращаю внимание, что TTL для записей в корневой зоне стоит аж 345600 секунд, что почти 3е суток. Поэтому не ожидайте равномерного трафика по всем IP адресам для DNS сервера сразу же. Нужно ждать как минимум 3е суток, пока все-все-все сервера в интернете узнают, что у Вас теперь не 1 IP адрес для DNS сервера, а 2.

Thursday, 5 December 2013

Быстрая генерация кода для библиотеки cURL для С/PHP

У консольной версии библиотеки есть спец ключи для этого:
curl https://ripe.net --libcurl -

В итоге на экран будет выведено нечто следующее:

#include <curl/curl.h>
int main(int argc, char *argv[])
{
  CURLcode ret;
  CURL *hnd = curl_easy_init();
  /* curl_easy_setopt(hnd, CURLOPT_WRITEDATA, 0xbffff9d4); [REMARK] */
  /* curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, 0x3568); [REMARK] */
  /* curl_easy_setopt(hnd, CURLOPT_READDATA, 0xbffff9f0); [REMARK] */
  /* curl_easy_setopt(hnd, CURLOPT_READFUNCTION, 0x2945); [REMARK] */
  /* curl_easy_setopt(hnd, CURLOPT_IOCTLDATA, 0xbffff9f0); [REMARK] */
  /* curl_easy_setopt(hnd, CURLOPT_IOCTLFUNCTION, 0x290c); [REMARK] */
  curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)-1);
  curl_easy_setopt(hnd, CURLOPT_URL, "https://ripe.net");
  curl_easy_setopt(hnd, CURLOPT_PROXY, NULL);
  curl_easy_setopt(hnd, CURLOPT_HEADER, 0);
  curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1024);
  curl_easy_setopt(hnd, CURLOPT_NOBODY, 0);
  curl_easy_setopt(hnd, CURLOPT_FAILONERROR, 0);
  curl_easy_setopt(hnd, CURLOPT_UPLOAD, 0);
  curl_easy_setopt(hnd, CURLOPT_FTPLISTONLY, 0);
  curl_easy_setopt(hnd, CURLOPT_FTPAPPEND, 0);
  curl_easy_setopt(hnd, CURLOPT_NETRC, 0);
  curl_easy_setopt(hnd, CURLOPT_FOLLOWLOCATION, 0);
  curl_easy_setopt(hnd, CURLOPT_UNRESTRICTED_AUTH, 0);
  curl_easy_setopt(hnd, CURLOPT_TRANSFERTEXT, 0);
  curl_easy_setopt(hnd, CURLOPT_USERPWD, NULL);
  curl_easy_setopt(hnd, CURLOPT_PROXYUSERPWD, NULL);
  curl_easy_setopt(hnd, CURLOPT_RANGE, NULL);
  /* curl_easy_setopt(hnd, CURLOPT_ERRORBUFFER, 0xbffff7bc); [REMARK] */
  curl_easy_setopt(hnd, CURLOPT_TIMEOUT, 0);
  curl_easy_setopt(hnd, CURLOPT_REFERER, NULL);
  curl_easy_setopt(hnd, CURLOPT_AUTOREFERER, 0);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3");
  curl_easy_setopt(hnd, CURLOPT_FTPPORT, NULL);
  curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_LIMIT, 0);
  curl_easy_setopt(hnd, CURLOPT_LOW_SPEED_TIME, 0);
  curl_easy_setopt(hnd, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t)0);
  curl_easy_setopt(hnd, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t)0);
  curl_easy_setopt(hnd, CURLOPT_RESUME_FROM_LARGE, (curl_off_t)0);
  curl_easy_setopt(hnd, CURLOPT_COOKIE, NULL);
  curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSLCERT, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSLCERTTYPE, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSLKEY, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSLKEYTYPE, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSLKEYPASSWD, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSH_PRIVATE_KEYFILE, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSH_PUBLIC_KEYFILE, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 2);
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50);
  curl_easy_setopt(hnd, CURLOPT_CRLF, 0);
  curl_easy_setopt(hnd, CURLOPT_QUOTE, NULL);
  curl_easy_setopt(hnd, CURLOPT_POSTQUOTE, NULL);
  curl_easy_setopt(hnd, CURLOPT_PREQUOTE, NULL);
  curl_easy_setopt(hnd, CURLOPT_WRITEHEADER, NULL);
  curl_easy_setopt(hnd, CURLOPT_COOKIEFILE, NULL);
  curl_easy_setopt(hnd, CURLOPT_COOKIESESSION, 0);
  curl_easy_setopt(hnd, CURLOPT_SSLVERSION, 0);
  curl_easy_setopt(hnd, CURLOPT_TIMECONDITION, 0);
  curl_easy_setopt(hnd, CURLOPT_TIMEVALUE, 0);
  curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, NULL);
  /* curl_easy_setopt(hnd, CURLOPT_STDERR, 0xa091a690); [REMARK] */
  curl_easy_setopt(hnd, CURLOPT_HTTPPROXYTUNNEL, 0);
  curl_easy_setopt(hnd, CURLOPT_INTERFACE, NULL);
  curl_easy_setopt(hnd, CURLOPT_KRBLEVEL, NULL);
  curl_easy_setopt(hnd, CURLOPT_TELNETOPTIONS, NULL);
  curl_easy_setopt(hnd, CURLOPT_RANDOM_FILE, NULL);
  curl_easy_setopt(hnd, CURLOPT_EGDSOCKET, NULL);
  curl_easy_setopt(hnd, CURLOPT_CONNECTTIMEOUT, 0);
  curl_easy_setopt(hnd, CURLOPT_ENCODING, NULL);
  curl_easy_setopt(hnd, CURLOPT_FTP_CREATE_MISSING_DIRS, 0);
  curl_easy_setopt(hnd, CURLOPT_IPRESOLVE, 0);
  curl_easy_setopt(hnd, CURLOPT_FTP_ACCOUNT, NULL);
  curl_easy_setopt(hnd, CURLOPT_IGNORE_CONTENT_LENGTH, 0);
  curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 0);
  curl_easy_setopt(hnd, CURLOPT_FTP_FILEMETHOD, 0);
  curl_easy_setopt(hnd, CURLOPT_FTP_ALTERNATIVE_TO_USER, NULL);
  curl_easy_setopt(hnd, CURLOPT_SSL_SESSIONID_CACHE, 1);
  ret = curl_easy_perform(hnd);
  curl_easy_cleanup(hnd);
}
Круто, не правда ли?

Wednesday, 4 December 2013

Disable “You have new mail” terminal message

Кого тоже заколебало это сообщение - для решения прошу в файл:
vim /root/.bashrc 

Забить следующее:
unset MAILCHECK

Tuesday, 3 December 2013

Получение данных о загрузке шины QPI, бандвича памяти, а также утилизации шин PCI-E на процессорах семейства e5.

Я провожу тесты на PowerEdge 720 c Xeon e5 и в CentOS 6. Также точно работает с i7-3820.

На Dell часть фич работать не будет, по причине (вендор обещает починит это): http://software.intel.com/en-us/forums/topic/385194

Стягиваем фалик:

Собираем:
cd /usr/src
unzip intelperformancecountermonitorv2.8.zip
cd IntelPerformanceCounterMonitorV2.8
yum install -y make gcc gcc-c++
make

Открываем хав-ту и изучаем:
cat LINUX_HOWTO.txt 

Теперь попробуем считать метрики с процессора:

./pcm.x  1
 Intel(r) Performance Counter Monitor V2.6 (2013-11-04 13:43:31 +0100 ID=db05e43)
 Copyright (c) 2009-2013 Intel Corporation
Number of physical cores: 12
Number of logical cores: 24
Threads (logical cores) per physical core: 2
Num sockets: 2
Core PMU (perfmon) version: 3
Number of core PMU generic (programmable) counters: 4
Width of generic (programmable) counters: 48 bits
Number of core PMU fixed counters: 3
Width of fixed counters: 48 bits
Nominal core frequency: 2000000000 Hz
Package thermal spec power: 95 Watt; Package minimum power: 63 Watt; Package maximum power: 150 Watt;
Socket 0: 1 memory controllers detected with total number of 4 channels. 2 QPI ports detected.
Socket 1: 1 memory controllers detected with total number of 4 channels. 2 QPI ports detected.
WARNING: Core 0 IA32_PERFEVTSEL0_ADDR are not zeroed 5439548
Access to Intel(r) Performance Counter Monitor has denied (Performance Monitoring Unit is occupied by other application). Try to stop the application that uses PMU.
Alternatively you can try to reset PMU configuration at your own risk. Try to reset? (y/n)


Вот так, тут нужно сказать y. Это не костыль (не опасно, проверялось на 3х серверах, падений не зафиксировано), это рекомендация инженеров Intel:   http://software.intel.com/en-us/forums/topic/280522

Запускаем утилиту для контроля с 1 секундным обновлением данных:
./pcm.x 1


И, к сожалению, что на Dell, что на Intel шасси получаем вот такие сообщения:
ERROR: QPI LL counter programming seems not to work. Q_P0_PCI_PMON_BOX_CTL=0xffffffff
       Please see BIOS options to enable the export of performance monitoring devices (devices 8 and 9: function 2).
ERROR: QPI LL counter programming seems not to work. Q_P1_PCI_PMON_BOX_CTL=0xffffffff
       Please see BIOS options to enable the export of performance monitoring devices (devices 8 and 9: function 2).
ERROR: QPI LL counter programming seems not to work. Q_P0_PCI_PMON_BOX_CTL=0xffffffff
       Please see BIOS options to enable the export of performance monitoring devices (devices 8 and 9: function 2).
ERROR: QPI LL counter programming seems not to work. Q_P1_PCI_PMON_BOX_CTL=0xffffffff
       Please see BIOS options to enable the export of performance monitoring devices (devices 8 and 9: function 2).


Зато есть чудо тулза ./pcm-memory.x, которая показывает загрузку шины памяти в текущий момент и еще кучу информации о памяти:
Called sleep function for 1000 ms
---------------------------------------||---------------------------------------
--             Socket 0              --||--             Socket 1              --
---------------------------------------||---------------------------------------
---------------------------------------||---------------------------------------
---------------------------------------||---------------------------------------
--   Memory Performance Monitoring   --||--   Memory Performance Monitoring   --
---------------------------------------||---------------------------------------
--  Mem Ch 0: Reads (MB/s):  846.55  --||--  Mem Ch 0: Reads (MB/s):  798.78  --
--            Writes(MB/s):  296.10  --||--            Writes(MB/s):  317.43  --
--  Mem Ch 1: Reads (MB/s):  871.39  --||--  Mem Ch 1: Reads (MB/s):  825.85  --
--            Writes(MB/s):  327.96  --||--            Writes(MB/s):  349.45  --
--  Mem Ch 2: Reads (MB/s):  841.01  --||--  Mem Ch 2: Reads (MB/s):  789.40  --
--            Writes(MB/s):  297.20  --||--            Writes(MB/s):  316.76  --
--  Mem Ch 3: Reads (MB/s):  839.96  --||--  Mem Ch 3: Reads (MB/s):  792.42  --
--            Writes(MB/s):  294.68  --||--            Writes(MB/s):  317.00  --
-- NODE0 Mem Read (MB/s):   3398.91  --||-- NODE1 Mem Read (MB/s):   3206.47  --
-- NODE0 Mem Write (MB/s):  1215.94  --||-- NODE1 Mem Write (MB/s):  1300.63  --
-- NODE0 P. Write (T/s) :    564368  --||-- NODE1 P. Write (T/s):     633549  --
-- NODE0 Memory (MB/s):     4614.85  --||-- NODE1 Memory (MB/s):     4507.10  --
---------------------------------------||---------------------------------------
--                   System Read Throughput(MB/s):   6605.38                  --
--                  System Write Throughput(MB/s):   2516.57                  --
--                 System Memory Throughput(MB/s):   9121.95                  --
---------------------------------------||---------------------------------------

Еще есть тулза ./pcm-pcie.x  1, которая позволяет смотреть загрузку PCI-E шин.

В процессе поиска информации обнаружилась полезная команда:
rm -f /dev/shm/sem.*Intel*

Она удаляет кэш всех диагностических утилит, полезна при отладке сложных проблем, без нее ошибка будет отображаться лишь однажды.

Также на Sandy Bridge тулза pcm.x может попросить сделать вот так:

echo 0 > /proc/sys/kernel/nmi_watchdog modprobe msr
А после этого, чтобы она заработала нужно дернуть ./pcm.x -r 

Как нагрузить шину QPI?

Странный вопрос, но частенько это нужно. Что такое QPI - прошу в Google :)

Итак, подход довольно простой, нам нужно создать число процессов по числу NUMA нод, в случае двух процессорной конфигурации это 2 процесса соответственно.

После этого каждый процесс надо прибить к соответствующей NUMA ноде. А после этого на первом процессе создать SHM блок памяти и начать его читать/писать из второго процесса и наоборот. Получится, что для чтения/записи данных процессы будут вынуждены ходить друг к другу по шине QPI.

Так вот это все уже до меня придумал автор утилиты QPI-Stress и снабдил отличной иллюстрацией: https://github.com/pavel-odintsov/qpi-stress/blob/master/README


Собирал я на CentOS 6, но, уверен, отличий сильных не будет.

Открываем страницу проекта http://sourceforge.net/projects/qpi-stress/files/latest/download и выбираем прямую ссылку на архив.

Собираем:
cd /usr/src
wget тут_прямая_ссылка_на_архив_выше
tar -xf qpi-stress-0.1.tar.gz
cd qpi-stress-0.1/
cd src
# там этого файлика не хватает для сборки, но он есть в репо
curl http://sourceforge.net/p/qpi-stress/code/HEAD/tree/src/qpi.h?format=raw > qpi.h
cd ..
./configure --prefix=/opt/qpi-stress
Ура!

Теперь запускаем:
 qpi_stress
summay:
total processors: 24
total memory: 193252 MB
start processes: 24
data partern: 0xaa
runtime: 4294967295 seconds
result display delay: 10 seconds
per process  share memory size: 4 MB
bind process 0  to cpu 23
bind process 1  to cpu 22
bind process 2  to cpu 21
bind process 3  to cpu 20
bind process 4  to cpu 19
bind process 6  to cpu 17
bind process 5  to cpu 18
bind process 7  to cpu 16
bind process 8  to cpu 15
bind process 9  to cpu 14
bind process 10  to cpu 13
bind process 11  to cpu 12
bind process 12  to cpu 11
bind process 13  to cpu 10
bind process 14  to cpu 9
bind process 15  to cpu 8
bind process 16  to cpu 7
bind process 17  to cpu 6
bind process 18  to cpu 5
bind process 19  to cpu 4
bind process 20  to cpu 3
bind process 21  to cpu 2
bind process 22  to cpu 1
bind process 23  to cpu 0
-------------------------------
QPI stress staring ...
in recent 34298 r/w(s):
2013-12-03 19:46:34
read: 6737.57 MB/s, delay: 0.59 ms, write: 6747.00 MB/s, delay: 0.59 ms
in recent 34116 r/w(s):
2013-12-03 19:46:44
read: 6688.76 MB/s, delay: 0.60 ms, write: 6688.76 MB/s, delay: 0.60 ms
cin recent 34038 r/w(s):
2013-12-03 19:46:54
read: 6702.50 MB/s, delay: 0.60 ms, write: 6700.93 MB/s, delay: 0.60 ms
in recent 33378 r/w(s):
2013-12-03 19:47:04
read: 6560.14 MB/s, delay: 0.61 ms, write: 6560.14 MB/s, delay: 0.61 ms


Sunday, 1 December 2013

Отличный доклад про Btrfs, крайне рекомендую к просмотру!



Отличнейший доклад, рекомендую! 

Btrfs и OpenVZ/ploop


Не поддерживается, собака:
vzctl create 88811 --layout ploop --private /mnt/88811
Creating image: /mnt/88811.tmp/root.hdd/root.hdd size=5153024K
Creating delta /mnt/88811.tmp/root.hdd/root.hdd bs=2048 size=10307584 sectors v2
Storing /mnt/88811.tmp/root.hdd/DiskDescriptor.xml
Opening delta /mnt/88811.tmp/root.hdd/root.hdd
Adding delta dev=/dev/ploop56655 img=/mnt/88811.tmp/root.hdd/root.hdd (rw)
Error in add_delta (ploop.c:1171): Can't add image /mnt/88811.tmp/root.hdd/root.hdd: unsupported underlying filesystem
Failed to create image: Error in add_delta (ploop.c:1171): Can't add image /mnt/88811.tmp/root.hdd/root.hdd: unsupported underlying filesystem [3]
Destroying container private area: /mnt/88811
Creation of container private area failed

Использования btrfs в CentOS 6

Итак, тесты будем проводить на файловой системе в файле:

Создадим тушку на 2гб для тестов:

dd if=/dev/zero of=partition.img bs=2048 count=1000000
Установим утилиты для btrfs:
yum install -y btrfs-progs
Даем команду форматировать диск:
mkfs.btrfs partition.img 
После этого получаем страшную надпись, что btrfs НЕ ГОТОВ ДЛЯ ПРОДАКШЕНА!!! И ЭТО НЕ ПУСТЫЕ СЛОВА!!!! НЕ ИСПОЛЬЗУЙТЕ ЕГО В ПРОДАКШЕНЕ!!!
WARNING! - Btrfs Btrfs v0.20-rc1 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label (null) on partition.img
nodesize 4096 leafsize 4096 sectorsize 4096 size 1.91GB
Btrfs Btrfs v0.20-rc1
Монтируем в папку /mnt:
mount -o loop partition.img  /mnt
 Ура, мы смонтировались:

 mount|grep btrfs
/root/partition.img on /mnt type btrfs (rw,loop=/dev/loop/0)
В dmesg также много угрожающих надписей:
dmesg|grep btrfs
[940190.904464] TECH PREVIEW: btrfs may not be fully supported.
[940204.308137] btrfs: disk space caching is enabled
[940204.308974] btrfs: no dev_stats entry found for device /dev/loop/0 (devid 1) (OK on first mount after mkfs)
Ну в общем можете продолжать мучать ее :)


Самый удобный способ смотреть Youtube - смотрите его через VLC

Начиная с ветки 1.1 VLC при открытии сетевого источника для видео поддерживает URL в виде "http://www.youtube.com/watch?v=BwQNo6fc1AQ" и отлично его смотрит без всяких раздражающих фич Youtube.com :)

Если Вы думаете, что IP адреса .0 и .255 не могут быть использованы для работы - Вы в корне ошибаетесь

Вот чудесная статья приводящая примеры, когда бродкаст/сетевые адреса .255/.0 можно использовать для своих целей: http://searchitchannel.techtarget.com/tip/Assigning-an-IP-address-ending-in-0-or-255 там надо вести любой email адрес и тыкнуть keep reading. 

Wednesday, 27 November 2013

Установка OpenVSwitch 1.9 на CentOS 6

Зависимости:
yum install -y rpm-build
yum groupinstall -y "Development Tools"
yum install -y openssl-devel

Стягиваем код и собираем окружение:
cd /usr/src
wget http://openvswitch.org/releases/openvswitch-1.9.0.tar.gz

mkdir -p /root/rpmbuild/SOURCES
cp openvswitch-1.9.0.tar.gz /root/rpmbuild/SOURCES
cd /root/rpmbuild/SOURCES
tar -xvf openvswitch-1.9.0.tar.gz
Далее нужно удалить одну зависимость на строке Requires удаляем openvswitch-kmod:

vim ./openvswitch-1.9.0/rhel/openvswitch.spec
Собираем:
cd openvswitch-1.9.0
rpmbuild -bb -D `uname -r` rhel/openvswitch.spec
Устанавливаем:
yum localinstall /root/rpmbuild/RPMS/x86_64/openvswitch-1.9.0-1.x86_64.rpm
Запускаем (в автозагрузку он добавился уже сам):
/etc/init.d/openvswitch start
/etc/openvswitch/conf.db does not exist ... (warning).
Creating empty database /etc/openvswitch/conf.db           [  OK  ]
Starting ovsdb-server                                      [  OK  ]
Configuring Open vSwitch system IDs                        [  OK  ]
Starting ovs-vswitchd                                      [  OK  ]
Enabling gre with iptables                                 [  OK  ]
Источник: http://fvtool.wordpress.com/2013/04/24/install-kvm-on-centos-6-3-installing-open-vswitch/

Открытая вакцина против ВИЧ - Immunity Project

Настоящая попытка изменить мир http://www.immunityproject.org/ !!! Чудесный проект, чудесная идея и потрясающие люди! 

Thursday, 21 November 2013

Latency Based Routing - новости из мира Load Balancing :)

Как выглядит блок Anycast в RIPE?

Вот примерно так:
whois 31.131.255.10|tail -n 10
route:          31.131.255.0/24
descr:          Selectel Anycast
origin:         AS49505
mnt-by:         MNT-SELECTEL
source:         RIPE # Filtered
Честно говоря, не понятно одно - везде поднимать свою AS и нельзя использовать AS апстримов/провайдеров? Как тогда завернуть один блок IP в несколько разных ASN, причем, одновременно.

How to build rpm package for RHEL5 on RHEL6 system?

# emulate: "/usr/bin/rpmbuild-md5" from fedora-packager
rpmbuild --define "_source_filedigest_algorithm 1" --define "_binary_filedigest_algorithm 1" --define "_binary_payload w9.gzdio"  --define "_source_payload w9.gzdio" --define "_default_patch_fuzz 2"-bb e2fsprogs.spec


Wednesday, 20 November 2013

How I can mount one file (not an folder) to another?

Create file with content:
echo "my important data" > /tmp/shadow

Check it content:
cat  /tmp/shadow
my important data

Create blank file, it will be mount point, it content can be any (we need only inode, right):
rm -f /tmp/shadowcopy
touch /tmp/shadowcopy

This file instantly blank:
cat /tmp/shadowcopy|wc -l
0

Mount file /tmp/shadow to /tmp/shadowcopy:
mount --bind /tmp/shadow /tmp/shadowcopy 

Welcome, all forks fine:
cat /tmp/shadow
my important data

cat /tmp/shadowcopy
my important data

You can add line into source file:
echo "new line" >> /tmp/shadow

And this line can be found in both files (source and mounted):
cat /tmp/shadow
my important data
new line

cat /tmp/shadowcopy
my important data
new line
 If you add any content to destination file, it will show in source. This mechanic looks like hard links. 

At finish you MUST unmount destination file:
umount /tmp/shadowcopy






Tuesday, 19 November 2013

Installing actual Gentoo from stage3 on OpenVZ withou any strange templates, only from stage3

0. Set our container number for preventing hardcoding in my commands:

export CTID=19484

1. Download stage3 into OpenVZ template folder (you can get actual link from here http://distfiles.gentoo.org/releases/amd64/autobuilds/latest-stage3-amd64.txt). Be careful - you must set downloaded file name to gento-bla-bla-bla:
cd /vz/template/cache
wget http://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3/stage3-amd64-20131031.tar.bz2 -Ogentoo-stage3-amd64-20131031.tar.bz2

2. Create container using stage3 template.

vzctl create $CTID --hostname gentoo-forever.com --ipadd 78.47.xx.xx --ostemplate gentoo-stage3-amd64-20131031 --layout ploop --disk 10G

3. Start container for removing udev (udev and openvz are natural enemies): 

vzctl start $CTID
vzctl exec $CTID 'rm -f /etc/init.d/udev'
vzctl exec  $CTID 'rm -f /etc/init.d/udev-mount'

4. Start container for production:
vzctl start 19484;
vzctl enter 19484
5. Enable ssh:
/etc/init.d/sshd start

6. First steps in Gentoo - getting portage tree!
 emerge --sync


How to mount multiple disks to OpenVZ ploop container?

Hello, OpenVZ admin! :)

In many cases you can want ability to mount an additional ploop devices in OpenVZ container (be care! This guide works only with ploop), i.e. add separate as /data or /mnt. It's not so obviously but I can help you. My test container number (CTID) is 19484, be careful because this number is another in your case!  

At first, you must select path where you plans save additional disk images. In my case, it's /storage folder on hardware node.

1. We must create subfolder for saving additional disk data (image + description file). I recommend to name it with CTID.

mkdir /storage
mkdir /storage/19484

2. Create ploop device with defined size in this folder.
ploop init -s 10G -f ploop1 -v 2 /storage/19484/additional_disk_image -t ext4

3. Please stop container (it's needed because we manipulate with container root filesystem and it's so dangerous):



vzctl stop 19484

4.  We must add hook scripts for mount and umount this disk to container root mount point.

Please create file /etc/vz/conf/19484.mount with following content:
#!/bin/bash 
ploop mount -m /vz/root/$VEID/mnt  /storage/$VEID/DiskDescriptor.xml
And file  /etc/vz/conf/19484.umount with following content (we must add exit 0 because at first start vzctl will tries to umount disk and we got an error):


#!/bin/bash 
ploop umount /storage/$VEID/DiskDescriptor.xml
exit 0
Add execution flag to both files:
chmod +x /etc/vz/conf/19484.mount /etc/vz/conf/19484.umount
5. Start container:
vzctl start 19484
At first startups you must got error message because vzctl can't unmount additional disk at startup (so strange feature, really! What reason to umount disks at startup?) . It's ok, you can sefely ignore. At next start/restart you did not got any errors.   
Error in ploop_umount_image (ploop.c:1579): Image /storage/19484/additional_disk_image is not mounted
At second and next start's you can see no error:
vzctl start 19484
Starting container...
Opening delta /vz/private/19484/root.hdd/root.hdd
Adding delta dev=/dev/ploop18662 img=/vz/private/19484/root.hdd/root.hdd (rw)
/dev/ploop18662p1: clean, 36570/144288 files, 228564/576251 blocks
Mounting /dev/ploop18662p1 at /vz/root/19484 fstype=ext4 data='balloon_ino=12,'
Opening delta /storage/19484/additional_disk_image
Adding delta dev=/dev/ploop50284 img=/storage/19484/additional_disk_image (rw)
Mounting /dev/ploop50284p1 at /vz/root/19484/mnt fstype=ext4 data='balloon_ino=12,'
Container is mounted
Adding IP address(es): 78.47.76.28
Setting CPU units: 1000
Container start in progress...
Check new disk in container:
vzctl exec 19484 'df -h'
Filesystem         Size  Used Avail Use% Mounted on
/dev/ploop18662p1  2.2G  858M  1.3G  41% /
/dev/ploop50284p1  9.9G  164M  9.2G   2% /mnt
none               136M  4.0K  136M   1% /dev
none                28M 1020K   27M   4% /run
none               5.0M     0  5.0M   0% /run/lock
none                52M     0   52M   0% /run/shm
none               100M     0  100M   0% /run/user
It's important, you don't need any quota setup because ploop is complete filesystem and it's limited by standard linux mechanic like native hard drive.

Mounting additional disk as read only

If you want you can mount additional disk as read only. You must add -r flag to ploop mount command.

In read only case you will see something like this while containers starts:
vzctl start 19484
Starting container...
Opening delta /vz/private/19484/root.hdd/root.hdd
Adding delta dev=/dev/ploop18662 img=/vz/private/19484/root.hdd/root.hdd (rw)
/dev/ploop18662p1: clean, 36570/144288 files, 228582/576251 blocks (check in 4 mounts)
Mounting /dev/ploop18662p1 at /vz/root/19484 fstype=ext4 data='balloon_ino=12,'
Opening delta /storage/19484/additional_disk_image
Adding delta dev=/dev/ploop50284 img=/storage/19484/additional_disk_image (ro)
Mounting /dev/ploop50284p1 at /vz/root/19484/mnt fstype=ext4 data='balloon_ino=12,' ro
Container is mounted
Adding IP address(es): 78.47.76.28
Setting CPU units: 1000
Container start in progress...

Monday, 18 November 2013

OpenVZ DiskDescriptor.xml - что есть что?

<?xml version="1.0"?>
<Parallels_disk_image>
  <Disk_Parameters>
    <Disk_size>8388608</Disk_size>
    <Cylinders>8322</Cylinders>
    <Heads>16</Heads>
    <Sectors>63</Sectors>
    <Padding>0</Padding>
  </Disk_Parameters>
  <StorageData>
    <Storage>
      <Start>0</Start>
      <End>8388608</End>
      <Blocksize>2048</Blocksize>
      <Image>
        <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>
        <Type>Compressed</Type>
        <File>root.hdd</File>
      </Image>
    </Storage>
  </StorageData>
  <Snapshots>
    <TopGUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</TopGUID>
    <Shot>
      <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>
      <ParentGUID>{00000000-0000-0000-0000-000000000000}</ParentGUID>
    </Shot>
  </Snapshots>
</Parallels_disk_image>

Что же есть из себя 5fbaabe3-6958-40ff-92a7-860e329aab41? Не понятно! Это не GUID таблицы GPT,  которую использует ploop потому что:

 cat /vz/private/19484/root.hdd/DiskDescriptor.xml|grep UID -i
        <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>
    <TopGUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</TopGUID>
      <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>

Обойдем все диски и получим из GPT GUID: 
for i in `find /dev/ploop*|egrep -v 'p1$'`;do sgdisk -p $i |grep GUID;done
Disk identifier (GUID): A821C1C0-DB6E-4F32-ABC5-D05B7CF9A1DE
Disk identifier (GUID): BC1A5685-36FE-47E4-96E8-240307329FAF
Disk identifier (GUID): AA41E391-374A-44E3-A46C-FF32435131F9
Disk identifier (GUID): 113F3E0A-AE6A-4DB7-B68A-FC3FA05230B6
Disk identifier (GUID): 747F78F7-2A98-49D0-8D7E-98910EB282D3
Disk identifier (GUID): 50D6C777-0FEA-401E-86D2-15F4AA853605
Disk identifier (GUID): 099821D1-9ABF-4183-879F-107602ADA5D7
Disk identifier (GUID): B1C96257-86A2-4A82-8391-8F7A30EA7BAE
Disk identifier (GUID): 61D8174B-0FF2-4E23-94E2-4CD8C887FEF9
Problem reading disk in BasicMBRData::ReadMBRData()!
Warning! Read error 22; strange behavior now likely!
Warning! Read error 22; strange behavior now likely!
Disk identifier (GUID): 47F93EC9-EAFD-4349-B82D-040B1C15517B
Disk identifier (GUID): C33B4D83-7D0E-45E1-B2EB-68EDE2BEBB7A
Disk identifier (GUID): 82B84F3A-0538-4ADB-9467-699E17E87DB9
А также при этом это не UUID раздела созданного на GPT диске ploop:
for i in `find /dev/ploop*|egrep -v 'p1$'`;do blkid ${i}p1;done
/dev/ploop10267p1: UUID="bc34c9db-04f8-4c43-b180-210560e0bf50" TYPE="ext4"
/dev/ploop14204p1: UUID="c3b4888a-22a5-4025-b37f-d61904b16567" TYPE="ext4"
/dev/ploop18546p1: UUID="b2aa615b-8375-4a1f-8bf9-1756696d6718" TYPE="ext4"
/dev/ploop18662p1: UUID="b8ccbf07-85fe-44d3-bbc4-6593a3a0c872" TYPE="ext4"
/dev/ploop22367p1: UUID="88829ca9-e1b5-4499-94fe-46d987055368" TYPE="ext4"
/dev/ploop35145p1: UUID="b9370d59-fbad-4e15-b559-2c4af5f4a254" TYPE="ext4"
/dev/ploop38462p1: UUID="189bbe9e-20a2-4b09-8e61-1bf30a4a89f2" TYPE="ext4"
/dev/ploop41650p1: UUID="cb56f5a8-5e47-4ea4-b9bf-bd8e5b8578ff" TYPE="ext4"
/dev/ploop41997p1: UUID="4f53649c-683e-4a31-baea-87a446834f02" TYPE="ext4"
/dev/ploop57837p1: UUID="23028f1d-60de-4d7d-adf9-8466dbb1ff45" TYPE="ext4"
/dev/ploop57849p1: UUID="4f8bf47b-2259-4e60-9f69-bf4828740ee4" TYPE="ext4" 

Не связывайтесь с фондом DST и товарищами серии Мильнера! Никогда!

Вот Вам отличная статья на тему "почему": http://habrahabr.ru/company/roem/blog/193488/

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 :)

Friday, 1 November 2013

Сборка resize2fs из комплекта e2fsprogs

Зачем? Для работы ploop на OpenVZ/CentOS 5. Для CentOS 6 в репозитории OpenVZ поставляется спец пакетик с обновленной (относительно системы) версией resize2fs:
rpm -ql e2fsprogs-resize2fs-static-1.42.3-3.el6.1.ovz.x86_64
/usr/libexec/resize2fs
Слинкован он при этом статически, без внешних зависимостей:
ldd /usr/libexec/resize2fs
linux-vdso.so.1 =>  (0x00007fff29eec000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f9fb7bee000)
libc.so.6 => /lib/libc.so.6 (0x00007f9fb785b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9fb7e15000)

Попробуем сделать тоже самое, но для OpenVZ на CentOS 5:
yum install -y gcc make
cd /usr/src
wget -Oe2fsprogs-1.42.3.tar.gz 'http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.42.3/e2fsprogs-1.42.3.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fe2fsprogs%2Ffiles%2Fe2fsprogs%2Fv1.42.3%2F&ts=1383316431&use_mirror=citylan'
tar -xf e2fsprogs-1.42.3.tar.gz
cd e2fsprogs-1.42.3/
./configure --prefix=/opt/e2fsprogs  --disable-debugfs --disable-defrag --disable-imager
make install

В итоге в папочке /opt/e2fsprogs мы обнаружим статически слинкованный resize2fs:
ldd /opt/e2fsprogs/sbin/resize2fs
linux-vdso.so.1 =>  (0x00007fff7ad85000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003201800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003201000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003200c00000)
Который можно закинуть на CentOS 5 ноду, чтобы добиться корректной работы ploop на CentOS 5.

Ради теста перекинул на другую машину и все заработало на ура:
./resize2fs
resize2fs 1.42.3 (14-May-2012)
Usage: ./resize2fs [-d debug_flags] [-f] [-F] [-M] [-P] [-p] device [new_size]

Но итог всей затеи - ploop на CentOS 5 не особо удачный:
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune4fs -c or -i to override.
tune2fs 1.39 (29-May-2006)
tune2fs: Filesystem has unsupported feature(s) while trying to open /dev/ploop26472p1
Couldn't find valid filesystem superblock.
Error in run_prg_rc (util.c:289): Command tune2fs -ouser_xattr,acl /dev/ploop26472p1  exited with code 1
Unmounting device /dev/ploop26472
Failed to create image: Error in run_prg_rc (util.c:289): Command tune2fs -ouser_xattr,acl /dev/ploop26472p1  exited with code 1 [24]
Destroying container private area: /vz/private/7777
Creation of container private area failed
Надо менять в ploop вызовы tune2fs на tune4fs, так как в CentOS 5 пакеты и тулзы для экст2/3 и экст4 - отдельные.

Миграция Debian 7 Wheezy на systemd

Зачем? Попробовать systemd!

Итак, все очень просто:
apt-get update -y
apt-get install -y systemd

После этого нужно явно указать инит через параметры grub:
$EDITOR /etc/default/grub 
И приводим строку к виду GRUB_CMDLINE_LINUX_DEFAULT:
GRUB_CMDLINE_LINUX_DEFAULT="тут_у_вас_ранее_были_параметры_сохраните_их_тут init=/lib/systemd/systemd"

После этого обновляем конфигурацию grub:
update-grub
Зачем такие сложности с grub? Дело в том, что в Debian есть проблемы с пакетом systemd-sysv, он конфликтует с пакетом существующего загрузчика init, который в свою очередь невозможно (возможно, конечно, в теории, но вряд ли после этого Вы сможете нормально пользоваться сервером) удалить/заменить через пакетный менеджер.

И перезагружаемся:
shutdown -r now 

Если все загрузилось корректно, убеждаемся в этом:
ps aux|grep systemd
root         1  0.7  0.0  40984  3924 ?        Ss   11:45   0:01 /lib/systemd/systemd
root       312  0.0  0.0  34772  1504 ?        Ss   11:45   0:00 /lib/systemd/systemd-journald
105        853  0.0  0.0  29800  1456 ?        Ss   11:46   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root       958  0.0  0.0  34392  1588 ?        Ss   11:46   0:00 /lib/systemd/systemd-logind
root      1119  0.0  0.0   9232   880 pts/0    S+   11:48   0:00 grep systemd

Tuesday, 29 October 2013

Build vzctl from source code on CentOS 6

Во-первых, сначала подключите openvz репозиторий, так как ploop-devel есть только там.

Собираем:
yum install -y automake libxml2-devel libtool ploop-devel libcgroup-devel git
cd /usr/src
git clone git://git.openvz.org/vzctl
cd vzctl
./autogen.sh
./configure --prefix=/opt/vzctl
make
make install
Вуаля:
/opt/vzctl/sbin/vzctl --version
vzctl version 4.5.1-55.git.0da90c7

Бесплатная версия Nginx Plus

Уверен, многие слышали про платную коммерческую версию Nginx Plus. И всецело уверен, что ее никто из читающих меня не купил и не купит по причине неадекватнейшей стоимости - несколько тысяч долларов в год.

Я, безусловно, уважаю автора данного ПО, оно используется мной и нашей компанией повсеместно. Спасибо!

Но я нифига не уважаю их новый состав коммерцизирующий данный продукт и все последствия данного процесса.

В открытой версии Nginx откровенно саботировался ряд фич (в том числе Игорем, к сожалению):

  • syslog логгирование
  • динамический модули
  • тестирование состояния бэкэндов
  • нормальное, а не ущербное отображения состония
  • многое-многое другое

Я не придерживаюсь взглядов, что все должно быть бесплатно, люди должны зарабатывать деньги - тем более, на своем собственном продукте, но в разумных рамках и разумных ценах.

В ответ на это я предлагаю отличнейшее решение от наших китайских друзей - Taobao, Tengine - это полностью бинарно совместимый с Nginx.org веб-сервер, но с кучей полезнейших фич (которые nginx.org саботирует от включения в опен сорц версию).

Вот часть из суперфич:
  • All features of nginx-1.2.9 are inherited, i.e., it is 100% compatible with nginx.
  • Dynamic module loading support. You don't need to recompile Tengine when adding new modules to it.
  • Sends unbuffered upload directly to HTTP and FastCGI backend servers, which saves disk I/Os.
  • More load balancing methods, e.g., consistent hashing, and session persistence.
  • Input body filter support. It's quite handy to write Web Application Firewalls using this mechanism.
  • Dynamic scripting language (Lua) support, which is very efficient and makes it easy to extend core functionalities.
  • Logging enhancements. Syslog (local and remote), pipe logging, and log sampling are supported.
  • Includes a mechanism to support standalone processes.
  • Protects the server in case system load or memory use goes too high.
  • Multiple CSS or JavaScript requests can be combined into one request to reduce download time.
  • Removes unnecessary white spaces and comments to reduce the size of a page.
  • Proactive health checks of upstream servers can be performed.
  • The number of worker processes and CPU affinities can be set automatically.
  • The limit_req module is enhanced with whitelist support and more conditions are allowed in a single location.
  • Enhanced diagnostic information makes it easier to troubleshoot errors.
  • More user-friendly command lines, e.g., showing all compiled-in modules and supported directives.
  • Expiration times can be specified for certain MIME types.
  • Error pages can be reset to 'default'.

Прошу: https://github.com/alibaba/tengine

Thursday, 24 October 2013

Практический опыт с HDFS

Вот поставил на две ноды, радуюсь. И сломал через 25 минут после установки - появились corrupted nodes ( Corrupt blocks: 1),  забил, удалил файл и залил заново - все заработало.

Попробовал отключить один из серверов (на оставшемся были все реплики) и получил следующее:
sudo -u hdfs hadoop fs -get /mydir/1Gb.dat /tmp/asdasd
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fca186b3792, pid=13965, tid=140505678411520
#
# JRE version: Java(TM) SE Runtime Environment (7.0_45-b18) (build 1.7.0_45-b18)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x55b792]  PhaseCFG::schedule_node_into_block(Node*, Block*)+0xc2
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /tmp/hs_err_pid13965.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
[root@hadoop tmp]# cat /tmp/hs_err_pid13965.log
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fca186b3792, pid=13965, tid=140505678411520
#
# JRE version: Java(TM) SE Runtime Environment (7.0_45-b18) (build 1.7.0_45-b18)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x55b792]  PhaseCFG::schedule_node_into_block(Node*, Block*)+0xc2
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
Ну и после 3х минут чесания репы и понимания - сломать _самому_ кластерную супернадежную ФС - это уж слишком, тянусь к мемтестеру :)

Который через 4 секунды теста показывает серьезные повреждения:
memtester 12000
memtester version 4.2.1 (64-bit)
Copyright (C) 2010 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 12000MB (12582912000 bytes)
got  12000MB (12582912000 bytes), trying mlock ...locked.
Loop 1:
  Stuck Address       : testing   0FAILURE: possible bad address line at offset 0xd8ccd000.
Skipping to next test...
  Random Value       

P.S. НЕ ВЕРЬТЕ, что hadoop будет работать на _любом железе_. ECC/chipkill - must have.

Wednesday, 23 October 2013

Установка HDFS на базе Cloudera Hadoop 4.4.0 для CentOS 6

Что есть HDFS?

HDFS - это распределенная файловая система. В данной инструкции мы поставим ее в тестовом режиме! Это небезопасно, в боевом режиме Вы обязательно должны настроить HA или копирование на NFS для метаданных.

Пару слов об аппаратной конфигурации - для начала, мы развертываем HDFS на одном сервере с двумя жесткими дисками (иначе вообще вся затея с распределенной ФС становится бессмысленной). В моем примере диски смонтированы как /data/disk1 и /data/disk2.

Конфигурируем hostname и /etc/hosts

В самом-самом начале пути нужно сделать следующее - открыть редактором /etc/sysconfig/network и в поле HOSTNAME вписать корректный хостнейм адрес машины в виде:
HOSTNAME=hadoop.fastvps.ru

Следом открыть файл hosts: /etc/hosts и там вписать/исправить следующее:
88.198.XX.XX  hadoop.fastvps.ru hadoop

Где 89.198.XX.XX - ВНЕШНИЙ IP адрес сервера, НЕ localhost/127.0.0.1.

После этого в обязательном порядке перезагружаемся, чтобы система подхватила обновленный hostname.

Теперь проверяем, чтобы  хостнейм резолвился во внешний IP командой ping (запись в DNS в данный момент не нужна):
 ping -c 1 hadoop.fastvps.ru
PING hadoop.fastvps.ru (89.198.XX.XX) 56(84) bytes of data.
64 bytes from hadoop.fastvps.ru (89.198.XX.XX): icmp_seq=1 ttl=64 time=0.025 ms
--- hadoop.fastvps.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.025/0.025/0.025/0.000 ms

Все, это позволит избежать кучи проблем в будущем. Корректный хостнейм ОЧЕНЬ важен для Hadoop, кривые данные в нем могут привести к очень и очень плачевным последствиям.

Устанавливаем Java

Итак, для работы Cloudera нам нужна Java версии 1.7 (я использовал update 45), так что идем на сайт Oracle и стягиваем там "jre-7-linux-x64.rpm".

Водружаем ее:
yum install -y jre-7-linux-x64.rpm

Проверяем, что все встало корректно:
java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)
Устанавливаем Cloudera Hadoop

Стягиваем репо:
wget http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/cloudera-cdh4.repo -O/etc/yum.repos.d/cloudera-cdh4.repo

Ставим все, что нужно для работы Hadoop HDFS (почти 200 мегабайт пакетов):
yum install hadoop-hdfs-namenode hadoop-hdfs-datanode hadoop-client 
Копируем стандартный конфиг для правки:
cp -r /etc/hadoop/conf.dist /etc/hadoop/conf.my_cluster
alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
Теперь нужно настроить кластер, в файле /etc/hadoop/conf.my_cluster/core-site.xml 
В блок confguration вносим следующее (это имя нашего кластера):

<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.fastvps.ru/</value>
</property> 
<property><name>fs.trash.interval</name> <value>10080</value> </property>
Второй параметр отвечает за активацию корзины (и ее автоочистки через неделю после удаления файла). Обращаю внимание, что корзина работает только с hdfs shell, через API файлы сносятся сразу же.

Далее открываем файл /etc/hadoop/conf.my_cluster/hdfs-site.xml и в блок configuration вносим:

<property> <name>dfs.permissions.superusergroup</name>
<value>hadoop</value></property>
<property> <name>dfs.namenode.name.dir</name>
<value>/data/disk1/dfs/namenode
</value> </property> 
<property>
 <name>dfs.datanode.data.dir</name>
 <value>/data/disk1/dfs/datanode,/data/disk2/dfs/datanode</value>
</property>
<property>
<name>dfs.datanode.failed.volumes.tolerated</name>
<value>1</value>
</property>
<property>
 <name>dfs.replication</name>
<value>2</value>
</property> 

Тут мы задаем пути до папок хранения данных namednode (тут будут метаданные) и datanode (тут будут сами данные). С предпоследним параметром интереснее - это предельное число data нод, которые могут отказать на данном сервере. А вот последний параметр задает стандартное число реплик для файлов. Стандартно стоит 3, но это неудобно для тестового стенда.

Создаем указанные папки (предполагаем, что диски 1 и 2 смонтированы в /data/disk1 и /data/disk2 соответственно):
mkdir -p /data/disk1/dfs/namenode
mkdir -p /data/disk1/dfs/datanode
mkdir -p /data/disk2/dfs/datanode

И конфигурируем их права:
chown -R hdfs:hdfs /data/disk1/dfs/namenode /data/disk1/dfs/datanode /data/disk2/dfs/datanode
chmod 700 /data/disk1/dfs/namenode

Теперь форматируем namenode:
sudo -u hdfs hadoop namenode -format

Запускаем namenode:
/etc/init.d/hadoop-hdfs-namenode start

Запускаем  data node:
/etc/init.d/hadoop-hdfs-datanode start

Создаем свою первую папку:
sudo -u hdfs hadoop fs -mkdir  /mydir
Тестируем работу HDFS

Смотрим листинг корневой директории:
sudo -u hdfs hadoop fs -ls /
Found 1 items
drwxr-xr-x   - hdfs hadoop          0 2013-10-24 00:26 /mydir
Кладем файл в HDFS (ВНИМАНИЕ! НЕ забываем, что мы работаем от имени пользователя hdfs, так что файл в локальной ФС должен быть доступен ему на чтение):
sudo -u hdfs hadoop fs -put /tmp/jre-7-linux-x64.rpm /mydir

Убеждаемся, что он лег:
sudo -u hdfs hadoop fs -ls  /mydir
Found 1 items
-rw-r--r--   3 hdfs hadoop   21203924 2013-10-24 00:36 /mydir/jre-7-linux-x64.rpm
Кстати говоря, большой тестовый файл можно взять вот здесь: http://proof.ovh.net/files/ 

Мониторинг HDFS

Его можно осуществлять посредством веб-скрипта: http://IP_адрес_вашей_namenode:50070/dfshealth.jsp

Настройка HDFS Fuse

Так как каждый раз пользоваться hadoop fs неудобно далеко не всегда, я рекомендую использовать Fuse модуль, чтобы смонтировать HDFS как обычную ФС (не забываем, HDFS - не Posix! Блокировки и правки файлов не поддерживаются).
yum install hadoop-hdfs-fuse
Монтируем:
 hadoop-fuse-dfs dfs://hadoop.fastvps.ru:8020 /mnt
Вуаля, тот же файлик доступен как обычная файловая система:
ls -al /mnt/mydir/
итого 11G
drwxr-xr-x 3 hdfs hadoop 4,0K Окт 24 03:30 .
drwxr-xr-x 3 hdfs hadoop 4,0K Окт 24 03:21 ..
-rw-r--r-- 1 hdfs hadoop  10G Окт 24 03:30 10Gio.dat
Отмонтировать его можно стандартно:
umount /mnt
Что дальше?

В следующей публикации я постараюсь поставить второй сервер как datanode, чтобы на практике протестировать функцию отказоустойчивости HDFS

Установка datanode на отдельном сервере

Устанавливаем Java по аналогии с предыдущим сервером, далее также конфигурируем hostname и /etc/hosts. Данный сервер назовем data1-hadoop.fastvps.ru. 

Подразумеваем, что на данном сервере у нас один жесткий диск и он смонтирован в /data/disk1.

Так как мы подошли к вопросу распределенной фермы, то мы должны адрес name node забить в DNS либо же на каждой data node создать следующую запись в hosts (обоих серверов!!! Также нужно добавить хостнейм клиента на name node, то есть они должны знать друг друга! Иначе ничего работать не будет! Лучше всего, сразу внесите записи в DNS до начала тестов, а также убедитесь, что дата ноды и name нода находятся в одном домене второго уровня):
88.198.xx.xx hadoop.fastvps.ru hadoop

Далее ставим hadoop data node:
yum install -y hadoop-hdfs-datanode
Копируем стандартный конфиг для правки:
cp -r /etc/hadoop/conf.dist /etc/hadoop/conf.my_cluster
alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
Теперь нужно настроить кластер, в файле /etc/hadoop/conf.my_cluster/core-site.xml 
В блок confguration вносим следующее (это имя нашего кластера):

<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.fastvps.ru/</value>
</property> 
<property><name>fs.trash.interval</name> <value>10080</value> </property>

Далее открываем файл /etc/hadoop/conf.my_cluster/hdfs-site.xml и в блок configuration вносим:

<property> <name>dfs.permissions.superusergroup</name>
<value>hadoop</value></property>
<property>
 <name>dfs.datanode.data.dir</name>
 <value>/data/disk1/dfs/datanode</value>
</property>
Создаем необходимую папку:
mkdir -p /data/disk1/dfs/datanode

Выставляем права:
chown -R hdfs:hdfs /data/disk1/dfs/datanode

Запускаем  data node:
/etc/init.d/hadoop-hdfs-datanode start

Теперь можно открыть статистику HDFS и смотреть, как блоки нашего 10 гигабайтного файла реплицируются на вновь добавленный сервер.

Как репликация закончится, можно смело отключать второй сервер (отключив сервер с name node Вы выведете кластер из строя, да) и продолжать работать с файловой системой как ни в чем ни бывало!

Ура!

Источник: http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.2.0/CDH4-Installation-Guide/cdh4ig_topic_11_2.html