FastNetMon

Sunday 31 January 2010

О распределенных системах

http://softwaremaniacs.org/blog/2010/01/31/brewers-cap-theorem/

OpenVZ, TCP: time wait bucket table overflow

Столкнулись с такой проблемой в dmesg:
TCP: time wait bucket table overflow


Среди возможной причины предполагаем огромное число TIME_WAIT соединений:
netstat -npt | grep TIME_WAIT | wc -l
710


Вот один из вариантов фикса от Red Hat: http://kbase.redhat.com/faq/docs/DOC-1253

Как я понял, число TIME WAIT можно увеличить, увеличив следующую переменную:

cat /proc/sys/net/ipv4/tcp_max_tw_buckets

720000


Увеличим вдвое:

echo 1440000 > /proc/sys/net/ipv4/tcp_max_tw_buckets


Предположительно, проблема решилась (ну или просто мессаджи перестали сыпаться в dmesg) :)

Как в мультипроцессорной системе перенести обработку прерываний eth на другое ядро?

Имеем такую картину:

cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
0: 524 0 0 1797756799 0 0 0 0 IO-APIC-edge timer
1: 0 0 0 968 0 0 0 0 IO-APIC-edge i8042
8: 0 0 0 0 0 0 3 0 IO-APIC-edge rtc
9: 0 0 0 0 0 0 0 0 IO-APIC-level acpi
12: 4 0 0 0 0 0 0 0 IO-APIC-edge i8042
50: 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb3
58: 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb4
66: 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb5, uhci_hcd:usb7
74: 2230577823 0 0 0 0 0 0 0 PCI-MSI ahci
82: 97331448 0 0 0 0 0 0 0 PCI-MSI eth0
225: 0 0 0 0 0 0 0 0 IO-APIC-level ehci_hcd:usb1, uhci_hcd:usb8
233: 0 0 0 0 0 0 0 0 IO-APIC-level ehci_hcd:usb2, uhci_hcd:usb6
NMI: 0 0 0 0 0 0 0 0
LOC: 1747868310 1788131037 1787952568 1797756803 1788681699 1790209706 1788657167 1790195713
ERR: 0
MIS: 0


eth0 соответствует 82 прерывание и все они обрабатываются 1м ядром.

cat /proc/irq/82/smp_affinity
ffffffff



Чтобы привязать прерывание к процессору или группе процессоров, сначала нужно определить, какой процессор должен обрабатывать прерывание, и соответствующим образом задать битовую маску. Крайний справа бит маски устанавливается для CPU0, следующий для CPU1 и так далее. Для обозначения группы процессоров можно установить несколько битов. После этого задайте значение битовой маски, выполнив следующую команду:

echo bitmask > /proc/irq/IRQ_number/smp_affinity

Например, чтобы привязать обработку прерывания номер 177 к процессорам с 4 по 7 (битовая маска 11110000), выполните:

echo f0 > /proc/irq/177/smp_affinity


Переносим обработку прерываний на 4-8е ядра:

echo f0 > /proc/irq/82/smp_affinity


Смотрим результат:

cat /proc/irq/82/smp_affinity
000000f0


Ну и результат:

cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
0: 524 0 0 1798224886 0 0 0 0 IO-APIC-edge timer
1: 0 0 0 968 0 0 0 0 IO-APIC-edge i8042
8: 0 0 0 0 0 0 3 0 IO-APIC-edge rtc
9: 0 0 0 0 0 0 0 0 IO-APIC-level acpi
12: 4 0 0 0 0 0 0 0 IO-APIC-edge i8042
50: 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb3
58: 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb4
66: 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb5, uhci_hcd:usb7
74: 2230694661 0 0 0 0 0 0 0 PCI-MSI ahci
82: 97820891 0 0 0 74684 0 0 0 PCI-MSI eth0
225: 0 0 0 0 0 0 0 0 IO-APIC-level ehci_hcd:usb1, uhci_hcd:usb8
233: 0 0 0 0 0 0 0 0 IO-APIC-level ehci_hcd:usb2, uhci_hcd:usb6
NMI: 0 0 0 0 0 0 0 0
LOC: 1748336398 1788599125 1788420656 1798224891 1789149787 1790677794 1789125255 1790663801
ERR: 0
MIS: 0



(с) http://www.ibm.com/developerworks/ru/library/l-scalability/index.html

Скрипт для автоматического бэкпортирования Nginx 0.7 на Debian 5 Lenny

http://fastvps.googlecode.com/svn/trunk/scripts/backport_nginx_07_deb.sh

Saturday 30 January 2010

Сменить пароль для юзера VDSManager из консоли

passwd=`pwgen 16 1`; username=admin; echo $passwd ; /usr/local/ispmgr/sbin/mgrctl -m vdsmgr user.edit name=$username level=admin sok=ok passwd=$passwd elid=$username

Как CRON исполняет процессы от имени пользователя?

Смена uid/gid происходит посредством setgid():


[pid 5591] read(5,
[pid 5593] <... stat resumed> {st_mode=S_IFREG|0644, st_size=2194, ...}) = 0
[pid 5593] getpid() = 5593
[pid 5593] sendto(7, "<78>Jan 30 19:27:01 /USR/SBIN/CRO"..., 59, MSG_NOSIGNAL, NULL, 0) = 59
[pid 5593] close(7) = 0
[pid 5593] setsid() = 5593
[pid 5593] close(4) = 0
[pid 5593] close(5) = 0
[pid 5593] dup2(3, 0) = 0
[pid 5593] dup2(6, 1) = 1
[pid 5593] dup2(1, 2) = 2
[pid 5593] close(3) = 0
[pid 5593] close(6) = 0
[pid 5593] setgid(1001) = 0
[pid 5593] open("/proc/sys/kernel/ngroups_max", O_RDONLY) = 3

Что делать, если у Вас украли webmoney?

Читать это: http://habrahabr.ru/blogs/webmoney/75533/

О толерантности

Friday 29 January 2010

Catalyst: конфигурация модели

Сабж довольно частый -- очень удобно иметь единый конфиг, а не размазаный по десятку модулей. Сходя найти решение "как передать конфигу в модель" не нашёл, но спас Гугл: http://blog.jrock.us/articles/Catalyst%20Tips:%20Part%201.pod

Пишем простейший фильтр исходных кодов

Вот сегодня на очередном совещании по работе мне напомнили про такую суперскую вещь как "фильтры исходных кодов"; я давно хотел их попробовать, но постоянно забывал, что же! Пора =)

Исходный код вот:

package MyFilter;

use Filter::Util::Call;

sub import {
my ($type) = @_;

my ($ref) = [];
filter_add(bless $ref);
}

sub filter {
my ($self) = @_;
my ($status);


s/"([a-zA-Z]+)"/"uc $1"/eg
if ($status = filter_read()) > 0;

$status;
}

1;


Запускаем:
perl -MMyFilter -e 'print "AaAaaaA"'
AAAAAAA


Уж и стоит ли мне говорить, что посредством такого супердвижка можно легко написать на Перле свой ДЯП ?)

пысы: кого воткнуло, идём читать: http://perldoc.perl.org/perlfilter.html

О $c->model

В документации по Каталисту на Цпане сказано:
If the name is omitted, it will look for - a model object in $c->stash->{current_model_instance}, then - a model name in $c->stash->{current_model}, then - a config setting 'default_model', or - check if there is only one model, and return it if that's the case.


Обращаем внимание на последний пункт по причине, что он нифига не работает, т.е. чтобы обращаться по $c->model() (вместо $c->model('MyModelName')) надо ОБЯЗАТЕЛЬНО вписать в конфиг параметр default_model: VashModel и только после этого оно заработает. Так понимаю, это бага.

Интересное решение для автозаполнения форм

Вот, прошу: http://search.cpan.org/~icd/Catalyst-Plugin-AutoSession-0.02/AutoSession.pm

Список почти всех расширений для Каталиста

http://search.cpan.org/~hkclark/Catalyst-Manual-5.7020/lib/Catalyst/Manual/Plugins.pod

Как создать объект, конструируемый на этапе старта Каталиста

Как создать объект конструируемый на этапе старта Каталиста, который потом использовался всеми контроллерами до окончания работы Каталиста ? А вот так: http://community.livejournal.com/ru_catalyst/9867.html

И вопрос и ссылка заимствованы с вышеуказанного урла.

Перенос PAR пэкаджа с 32 битной на 64 битную платформу

Я уже говорил, что PAR кроме pm модулей на чистом Перле складывает в свой архив .so расширения, и обещался провести эксперимент переноса рабочего приложения с 32 битной на 64 битную платформу.

Внимание, рабочая машинка имеет конфу (сервер, никаких спец модулей для Perl нету):
2.6.18-ovz-smp-alt14 #1 SMP Wed May 2 15:41:34 MSD 2007 x86_64 x86_64 x86_64 GNU/Linux
девелоперская:
Linux nrg-desktop 2.6.24-22-generic #1 SMP Mon Nov 24 18:32:42 UTC 2008 i686 GNU/Linux

Как собрать PAR пэкадж я уже говорил в http://perlaround.blogspot.com/2009/03/par-catalyst.html, сейчас обсудим комплекс мер по подготовке второй системы к приёму пэкадажа :)

Ставим PAR: sudo cpan PAR PAR::Packer (возможно, PAR::Packer придётся ставить через cpan force).
Переливаем пэкадж на новую машину каким-то образом (я предпочитаю sftp, т.к. он сходу работает в Гноме).

Запускаем и обламываемся:

Can't load '/tmp/par-nrg/cache-e463425e9fd4743fd99b42ffc3b1f2aee266f2aa/2b152795.so' for module HTML::Parser: /tmp/par-nrg/cache-e463425e9fd4743fd99b42ffc3b1f2aee266f2aa/2b152795.so: неправильный класс ELF: ELFCLASS32 at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/DynaLoader.pm line 230.
at /usr/lib/perl5/site_perl/5.8.8/PAR/Heavy.pm line 109
Compilation failed in require at HTML/Entities.pm line 147.
Compilation failed in require at Catalyst/Engine.pm line 8.
BEGIN failed--compilation aborted at Catalyst/Engine.pm line 8.
Compilation failed in require at (eval 19) line 3.
...propagated at /usr/lib/perl5/5.8.8/base.pm line 85.
BEGIN failed--compilation aborted at Catalyst/Engine/CGI.pm line 4.
Compilation failed in require at (eval 18) line 3.
...propagated at /usr/lib/perl5/5.8.8/base.pm line 85.
BEGIN failed--compilation aborted at Catalyst/Engine/HTTP.pm line 4.
Compilation failed in require at ./script/catapp_server.pl line 9.
BEGIN failed--compilation aborted at ./script/catapp_server.pl line 10.


Как вариант, можно попробовать собрать в Пэкадж ещё и сам Перл интерпретатор (дада, вы не ослышались!), делается это так pp -o имя_нового_пэкаджа_с_перлом catapp_server.par, но в моём случае это тоже не помогло.

Что же, пока принимаю поражение, но не сдаюсь.

Добавление: вообще, вариант проблему решить посредством виртулизации, например, на qemu -- т.е. собрать дистрибутив, в котором будет 1) ядро ОС 2) Перл 3) Всё необходимое для пуска Перла и в таком виде его раздавать :) Но тут возникает ещё большая куча проблем -- как быть с диском для виртулки, как работать с сетью и проч. Так что тоже для мелочи не вариант.

Часть инфы взята из: http://catalyst.infogami.com/cookbook/par

Сборка PAR пэкаджа для Catalyst приложения

Как известно, Каталист имеет туеву кучу зависимостей и развернуть его на системе, где разработка на перле производится впервые довольно проблематично и может вылиться часа в 3 времени, решение задачи довольно очевидно -- собрать все нужные модули и засунуть в архив вместе с аппликацией. Впрочем, так и поступает PAR (Perl Archive Toolkit), их офсайт тут: http://par.perl.org

Но, как многие могли догадаться, проблем мы огребём по полной в случае завязывания приложения на XS модули, которые, во-первых, не так легко перетащить, а во-вторых, не так легко заставить работать под разными платформами (у меня, например, рабочая машинка 32 битная, а почти все на работе -- 64 битные). Но на наше счастье, Каталист не требует XS расширений (разве что опциональное XS Stash для Template Toolkit). Ладно, давайте проверим PAR в деле, а там разберемся, какие проблемы вылезут.

Ставим сам PAR: sudo cpan PAR PAR::Packer
Собираем пэкадж: переходим в папку с нашим Каталист проектом и вызываем: perl Makefile.PL после этого запускаем make catalyst_par и ждём, пока Пэкадж соберётся.

Следовало бы заметить, что PAR пэкадж запустится далеко не на любой системе, по крайней мере нам будет нужен Perl и сам PAR (в идеале, конечно же, было бы заиметь его в менеджере пакетов, тогда развертывание Перл приложений вообще превратилось в нечто сверх банальное).

Не знаю как у вас, но у меня PAR пэкадж собрался и весит 1,7 мегабайта, что же, попробуем его запустить! Для запуска используется программа "parl" (отличие от "perl" во второй букве), ну что пускаем!

После запуска видим нечто вот такое:

parl catalystapp.par
Usage:
[parl] catalystapp[.par] [script] [arguments]

Examples:
parl catalystapp.par catalystapp_server.pl -r
myapp catalystapp_cgi.pl

Available scripts:
catalystapp_cgi.pl
catalystapp_create.pl
catalystapp_fastcgi.pl
catalystapp_server.pl
catalystapp_test.pl


Как подсказывает хелп, пускать надо вот так: parl catalystapp.par catalystapp_server.pl -p 80, делаем это и вуаля! Каталист аппликация пустилась и отлично работает! =)

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

Да, кстати, по поводу огребания от XS -- PAR складывает .so модули в папочку по имени /lib/auto/ (папочку?! да, вы угадали, PAR -- это обычный архив). Вот интересный вопрос будет, что произойдёт при запуске на платформе другой архитектуры, что же, это мы попробуем прямо сейчас, но опишу в другом посте.

Создание собственных модулей для CPAN

Я создаю новые каркасы модулей следующей командой: h2xs --omit-XS --omit-autoload --force --version=0.01 --compat-version=5.8.8 --name Google::Charts1

В результате будет создана следующая структура:

Writing Google-Charts1/lib/Google/Charts1.pm
Writing Google-Charts1/Makefile.PL
Writing Google-Charts1/README
Writing Google-Charts1/t/Google-Charts1.t
Writing Google-Charts1/Changes
Writing Google-Charts1/MANIFEST


Сходу два недостатка: всё завязывается на Exporter + не генерируется привычный многим Build.PL.

А есть ли аналоги? Конечно! http://search.cpan.org/~jkeenan/ExtUtils-ModuleMaker-0.51/lib/ExtUtils/ModuleMaker.pm

To create a distribution containing only Perl code. ExtUtils::ModuleMaker is intended to be an easy-to-use replacement for this use of h2xs.


Но модуль нестандартный, поэтому его надо поставить: sudo cpan ExtUtils::ModuleMaker и изучить самостоятельно :)

Создание и запуск простейшего Catalyst приложения

Ну тут всё банально донельзя:

catalyst.pl my_test_catalyst_app
cd my_test_catalyst_app/
script/my_test_catalyst_app_server.pl -reload -p 80


И после этого встроенный сервер Каталиста будет запущен, в чём можно убедиться, открыв в браузере страницу: http://127.0.0.1

Установка Perl фреймворка Catalyst на Debian 5 Lenny с Perl 5.10

Сначала ставим сам CPAN:

apt-get install perl


Теперь поставим всё необходимое для сборки XS модулей (написанных на С) и в т.ч.команду make:
apt-get install gcc make



Обновим сам CPAN:
cpan YAML Bundle::CPAN


Теперь обновим все Perl модули, имеющиеся в системе:

cpan
cpan_shell: upgrade


У меня не обновились лишь следующие модули, но т.к. я их не использую, мне это не интересно:

DB_File 1.816_1 1.819 PMQS/DB_File-1.819.tar.gz
B 1.17 1.19 NWCLARK/perl-5.8.9.tar.gz



Ну и, наконец, поставим сам Catalyst:
cpan Task::Catalyst Catalyst::Devel


Не знаю, как у Вас, но у меня не встал лишь модуль: Catalyst::Plugin::Session::State::URI

Который придётся поставить насильно:

cpan
cpan_shell: force install Catalyst::Plugin::Session::State::URI


После этого надо повторить команды, которые мы использовали для установки Каталиста.

В итоге нас должна встретить вот такая прелестная надпись:

Task::Catalyst is up to date (3.0000).
Catalyst::Devel is up to date (1.10)


Попутно возникла идея сделать свой аналог http://search.cpan.org/~mramberg/Task-Catalyst-3.0000/lib/Task/Catalyst.pm куда включить наиболее часто используемые, на мой взгляд, модули. Причем, как и ожидалось, пакетная инсталляция там решаться через толстый Makefile.PL :)

Увеличить таймауты ожидания ответа Proxy в Nginx

Необходимо добавить в блок http следующее:
proxy_read_timeout 1800;
proxy_send_timeout 1800;

Debian: удобный chroot

Для многого софта необходимо чтобы в chroot были /dev, /proc, /sys. Обычно это делается вручную, но на Debian есть более простой способ, простенький скрипт:

chroot-prepare /mnt


После чего:
mount
/proc on /mnt/proc type none (rw,bind)
/sys on /mnt/sys type none (rw,bind)
/dev on /mnt/dev type none (rw,bind)


Теперь чрутимся:
chroot /mnt


Выходить из чрута в обратном порядке:

umount /mnt/proc
umount /mnt/dev
umount /mnt/sys
umount /mnt


А вот сам скрипт:

#!/bin/bash

mount --bind /dev /mnt/dev/
mount --bind /proc /mnt/proc/
mount --bind /sys /mnt/sys/

Установка webgrind

После работы xdebug в режиме профайлера в /tmp появляется огромное число его файлов данных, которые вручную обрабатывать почти нереально:


ls -la /tmp
-rw-r--r-- 1 default default 95M 2010-01-29 20:01 cachegrind.out.27788
-rw-r--r-- 1 default default 95M 2010-01-29 20:01 cachegrind.out.27789
-rw-r--r-- 1 default default 89M 2010-01-29 20:01 cachegrind.out.27793
-rw-r--r-- 1 default default 91M 2010-01-29 20:01 cachegrind.out.27794
-rw-r--r-- 1 default default 88M 2010-01-29 20:02 cachegrind.out.27795
-rw-r--r-- 1 default default 91M 2010-01-29 20:01 cachegrind.out.27796
-rw-r--r-- 1 default default 88M 2010-01-29 20:01 cachegrind.out.27797
-rw-r--r-- 1 default default 91M 2010-01-29 20:01 cachegrind.out.27798
-rw-r--r-- 1 default default 15M 2010-01-29 20:02 cachegrind.out.27940
-rw-r--r-- 1 default default 16M 2010-01-29 20:02 cachegrind.out.27941
-rw-r--r-- 1 default default 16M 2010-01-29 20:02 cachegrind.out.27942
-rw-r--r-- 1 default default 16M 2010-01-29 20:02 cachegrind.out.27943
-rw-r--r-- 1 default default 16M 2010-01-29 20:02 cachegrind.out.27944
-rw-r--r-- 1 default default 15M 2010-01-29 20:02 cachegrind.out.27945
-rw-r--r-- 1 default default 16M 2010-01-29 20:02 cachegrind.out.27946
-rw-r--r-- 1 default default 15M 2010-01-29 20:02 cachegrind.out.27947


В этом нам поможет webgrind:


Cтавим его:

cd /var/www
wget http://webgrind.googlecode.com/files/webgrind-release-1.0.zip
unzip webgrind-release-1.0.zip


После этого заходим на свой сервер: http://test1.ru/webgrind/ и выбираем в списке в верху необходимый файл и выбираем update. Теперь ждем пока построится отчет и обращаем основное внимание на столбец "total inclusive cost", который показывает, сколько процентов времени работы было потрачено на исполнение указанной функции.

Чем занимается CMS Wordpress во время исполнения?

Ставим стандартный Wordpress на сервер с Nginx/Apache2/PHP FastCGI и прогоняем 1000 запросов в 10 потоков (суммарно выходит 10 000 запросов). Получаем следующие цифры:

ab -c 10 -n 10000 http://test1.ru:80/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking test1.ru (be patient)
Completed 1000 requests
...
Finished 10000 requests


Server Software: nginx
Server Hostname: test1.ru
Server Port: 80

Document Path: /
Document Length: 4965 bytes

Concurrency Level: 10
Time taken for tests: 215.649745 seconds
Complete requests: 10000
Failed requests: 16
(Connect: 0, Length: 16, Exceptions: 0)
Write errors: 0
Non-2xx responses: 16
Total transferred: 51509264 bytes
HTML transferred: 49579184 bytes
Requests per second: 46.37 [#/sec] (mean)
Time per request: 215.650 [ms] (mean)
Time per request: 21.565 [ms] (mean, across all concurrent requests)
Transfer rate: 233.26 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 74.2 0 3032
Processing: -2873 217 936.8 167 46218
Waiting: 0 218 933.3 166 46218
Total: 0 219 933.8 167 46218

Percentage of the requests served within a certain time (ms)
50% 167
66% 170
75% 172
80% 173
90% 176
95% 179
98% 184
99% 843
100% 46218 (longest request)



При этом MySQL аккаунтинг показывает следующие цифры


Total_connections 9984
Connected_time 1517
Busy_time 10
Cpu_time 11
Bytes_received 23 783 628
Bytes_sent 179 513 360
Rows_fetched 83415
Rows_updated 8
Table_rows_read 223534
Select_commands 20253


То есть в среднем 1 открытие блога выходит 1 соединение с MySQL, 17 килобайт чтения с БД, 2 select запроса, чтение 8 строк с таблиц.

Но вот исходной задачи - узнать, какую часть времени движок тратит на работу с БД я так и не решил. Вот, похоже как это решать правильно: http://codex.wordpress.org/Testing_WordPress_Performance

Удаленный MySQL vs локальный

Тесты полная синтетика, кто скажет, что они ацтой - будет прав. На таргет машине голый вордпресс. Канал между машинами - 100 магабит череpз 3 хопа. Долбеж ведется посредством ab в такой конфигурации: ab -c 10 -n 1000 http://test1.ru:80/

Результаты тестов следующие:

Локальный мускул: Requests per second: 55.36 [#/sec] (mean)
Удаленный (без тюнинга - стандартный CentOS MySQL): Requests per second: 44.23 [#/sec] (mean)
Удаленный (с тюнингом): Requests per second: 46.40 [#/sec] (mean)



Локальный:

ab -c 10 -n 1000 http://test1.ru:80/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking test1.ru (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests


Server Software: nginx
Server Hostname: test1.ru
Server Port: 80

Document Path: /
Document Length: 4970 bytes

Concurrency Level: 10
Time taken for tests: 18.62123 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 5163000 bytes
HTML transferred: 4970000 bytes
Requests per second: 55.36 [#/sec] (mean)
Time per request: 180.621 [ms] (mean)
Time per request: 18.062 [ms] (mean, across all concurrent requests)
Transfer rate: 279.09 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 7
Processing: 0 207 25.0 210 420
Waiting: 0 207 25.0 209 420
Total: 0 207 25.0 210 420

Percentage of the requests served within a certain time (ms)
50% 210
66% 214
75% 215
80% 217
90% 220
95% 223
98% 227
99% 230
100% 420 (longest request)



Удаленный без тюнинга:


ab -c 10 -n 1000 http://test1.ru:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test1.ru (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: nginx
Server Hostname: test1.ru
Server Port: 80

Document Path: /
Document Length: 4915 bytes

Concurrency Level: 10
Time taken for tests: 22.608 seconds
Complete requests: 1000
Failed requests: 6
(Connect: 0, Receive: 0, Length: 6, Exceptions: 0)
Write errors: 0
Non-2xx responses: 6
Total transferred: 5081774 bytes
HTML transferred: 4888744 bytes
Requests per second: 44.23 [#/sec] (mean)
Time per request: 226.083 [ms] (mean)
Time per request: 22.608 [ms] (mean, across all concurrent requests)
Transfer rate: 219.51 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 2 3 0.1 3 3
Processing: 27 223 385.7 182 8266
Waiting: 27 223 385.7 182 8265
Total: 30 226 385.7 184 8268

Percentage of the requests served within a certain time (ms)
50% 184
66% 200
75% 213
80% 222
90% 244
95% 255
98% 275
99% 2110
100% 8268 (longest request)




Удаленный с тюнингом:


ab -c 10 -n 1000 http://test1.ru:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test1.ru (be patient)



Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: nginx
Server Hostname: test1.ru
Server Port: 80

Document Path: /
Document Length: 4915 bytes

Concurrency Level: 10
Time taken for tests: 21.550 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 5108000 bytes
HTML transferred: 4915000 bytes
Requests per second: 46.40 [#/sec] (mean)
Time per request: 215.504 [ms] (mean)
Time per request: 21.550 [ms] (mean, across all concurrent requests)
Transfer rate: 231.47 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 2 3 0.1 3 3
Processing: 109 212 33.9 213 291
Waiting: 109 212 33.9 212 290
Total: 112 215 33.9 215 293

Percentage of the requests served within a certain time (ms)
50% 215
66% 236
75% 246
80% 250
90% 259
95% 266
98% 273
99% 277
100% 293 (longest request)

Thursday 28 January 2010

SSD захватывает мир

http://images.anandtech.com/graphs/ssdfortheenterprise_011909095250/18635.png
и

http://images.anandtech.com/reviews/storage/Intel/34nmSSD/Review/used-4kb-read-mbs.png

One X25-E is 66% faster than eight (!) 15000RPM SAS drives.



(с) http://it.anandtech.com/IT/showdoc.aspx?i=3532&p=11&cp=7 и http://www.anandtech.com/storage/showdoc.aspx?i=3631&p=22

Postfix + noexec файловые система на /tmp

В итоге получаем такой облом:
Preconfiguring packages ...
Can't exec "/tmp/postfix.config.49981": Permission denied at /usr/share/perl/5.10/IPC/Open3.pm line 168.
open2: exec of /tmp/postfix.config.49981 configure 2.5.5-1.1 failed at /usr/share/perl5/Debconf/ConfModule.pm line 59

atop - маст хав для любого админа

Крайне рекомендую! Тулза показывает даже утилизацию канала и сколько данных было считано / записано процессов за время работы.

Как ориентироваться на http://git.kernel.org/?

На веб-интерфейсе к GIT репозиторию ядра http://git.kernel.org/ есть туева куча всяких ссылок. Какие же нам нужны? Во-первых, для всех уже выпущенных стабильных веток есть ссылки:


...
linux/kernel/git/stable/linux-2.6.30.y.git 2.6.30-stable tree
linux/kernel/git/stable/linux-2.6.31.y.git 2.6.31-stable tree
linux/kernel/git/stable/linux-2.6.32.y.git 2.6.32-stable tree


Чуть более сложно с поиском "текущей", то есть разрабатываемой в данный момент версии ядра. А она вот тут, как я понимаю, это ветка самого Линуса Торвальдса:


linux/kernel/git/torvalds/linux-2.6.git Linus' kernel tree


Ну вот, теперь можете серфить по просторам патчей ядра :)

Wednesday 27 January 2010

Apple iPAD

http://www.engadget.com/2010/01/27/live-from-the-apple-tablet-latest-creation-event/?sort=newest&refresh=30

Сборка модуля Nginx Upload Progress для Debian

Офсайт патча: http://github.com/masterzen/nginx-upload-progress-module

Ставим все необходимое для сборки:
apt-get install -y dpkg-dev devscripts build-essential fakeroot


Ставим зависимости:
apt-get build-dep nginx



cd /usr/src
apt-get source nginx
cd nginx-0.6.32
mkdir ngx_http_uploadprogress_module
cd ngx_http_uploadprogress_module
wget http://github.com/masterzen/nginx-upload-progress-module/raw/2bf172dac4373537927a3835d2da5b6080f6d336/ngx_http_uploadprogress_module.c
wget http://github.com/masterzen/nginx-upload-progress-module/raw/2bf172dac4373537927a3835d2da5b6080f6d336/config
cd ..


Открываем файл управления сборкой:
vi debian/rules


Ищем строку:
--with-http_ssl_module --with-http_dav_module


К ней добавляем:
--add-module=ngx_http_uploadprogress_module


Пересобираем:
debuild -us -uc # -us unsigned source, -uc unsigned changes


Теперь поднимаемся на уровень выше и ставим:
cd ..
dpkg -i nginx_0.6.32-3+lenny3_i386.deb


Убеждаемся, что все встало:

nginx -V 2>&1| grep --color uploadprogress


Теперь блокируем апдейт Nginx, чтобы его не апнуло при следующем апдейте:

echo "nginx hold" | dpkg --set-selections


По мотивам: http://devblog.imedo.de/2008/05/26/building-a-nginx-debian-package-with-fair-proxy-module/

Принимает ли PHP на Debian php.ini в текущей папке?

Принимает! А вот у Центоса в этом баг.

А вот тест:

cd /root
rm php.ini
echo "<?PHP phpinfo(); ?>" > test.php
php-cgi test.php > standard.log

echo "register_globals=on" > php.ini
php-cgi test.php > hacked.log

diff -u hacked.log standard.log


И в итоге должно остаться только 4 разницы - различные пути к пхп ини, статус регистер глобалс, селф (хз, что это) и время исполнения запрос.

Отличия symlink от hardlink

Мягкая ссылка (или символьная ссылка, или symlink) полностью отличается от жесткой ссылки: она является маленьким специальным файлом, который содержит путь к файлу. Таким образом, мягкая ссылка может указывать на файлы, которые находятся на других файловых системах (например, смонтированных по NFS с другой машины) и не нуждается в наличии того файла, на который она указывает. Когда происходит попытка доступа (с помощью системных вызовов open(2)


(c) http://www.opennet.ru/man.shtml?topic=ln&category=1

История в стиле fine

Крайне рекомендую к прочтению!

http://intaria.livejournal.com/66614.html
http://intaria.livejournal.com/66334.html

Monday 25 January 2010

Включить отладочный лог Nginx

Заменяем:
error_log /var/log/nginx/error.log;


На:
error_log /var/log/nginx/error.log debug;


Ну и рестартим Nginx.

Сколько памяти потребляет mod_php?

Простаивающий Apache c mod_php:
9854 root 40 0 361M 18616 9896 S 0.0 0.9 0:00.14 /usr/sbin/apache2 -k start
9855 www-data 40 0 148M 3016 476 S 0.0 0.1 0:00.01 /usr/sbin/apache2 -k start
9857 www-data 40 0 361M 11012 2172 S 0.0 0.5 0:00.00 /usr/sbin/apache2 -k start
9858 www-data 40 0 361M 11024 2184 S 0.0 0.5 0:00.00 /usr/sbin/apache2 -k start
9859 www-data 40 0 361M 10968 2136 S 0.0 0.5 0:00.00 /usr/sbin/apache2 -k start
9860 www-data 40 0 361M 9408 676 S 0.0 0.5 0:00.00 /usr/sbin/apache2 -k start
9861 www-data 40 0 361M 9404 672 S 0.0 0.5 0:00.00 /usr/sbin/apache2 -k start



И без:
10090 root 40 0 135M 4388 2228 S 0.0 0.2 0:00.06 /usr/sbin/apache2 -k start
10092 www-data 40 0 135M 2600 476 S 0.0 0.1 0:00.00 /usr/sbin/apache2 -k start
10093 www-data 40 0 135M 2836 656 S 0.0 0.1 0:00.00 /usr/sbin/apache2 -k start
10094 www-data 40 0 135M 2832 652 S 0.0 0.1 0:00.00 /usr/sbin/apache2 -k start
10095 www-data 40 0 135M 2832 652 S 0.0 0.1 0:00.00 /usr/sbin/apache2 -k start
10096 www-data 40 0 135M 2832 652 S 0.0 0.1 0:00.00 /usr/sbin/apache2 -k start
10097 www-data 40 0 135M 2832 652 S 0.0 0.1 0:00.00 /usr/sbin/apache2 -k start


К слову - если переключаете PHP на FastCGI, то не забывайте отключить модуль Апача.

Под нагрузкой от ab -c 10 -n 1000 http://test1.ru:80/ получаем следующие данные: без модуля PHP 434076k free, с ним: 413046k. Так что прирост, конечно, есть. Но то, что модуль PHP при своем огромном весе шарится между детями Апача сводит весь профит на нет.

Юбилей однако!

Offending key in /Users/nrg/.ssh/known_hosts:500
:)

Установка Nagios из исходников

Под Debian 5:
http://phpsuxx.blogspot.com/2010/01/nagios-32-debian-5-centreon.html

Под CentOS 5:
http://phpsuxx.blogspot.com/2010/01/nagios-32-centos-5.html

Установка Centreon 2.1.4: установка ядра

Исходный Мануал http://en.doc.centreon.com/Setup:Centos/Fedora/RHEL

Указываем путь к бинарикам Нагиоса:
export PATH="$PATH:/opt/nagios/bin/"


Стягиваем дистрибутив:
cd /usr/src
wget http://download.centreon.com/index.php?id=124
tar -xf centreon-2.1.4.tar.gz
cd centreon-2.1.4
./install.sh -i


А далее адова куча вопросов:

Принимаем лицензию:
Do you accept GPL license ?
[y/n], default to [n]:
> y



Выбираем все кроме Snmp Traps:
------------------------------------------------------------------------
Please choose what you want to install
------------------------------------------------------------------------

Do you want to install : Centreon Web Front
[y/n], default to [n]:
> y

Do you want to install : Centreon CentCore
[y/n], default to [n]:
> y

Do you want to install : Centreon Nagios Plugins
[y/n], default to [n]:
> y

Do you want to install : Centreon Snmp Traps process
[y/n], default to [n]:
> n


Далее указываем пути. Но разработчики КРАЙНЕ не рекомендуют их менять, Поменяете - огребете проблем, я предупредил.


------------------------------------------------------------------------
Start CentWeb Installation
------------------------------------------------------------------------

Where is your Centreon directory?
default to [/usr/local/centreon]
>
Path /usr/local/centreon OK

Where is your Centreon log directory
default to [/usr/local/centreon/log]
>
Path /usr/local/centreon/log OK

Where is your Centreon etc directory
default to [/etc/centreon]
>
Path /etc/centreon OK

Where is your Centreon generation_files directory?
default to [/usr/local/centreon]
>
Path /usr/local/centreon OK

Where is your Centreon variable library directory?
default to [/var/lib/centreon]
>
Path /var/lib/centreon OK

Where is your CentPlugins Traps binary
default to [/usr/local/centreon/bin]
>
Path /usr/local/centreon/bin OK

Where is the RRD perl module installed [RRDs.pm]
default to [/usr/lib/perl5/RRDs.pm]
>
Path /usr/lib/perl5 OK
/usr/bin/rrdtool OK
/usr/bin/mail OK

Where is PEAR [PEAR.php]
default to [/usr/share/php/PEAR.php]
>
Path /usr/share/php OK

Where is installed Nagios ?
default to [/usr/local/nagios]
> /opt/nagios
Path /opt/nagios OK

Where is your nagios config directory
default to [/usr/local/nagios/etc]
> /opt/nagios/etc
Path /opt/nagios/etc OK

Where is your Nagios var directory ?
default to [/usr/local/nagios/var]
> /opt/nagios/var
Path /opt/nagios/var OK

Where is your Nagios plugins (libexec) directory ?
default to [/usr/local/nagios/libexec]
> /opt/nagios_plugins
Path /opt/nagios_plugins OK
/opt/nagios/bin//nagios OK

Where is your Nagios image directory ?
default to [/usr/local/nagios/share/images/logos]
> /opt/nagios/share/images/logos
Path /opt/nagios/share/images/logos OK
/opt/nagios/bin//nagiostats OK
p1_file : /opt/nagios/bin/p1.pl OK
/usr/bin/php OK
/usr/bin/perl OK
Finding Apache group : www-data
Finding Apache user : www-data
Finding Nagios user : nagios
Finding Nagios group : nagios
/opt/nagios/bin//ndomod.o OK


Далее еще блок вопросов:

------------------------------------------------------------------------
Configure Sudo
------------------------------------------------------------------------

Where is sudo configuration file
default to [/etc/sudoers]
>
/etc/sudoers OK
Nagios init script OK
Your sudo is not configured

Do you want me to configure your sudo ? (WARNING)
[y/n], default to [n]:
> y
Configuring Sudo OK

------------------------------------------------------------------------
Configure Apache server
------------------------------------------------------------------------
Finding Apache Centreon configuration file
'/etc/apache2/conf.d/centreon.conf' : OK

Do you want to update Centreon Apache sub configuration file ?
[y/n], default to [n]:
> y
Create '/etc/apache2/conf.d/centreon.conf' OK
Configuring Apache OK

Do you want to reload your Apache ?
[y/n], default to [n]:
> y
Reloading Apache service OK
Preparing Centreon temporary files
Change right on /usr/local/centreon/log OK
Change right on /etc/centreon OK
Change right on /opt/nagios/share/images/logos OK
Install nagios documentation FAIL
Change macros for insertBaseConf.sql OK
Change macros for php files
Change macros for php files OK
Change right on /opt/nagios/etc OK
Copy CentWeb in system directory
Install CentWeb (web front of centreon) OK
Install libraries FAIL
Copying libinstall FAIL
Change macros for centreon.cron OK
Install Centreon cron.d file OK
Change macros for archiveDayLog OK
Change macros for centAcl.php OK
Install cron directory FAIL

------------------------------------------------------------------------
Pear Modules
------------------------------------------------------------------------
Check PEAR modules
PEAR 1.4.9 1.7.1 OK
DB 1.7.6 1.7.13 OK
DB_DataObject 1.8.4 1.9.3 OK
DB_DataObject_FormBuilder 1.0.0RC4 1.0.0 OK
MDB2 2.0.0 2.4.1 OK
Date 1.4.6 1.4.7 OK
HTML_Common 1.2.2 1.2.5 OK
HTML_QuickForm 3.2.5 3.2.11 OK
HTML_QuickForm_advmultiselect 1.1.0 1.5.1 OK
HTML_Table 1.6.1 1.8.2 OK
Archive_Tar 1.1 1.3.2 OK
Auth_SASL 1.0.1 1.0.3 OK
Console_Getopt 1.2 1.2.3 OK
Net_SMTP 1.2.8 1.4.1 OK
Net_Socket 1.0.1 1.0.9 OK
Net_Traceroute 0.21 0.21.2 OK
Net_Ping 2.4.1 2.4.5 OK
Validate 0.6.2 0.8.3 OK
XML_RPC 1.4.5 1.5.3 OK
SOAP 0.10.1 0.12.0 OK
Log 1.9.11 1.12.0 OK
All PEAR modules OK


Теперь ждем, пока апгрейднутся все PEAR модули.

Потом еще отвечаем на кучу вопросов, на котороые просто тыкаем Энтер:


------------------------------------------------------------------------
Centreon Post Install
------------------------------------------------------------------------
Create /usr/local/centreon/www/install/install.conf.php OK
Create /etc/centreon/instCentWeb.conf OK

------------------------------------------------------------------------
Start CentStorage Installation
------------------------------------------------------------------------

Where is your Centreon Run Dir directory?
default to [/var/run/centreon]
>
Path /var/run/centreon OK

Where is your CentStorage binary directory
default to [/usr/local/centreon/bin]
>
Path /usr/local/centreon/bin OK

Where is your CentStorage RRD directory
default to [/var/lib/centreon]
>
Path /var/lib/centreon OK
Finding Nagios group : nagios
Finding Nagios user : nagios
Preparing Centreon temporary files
/tmp/centreon-setup exists, it will be moved...
install www/install/createTablesCentstorage.sql OK
CentStorage status Directory already exists PASSED
CentStorage metrics Directory already exists PASSED
Change macros for centstorage binary OK
Install CentStorage binary OK
Install library for centstorage FAIL
Change right : /var/run/centreon OK
Change macros for centstorage init script OK

Do you want me to install CentStorage init script ?
[y/n], default to [n]:
>
CentStorage init script not installed, please use :
/usr/local/centreon/examples/centstorage.init.d PASSED
Change macros for logAnalyser OK
Install logAnalyser OK
Change macros for nagiosPerfTrace OK
Install nagiosPerfTrace OK
Change macros for purgeLogs OK
Install purgeLogs OK
Change macros for purgeCentstorage OK
Install purgeCentstorage OK
Change macros for centreonPurge.sh OK
Install centreonPurge.sh OK
Change macros for centstorage.cron OK
Install CentStorage cron OK
Create /etc/centreon/instCentStorage.conf OK

------------------------------------------------------------------------
Start CentCore Installation
------------------------------------------------------------------------

Where is your CentCore binary directory
default to [/usr/local/centreon/bin]
>
Path /usr/local/centreon/bin OK
/usr/bin/ssh OK
/usr/bin/scp OK
Finding Nagios group : nagios
Finding Nagios user : nagios
Preparing Centreon temporary files
/tmp/centreon-setup exists, it will be moved...
Change CentCore Macro OK
Copy CentCore in binary directory OK
Change right : /var/run/centreon OK
Change right : /var/lib/centreon OK
Replace CentCore init script Macro OK

Do you want me to install CentCore init script ?
[y/n], default to [n]:
>
CentCore init script not installed, please use :
/usr/local/centreon/examples/centcore.init.d PASSED
Create /etc/centreon/instCentCore.conf OK

------------------------------------------------------------------------
Start CentPlugins Installation
------------------------------------------------------------------------

Where is your CentPlugins lib directory
default to [/var/lib/centreon/centplugins]
>
Path /var/lib/centreon/centplugins OK
Finding Nagios user : nagios
Finding Nagios group : nagios
Preparing Centreon temporary files
/tmp/centreon-setup exists, it will be moved...
Change macros for CentPlugins OK
Installing the plugins OK
Change right on centreon.conf OK
CentPlugins is installed
Create /etc/centreon/instCentPlugins.conf OK
###############################################################################
# #
# Go to the URL : http://your-server/centreon/ #
# to finish the setup #
# #
# Report bugs at http://forge.centreon.com #
# #
# Thanks for using Centreon. #
# ----------------------- #
# Contact : infos@centreon.com #
# http://www.centreon.com #
# #
###############################################################################



Далее идем по адресу: http://xx.xx.xx.xx/centreon и ставим по принципу далее-далее-далее.

Ну это пипец, господа, я задолбался.

Установка Centreon: установка зависимостей

Ставим маилер и вспомогательный софт:

apt-get install -y --force-yes sudo tofrodos mailx lsb-release


Все необходимое для сборки:

apt-get install -y --force-yes build-essential


Пхп с зависимостями:

apt-get install -y --force-yes php5 php5-mysql php-pear php5-ldap php5-snmp php5-gd


MySQL:

apt-get install -y --force-yes mysql-server-5.0 libmysqlclient15-dev


RRD:

apt-get install -y --force-yes rrdtool librrds-perl


Perl & co:

apt-get install -y --force-yes libconfig-inifiles-perl libcrypt-des-perl libdigest-hmac-perl libdigest-sha1-perl libgd-gd2-perl


GD:

apt-get install -y --force-yes libgd2-xpm libgd2-xpm-dev libpng12-dev


Продолжение установки в следующей статье.

источник: http://en.doc.centreon.com/Setup:Prerequisite/Debian/Ubuntu

Как на Debian поставить все необходимое для сборки софта из сорцов?

Для этого есть спец-пакет, который все ставит за 1 раз:
apt-get install -y --force-yes build-essential

Сборка Nagios 3.2 на Debian 5 из исходников

Установка Nagios

Ставим Апача:

apt-get install apache2 -y --force-yes


Создаем юзера для Nagios:

useradd -m nagios


Создаем группу (это необходимо, чтобы разрешить от имени Апача вызывать внешние команды):

groupadd nagcmd


Добавляем юзера Nagios а в это группу:

usermod -G nagios,nagcmd nagios


В нее же добавляем Апача:

usermod -G nagios,nagcmd www-data



cd /usr/src
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.0.tar.gz
tar -xf nagios-3.2.0.tar.gz
cd nagios-3.2.0


Ставим зависимости:

apt-get update
apt-get install -y --force-yes make gcc libpng12-dev libjpeg62-dev libgd2-xpm-dev



./configure --prefix=/opt/nagios --with-command-group=nagcmd --enable-nanosleep --enable-event-broker
make all
make install
make install-init
make install-commandmode
make install-config


Добавляем в автозапуск:
update-rc.d nagios defaults


Запускаем:
/etc/init.d/nagios start


Установка Nagios плагинов

Стягиваем сорцы:
cd /usr/src
wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.14.tar.gz
tar -xf nagios-plugins-1.4.14.tar.gz
cd nagios-plugins-1.4.14


Ставим зависимости:

apt-get install -y --force-yes fping libnet-snmp-perl libssl-dev dnsutils


Собираем:
./configure --prefix=/opt/nagios_plugins --with-nagios-user=nagios --with-nagios-group=nagios --with-openssl=/usr/bin/openssl
make
make install


Ставим NDO, он необходим для связи Nagios с MySQL.

Ставим зависимости:

apt-get install -y --force-yes libmysqlclient15-dev



cd /usr/src
wget http://prdownloads.sourceforge.net/sourceforge/nagios/ndoutils-1.4b9.tar.gz
tar -xf ndoutils-1.4b9.tar.gz
cd ndoutils-1.4b9


Собираем:

./configure --prefix=/opt/nagios --enable-mysql --disable-pgsql --with-ndo2db-user=nagios --with-ndo2db-group=nagios
make
make install


Также по-хорошему, надо добавить этот демон (ndodb) в автозапуск, но чуть позже.

источник: http://en.doc.centreon.com/Setup:CompileNagiosPlugins и http://en.doc.centreon.com/Setup:CompileNagios и http://en.doc.centreon.com/Setup:ndoutils

Centreon - Nagios с удобным интерфейсом, конфигуратором и установкой!

Т.к. приведение Nagios в юзабельный вид задача не из простых, я решил найти альтернативу. И нашел - Centreon 2.1.4. А чем, собственно, он лучше, чем Nagios ? Вот этим: http://www.centreon.com/Centreon/product-overview.html

Но, вообще говоря, сравнивать их некорректно, т.к. Centreon построен на базе ядра Nagios. Так что если это сравнивать в более понятных сущностях, то Nagios - это двигатель Porsche, а Centreon - это сам Porsche :)

Так что это не более чем грамотно настроенный и с красивой мордочкой монстр Nagios.

Основные преимущества:
0. Красивый, удобный интерфейс, а не тот ужас, который у Nagios. Скриншоты
1. Управление через веб-интерфейс (в Nagios для этого надо редактировать конфиги, что suxx)
2. Служебные данные хранятся в MySQL, в то время как даныне мониторинга хранятся в очень оптимальном для этого формате - RRD.
3. Удобная настройка уведомлений на почту / sms.

Если кто уже рвется ставить, то вот ссылки на инсталляцию для Debian и CentOS: http://en.doc.centreon.com/Setup

Update: вопщем, радость была недолгой, очень неудобный и перегруженный интерфейс + жуткая установка.

Установка Nagios 3.2 на CentOS 5 из исходников

В репозитории Epel Nagios слишком уж старый:

yum info nagios | grep Version
Version : 2.12


Поэтому поставим его из исходников:

cd /usr/src
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.0.tar.gz
tar -xf nagios-3.2.0.tar.gz
cd nagios-3.2.0


Создаем юзера для Nagios:

useradd nagios


Ставим зависимости:
yum -y install gd-devel png-devel jpeg-devel


Собираем:

./configure --prefix=/opt/nagios32
make all
make install # ставим саму программу
make install-init # ставим init скрипт
make install-config # ставим конфиги Nagios
make install-webconf # ставим конфиг веб-интерфейса


Добавляем его в автозапуск:

chkconfig --add nagios
chkconfig nagios on


Запускаем:
/etc/init.d/nagios start

Установка сервера HylaFAX 6.0.4 на Debian 5 Lenny

Офсайт: http://www.hylafax.org/content/Main_Page

cd /usr/src
wget ftp://ftp.hylafax.org/source/hylafax-6.0.4.tar.gz
tar -xf hylafax-6.0.4.tar.gz
cd hylafax-6.0.4


Ставим зависимости:

apt-get install -y --force-yes gcc g++ make libtiff4-dev libtiff-tools ghostscript



./configure
make
make install


Добавляем в автозапуск:

update-rc.d hylafax defaults


Запускаем конфигуратор:

faxsetup


При этом необходимо будет ответить на кучу вопросов и указать порт модема, обычно это ttyS0. Также конфигуратор у меня тупил и пускал вопросы повторно, поэтому пришлось его прибить по CTRL+C, но на работу программы это не повлияло.

Запускаем:

/etc/init.d/hylafax start



Убеждаемся, что все запустилось:

ps aux | grep hy
uucp 31205 0.0 0.1 31880 1132 ? Ss 09:50 0:00 /usr/local/sbin/hfaxd -i hylafax
root 31207 0.0 0.0 5160 772 pts/0 R+ 09:50 0:00 grep hy


На случай проблем свои логи он хранит вот здесь:
tail -f /var/log/syslog

iptables, забанить подсеть

iptables -I INPUT -s xx.xx.xx.xx/24 -j DROP

Одноплатный ПК с возможностью поставить Linux

http://eshop.acmesystems.it/?id=FOXG20

4 самых красивых веб-интерфейса к Nagios

1. http://www.centreon.com/ - протестировал, слишком сложная установка и перегруженный интерфейс.
2. http://www.lilacplatform.com/
3. http://www.nagiosql.org/demo.html
4. http://opsview.org

Via http://www.ducea.com/2008/01/16/10-nagios-web-frontends/

Определение DoS/DDoS атак на сервер

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

Во-первых, посомтрим число процессов Апача:
ps aux | grep apache | wc -l


Либо в случае ОС CentOS5/RHEL:
ps aux | grep httpd | wc -l


Если их более 20-30, то это уже повод для беспокойства.

Далее обязательно просмотреть глобальные логи Апача на предмет наличия аномалий (например, запросов без указания вихоста):

/var/log/apache2/error.log
/var/log/apache2/access.log


И для CentOS:
/var/log/httpd/error.log
/var/log/httpd/access.log


Далее, стоит просмотреть логи всех сайтов (например, в случае использования панели ISPManager они лежат в папке /var/www/httpd-logs) и обратить особое внимание на самые большие из них.

Если "большой" лог найден, то его стоить проанализировать на предмет аномалий следующим образом:
cat log_type.log | awk '{print $1}' | sort | uniq -c


Эта команда укажет число запросов до сайта с уникальных айпи, вывод ее будет в виде:

14 95.67.xx.xx
21 95.68.xx.xx
25 95.68.xx.xx
15 95.68.xx.xx
15 95.68.xx.xx
1 95.69.xx.xx
15 95.70.xx.xx
1 95.70.xx.xx
21 95.70.xx.xx
24 95.70.xx.xx
22 95.70.xx.xx
15 95.70.xx.xx
17 95.70.xx.xx
1 95.70.xx.xx


Таким образом, если какой-то IP / блок айпи заваливает сайт запросами, это будет видно по резко уходящим в верх значениям запросов для IP злоумышленников.

Если же используется Nginx, то также обязательно просматривать логи:

/var/log/nginx/error.log
/var/log/nginx/access.log


Продолжение следует :)

Sunday 24 January 2010

Установка aptitude на Debian 5 Lenny

apt-get update && apt-get install aptitude -y --force-yes

Защита от исходящего спама на Postfix / Debian

Чтобы запретить всем, кроме пользователя Postfix и рута соединяться с серверами на 25й порт необходимо внести в фаерволл следующие правила:

iptables -A OUTPUT -o lo -j ACCEPT # разрешаем соединения с loopback
iptables -A OUTPUT -p tcp -m tcp --dport 25 -m owner --gid-owner postfix -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 25 -m owner --gid-owner root -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 25 -j DROP


Теперь протестируем:

# id
uid=0(root) gid=0(root) groups=0(root)
# telnet smtp.mail.ru 25
Trying 94.100.177.1...
Connected to smtp.mail.ru.
Escape character is '^]'.
220 mail.ru ESMTP Sun, 24 Jan 2010 19:15:27 +0300



А все остальные пользователи получают облом:

$ id
uid=1000(nrg) gid=1000(nrg) groups=1000(nrg)
$ telnet smtp.mail.ru 25
Trying 94.100.177.1...


При этом почтовик также работает отлично:
echo test | mail -s test odintsov@test.ru

sftp в chrooted ssh в Debian 6 Wheezy

Открываем конфиг:
vi /etc/ssh/sshd_config


Ищем там:
Subsystem sftp /usr/lib/openssh/sftp-server


Заменяем на:
Subsystem sftp internal-sftp


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

Создаем юзера:
useradd nrg -m
passwd nrg


Меняем владельца домашней папки юзера - это обязательное требования для чрута в нее (иначе получите: sshd[6341]: fatal: bad ownership or modes for chroot directory "/home/nrg"):
chown root.root /home/nrg/


Также добавляем юзера, которого будем чрутить:

Match user nrg
ForceCommand internal-sftp 
ChrootDirectory %h

X11Forwarding no
AllowTcpForwarding no


Перезапускаем демона SSH:
/etc/init.d/ssh restart


Подключаемся:

sftp -oPort=22 nrg@v1.test.ru
Connecting to v1.test.ru...
nrg@v1.test.ru's password:
sftp> ls /
/123123 /suxxxx
sftp>


Вот и все, пользователь не имеет доступа никуда, кроме своей домашней папки :)

Подробности можно прочесть в мане:
man 5 sshd_config


Источник: http://undeadly.org/cgi?action=article&sid=20080220110039 и http://www.howtoforge.com/chrooted-ssh-sftp-tutorial-debian-lenny и http://blog.antage.name/posts/sftp-chroot-%D0%B2-%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D1%8E%D1%8E-%D0%BF%D0%B0%D0%BF%D0%BA%D1%83.html

Как прописать set names, если скрипт закрыт Zend?

Добавить в my.cnf в блок [mysqld] следующее:
init-connect="SET NAMES cp1251"

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

puppetca --list all

Отключение восстановления пароля ISPManager

Открыть конфиг:
vi /usr/local/ispmgr/etc/ispmgr.conf


И в самый низ добавляем:
FuncAccess recovery deny


Перезапускаем панель:
killall -9 -r ispmgr


(с) http://forum.ispsystem.com/ru/showthread.php?t=6838

Отличия tmpfs и ramfs

Обе эти файловые системы присутствуют во всех новых ядрах совместно и на первый взгляд выполняют схожие задачи. Но ключевое отличие у них в поведении, когда кончается оперативная память. В этом случае tmpfs использует swap, а ramfs ничего не использует и просто сообщает, что оперативка, сэр, кончилась :)

Postfix и noexec ФС

Postfix sets the execute bit to indicate that a queue file is
complete. On file systems that don't allow users to set the execute
bit on a file, Postfix will never deliver mail.


Так что с этим надо быть аккуратнее.

(c) http://archives.neohapsis.com/archives/postfix/2006-01/1916.html

Saturday 23 January 2010

Обзор планировщиков ввода/вывода на Linux

Рекомендую: http://www.opennet.ru/opennews/art.shtml?num=25127

Скрипт для просмотра онлайна сервера La2

vi /opt/online.sh


#!/bin/bash
mysql -uroot -pPASSWORD -DDATABASE_NAME -e "select count(*) from characters where online = '1';"

Описание полей утилиты slabtop

http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-proc-topfiles.html#s2-proc-slabinfo

А вот удобный способ запуска, чтобы посмотреть, какие кэши уже забиты: slabtop --sort u

Оптимизация MySQL

http://www.day32.com/MySQL/ и http://blog.mysqltuner.com/

Keep Alive на кластерах? Легко!

http://www.keepalived.org/

Оптимизация работы ПО посредством Huge TLB fs

http://www.cyberciti.biz/tips/tag/vmhugetlb_shm_group

А вот и библиотека, чтобы заставить любой софт работать с HugeTLB без изменения кода: http://libhugetlbfs.ozlabs.org/

А вот мануал по его активации: http://www.linux-kvm.com/content/get-performance-boost-backing-your-kvm-guest-hugetlbfs

Ожидаемый прирост в скорости - около 10%. Насколько реально - не знаю.

Да будет свет!

По-моему, очень зачотно: http://www.contex-condom.ru/products.php?txt_id=334&parent_id=14

Thursday 21 January 2010

VDSManager внутренняя ошибка VDS not found

VDSManager внутренняя ошибка VDS not found

Кому нужен фикс для 64 битной версии под Linux - прошу на почту pavel.odintsov (собака) googlemail.com Для тех, кто в теме поясняю - ошибка появилась в новой версии VDSManager вышедшей 19го января, фиксица так:

cd /usr/local/ispmgr/lib


Ищем ноду (ну или пишем мне почтой - вышлю файл) с предыдущей версией панели и стягиваем с нее файл /usr/local/ispmgr/lib/openvz.so

Рестартим панель:
killall -9 -r vdsmgr

Монти Видениус, Мускул и вопли про "Мускул RIP"

Задолбали, понятна? Не по-мужски так поступать - продать, а потом устраивать пикеты "не убивайте мускул не убивайте мускул". Не хотите чтобы убивали - так нех и продаваться было. Низко и противно.

Cлишком большой файл ibdata1 в MySQL

Этот файл используется движком InnoDB для хранения таблиц, при этом все таблицы хранятся в одном файле, что очень неудобно.

Для активации разделения баз данных по разным файлам используется следующая опция в my.cnf (добавлять в блок [mysqld]):

innodb_file_per_table


После этого необходим рестарт СУБД:
/etc/init.d/mysqld restart


Все, теперь все вновь создаваемые InnoDB таблицы будут создаваться в отдельных файлах внутри папок с именами баз данных (с расширением .ibd, причем и индексы и данные лежат вместе).

источник: http://dev.mysql.com/doc/refman/5.0/en/multiple-tablespaces.html

Ускорение работы MySQL за счет активации расширенного TLB буфера ОС Linux

http://dev.mysql.com/doc/refman/5.0/en/large-page-support.html

Аналог Zend и ionCube

Вот натолкнулся на такой, полагаю, популярный на Западе продукт: http://www.sourceguardian.com/

Рекомендация размещать /tmp и /var/tmp на tmpfs от разработчиков ядра

http://www.mjmwired.net/kernel/Documentation/filesystems/tmpfs.txt


Some people (including me) find it very convenient to mount it e.g. on /tmp and /var/tmp and have a big swap partition. And now loop mounts of tmpfs files do work, so mkinitrd shipped by most distributions should succeed with a tmpfs /tmp.

Wednesday 20 January 2010

Очень крутая браузерная игра

Прошу: http://botva.ru/

Онлайн профайлинг PHP приложений

http://pinba.org/wiki/Main_Page

Установка PHP как FastCGI на панели управления хостингом ISPManager, Debian 5 Lenny

В новых версиях все намного проще! Просто идете в "Возможности", выбираете там "Модуль FastCGI для веб-сервера Apache" и нажимаете на "кнопку с дисками" для установки и ожидаете, пока он поставится на панель. После этого должна появиться опция PHP как FastCGI при создании www-доменов.

Ставим:
apt-get install -y libapache2-mod-fcgid


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


Перезапускаем панель ISPManager:
killall -9 -r ispmgr


Готово, теперь в настройках www домена должна появится возможность "Php как FastCGI".

Но в последних версиях этот фикс не сработает, ибо в панели опять что-то сломали!

Открываем конфиг:
vi /usr/local/ispmgr/etc/ispmgr.conf


И в самый низ добавляем следующее:
Option ForcePhpFCgid



Перезапускаем панель ISPManager:
killall -9 -r ispmgr


И вот теперь уж точно должно появиться :)

Качественное решение для импорта и экспорта больших баз данных

http://sypex.net/

Переключение ext4 журнала на writeback

Открываем fstab:
vi /etc/fstab

Ищем там свой рут раздел:
/dev/md2 / ext3 defaults,grpquota,usrquota 0 0


У меня это /dev/md2.

Т.к. вариант с указанием в fstab data=writeback не работает, Ибо баг - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=529629 и https://bugzilla.redhat.com/show_bug.cgi?id=55495

Идем в обход, активируем для файловой системы дефлтную опцию монтирования:
tune2fs -o journal_data_writeback /dev/md2


В итоге получаем:

tune2fs -l /dev/md2 | grep writeback
Default mount options: journal_data_writeback
Суть внесенных правок:

< Default mount options:    journal_data_writeback user_xattr acl
---
> Default mount options:    user_xattr acl


Перезагружаемся (mount -o remount / тут не сработает):
shutdown -r now

Убеждаемся, что наш основной раздел смонтировался в writeback (кто подскажет более правильный способ - получит плюшку):
dmesg | grep writeback
[ 4.095211] EXT3-fs: mounted filesystem with writeback data mode.

Беслптный CDN

Эка что бывает: http://www.coralcdn.org/

Актуальный (!!!!) ежедневно обновляемый список всех российских сетей

Прошу: http://noc.masterhost.ru/allrunet/ А вот и от Зенона: http://noc.zenon.net/nets/current

Мастерхосту и Зенону огромный респект за такую няшку!

А вот и мануал, как использовать эти правила в Nginx для защиты от слабых DDoS / DoS: http://www.opennet.ru/tips/info/1717.shtml

Nginx 0.7.64 + reload ( graceful ) - насколько хорошо работает?

Протестируем следующим образом.

На тестовой машине:
while true; do /etc/init.d/nginx reload ; sleep 1; done


На машине, где запускаем ab:
ab -c 10 -n 1000 http://test1.ru:80/


В итоге имеем отличные результаты:

Server Software: nginx
Server Hostname: test1.ru
Server Port: 80

Document Path: /
Document Length: 4970 bytes

Concurrency Level: 10
Time taken for tests: 19.418320 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 5163000 bytes
HTML transferred: 4970000 bytes
Requests per second: 51.50 [#/sec] (mean)
Time per request: 194.183 [ms] (mean)
Time per request: 19.418 [ms] (mean, across all concurrent requests)
Transfer rate: 259.60 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 9
Processing: 0 220 31.0 216 311
Waiting: 0 219 31.0 216 310
Total: 0 220 31.0 216 311

Percentage of the requests served within a certain time (ms)
50% 216
66% 224
75% 229
80% 235
90% 257
95% 271
98% 279
99% 287
100% 311 (longest request)


То есть не потеряно ни одного пакета и нету явных провалов по скорости.

Nginx при этом занимался проксированием Apache:

location / {
proxy_pass http://xx.xx.xx.xx:8080;
proxy_redirect http://v1.test.ru:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}

Тюнинг файловой системы Ext3 - увеличение commit

У Ext3 есть параметр commit, указывающий время, через которое происходит синхронизация данных и метаданных с жестким диском, стандартно оно равняется 5 секундам (см. исходники ядра), но в некоторых случаях его можно увеличить без особого вреда, скажем, до 10 секунд, чтобы лишний раз не дергать диски.

Вот информация на английском:
commit=nrsec (*) Ext3 can be told to sync all its data and metadata every 'nrsec' seconds. The default value is 5 seconds. This means that if you lose your power, you will lose as much as the latest 5 seconds of work (your filesystem will not be damaged though, thanks to the journaling). This default value (or any low value) will hurt performance, but it's good for data-safety. Setting it to 0 will have the same effect as leaving it at the default (5 seconds). Setting it to very large values will improve performance.


Настраиваем!

Открываем fstab:
vi /etc/fstab


Ищем там строку с нашей файловой системой и добавляем в нее через запятую "commit=10":
/dev/md2 / ext3 defaults,commit=10,grpquota,usrquota 0 0


Перемонтируем файловую систему:
mount -o remount /


Все, теперь данные на диск у нас будут сбрасываться раз в 10 секунд.

Плагин для Firefox для перевода текстов посредством Google Translate

Рекомендую: https://addons.mozilla.org/ru/firefox/addon/918?src=api

ext3 ordered (стандартый) vs writeback (самый быстрый)

Рекомендовано к прочтению: http://lwn.net/Articles/329008/

Может ли отключение atime для файловой системы негативно сказаться на работе Postfix?

Может ли отключение atime для файловой системы негативно сказаться на работе Postfix?

Ответ: Нет

Аргументация: судя по рассылке Postfix его не использует:

> One suggestion which seemed rather interesting to me was mounting a
> filesystem with the noatime flag. I certainly don't use it in my general
> activities on a server but I was just wondering if anyone can tell me if
> postfix uses it?

Postfix doesn't use it.


И даже сам Виетс Винема (автор Postfix - http://ru.wikipedia.org/wiki/Postfix) это подтверждает:

Turning off atime updates means don't update the inode block when
a file is read.

I have many reasons to believe that would make zero difference,
because the inode block needs to be updated anyway after Postfix
accesses a queue file.

With each access, Postfix either creates or renames or deletes the
file, and/or it writes the queue file, and/or it sets the mtime
explicitly. All these require that the inode block be updated.

Отключение atime для ext3 разделов с интенсивным доступом

Отключение поддержки atime (время последнего доступа) позволяет увеличить производительность дисковой подсистемы.

Вот описание, как и почему стоит это делать:

Here is how atime works: for every instance that the operating system accesses a file, atime logs the time when that file was last accessed (writes this info onto the Linux ext3 partition). As you can imagine, all this writing takes its toll in terms of performance, which is a drag (no pun intended) considering that only mail-monitoring and defragmenting applications use atime to function properly.


Вкратце - при каждом доступе к файлу (хоть на чтение, хоть на запись) файловая система изменяет время последнего доступа к файлу (atime) на текущее и записывает его в файловую систему, что влияет не лучшим образом на производительность (теоретически, практически я ничего сказать не могу - не тестил).

Открываем конфиг:
vi /etc/fstab


Ищем строку с требуемой файловой системой:
/dev/md2 / ext3 defaults,grpquota,usrquota 0 0


И добавляем через запятую после default notatime,nodiratime чтобы получить следующее:

/dev/md2 / ext3 defaults,noatime,nodiratime,grpquota,usrquota 0 0


Перемонтируем файловую систему:

mount -o remount /


Возможные противопоказания: http://phpsuxx.blogspot.com/2010/01/atime-postfix.html

источники:
http://www.findmysoft.com/news/Disable-Atime-for-a-Faster-Running-Linux-OS/
http://en.opensuse.org/Speeding_up_Ext3
http://www.redhat.com/support/wpapers/redhat/ext3/tuning.html

Tuesday 19 January 2010

Новинка в mod_fcgid 2.3.5 - показ статуса процессов в server-status

Display information about active processes in the server-status page. [Ryan Pan]



(c) CHANGES-FCGID

Куда пропал оф сайт mod_fcgid http://fastcgi.coremail.cn/doc.htm ?

Последнюю неделю пытаюсь зайти на http://fastcgi.coremail.cn/doc.htm, но обламываюсь :( Думал, что просто лежит. Оказывается нет:
mod_fcgid was created by Ryan Pan (Pan Qingfeng, pqf or 潘庆峰) in 2004 as a new FastCGI implementation, and was granted to the ASF as an Apache HTTP Server subproject in 2009, shepherded by Chris Darroch (chrisd).


(с) http://httpd.apache.org/mod_fcgid/

'struct task_struct' has no member named 'uid' в 29+ ядрах

Фиксица поиском вызовов элементов структуры uid (->uid) и заменой их на ->cred->uid

(c) http://forums.virtualbox.org/viewtopic.php?t=12854

Как делать патчи для ядра?

Рассматривать все будем на примере 2.6.32.4

Подготавливаем дерево исходников ядра:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.4.tar.bz2
tar -xf linux-2.6.32.4.tar.bz2


Теперь производим копирование оригинального дерева в то, которое будем изменять (оно с суффиксом _patched):

cp -R linux-2.6.32.4 linux-2.6.32.4_patched


Теперь вносим коррективы в файлы в папке linux-2.6.32.4_patched.

Теперь создаем патч:

cd /usr/src
diff -rupN linux-2.6.32.4 linux-2.6.32.4_patched > our_patch.patch


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

patch -p1 < our_patch.patch



И после этого получим пропатченное дерево исходников :)

Ядро 2.6.32 выбрано для Long Time Support ( расширенный цикл поддержки )

Радостная новость, поддержка 32 ядра будет еще 2-3 года (у обычных ядер - несколько месяцев), что очень удобно для тех, кто проектирует крупные инсталляции и смотрит на будущее :)

Отладка планировщика ядра

Есть такая штука как /proc/schedstat. Там отображается статистика работы планировщика, для ее активации необходимо опцию CONFIG_SCHEDSTATS ( Collect scheduler statistics ) выставить в Y и пересобрать ядро.

Инкрементальные бэкапы для ядра 2.6.27 / 2.6.32 (эксклюзивная версия!)

Я ранее уже упоминал в блоге замечательный патч от Matt Heaton http://www.mattheaton.com/?p=188, но теперь решил его портировать на 32е ядро и перевести документацию на русский.

Этот патч предоставляет информацию о всех измененных, вновь созданных или подвергшихся изменению прав посредством chmod файлах в системе. Таким образом, эти файлы могут быть забэкаплены без осуществления полного сканирования файловой системы и поиска изменившихся файлов (например, посредством программ rdiff-backup или rsync). Само резервное копирование не входит в задачи этого патча, он только предоставляет список файлов. Бэкап списка изменившихся файлов осуществляете уже Вы сами, это самая легкая часть задачи. Более сложную - формирование спсика изменившихся файлов - решает патч ядра.

В патче нету хеширования, сортировки или фильтрации дубликатов файлов. Это означает, что после того, как файл будет изменен и до того, как вы его забэкапите, он может изменится снова. Таким образом, вы вполне можете получить дубликаты файлов в логе изменений. Чтобы избежать ошибок в поведении бэкап скрипта просто удаляйте дубликаты в нем.

Чтобы использовать все эти замечательные возможности, необходимо применить следующий патч на исходники 2.6.27 ядра с kernel.org После этого у ядра появится два триггера, которые по-умолчанию отключены и система логирования изменившихся файлов не создает нагрузки на систему:


/proc/sys/fs/bh_logging_user
/proc/sys/fs/bh_logging_root


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

echo 1 > /proc/sys/fs/bh_logging_user
echo 1 > /proc/sys/fs/bh_logging_root


Либо же можно добавить следующие строки в файл:

vi /etc/sysctl.conf


fs.bh_logging_user=1
fs.bh_logging_root=1


После этого необходимо внести коррективы в файл /etc/syslog.conf, чтобы syslog принимал сообщения от ядра (как раз посредством них и будут передаваться измененные файлы) и сохранял их в лог:

kern.debug /var/log/modified


После этого, все измененные файлы будут отображаться в логе /var/log/modified.

UPDATE: самостоятельно перенес патч на 2.6.32.8 ядро, вот он, прошу: http://fastvps.googlecode.com/svn/trunk/patches/bluehost-backup-fastvps-edited-patch-2.6.32.diff

Вот мануал по накатываюнию патча на 2.6.32.8 ядро

cd /usr/src/linux-2.6.32.8
wget http://fastvps.googlecode.com/svn/trunk/patches/bluehost-backup-fastvps-edited-patch-2.6.32.diff
patch -p1 < bluehost-backup-fastvps-edited-patch-2.6.32.diff



В итоге должны увидеть нечто вот такое:
patching file fs/compat.c
patching file fs/dcache.c
patching file fs/namei.c
patching file fs/open.c
patching file fs/read_write.c
patching file include/linux/fs.h
patching file kernel/sysctl.c
patching file mm/mmap.c


Далее собираем ядро.

(с) http://www.mattheaton.com/?p=188

Monday 18 January 2010

Google Mail для собственного домена

http://www.google.com/apps/intl/ru/business/index.html

Расширенный формат лога Nginx для шаред инстанций с большим числом айпи


log_format vhost_ip_full_format '$remote_addr - $remote_user [$time_local] $host $server_addr $request '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time-$upstream_response_time';


А также корректируем основной лог ngnx - указываем новый формат:

access_log /var/log/nginx/access.log vhost_ip_full_format;


Перезапускаем nginx:
/etc/init.d/nginx reload


(c) alekciy

Nginx: accept() failed (24: Too many open files) while accepting new connection on

Причина:

2010/01/18 21:08:00 [alert] 20014#0: accept() failed (24: Too many open files) while accepting new connection on 0.0.0.0:80


Ранее я это делал посредством добавления ulimit -n 10000 в init скрипт, но есть более правильный способ.

Достаточно в конфиг:
vi /etc/nginx/nginx.conf


На корневой уровень (например, прямо под "worker_processes"), не в http или event блоки, добавить:
worker_rlimit_nofile 100000;

И перезапустить nginx:
/etc/init.d/nginx restart

Бага с ротацией лога yum.log в CentOS 5

-rw------- 1 root root 4982 Jan 15 16:16 yum.log
-rw-r--r-- 1 root root 32947 Dec 29 20:19 yum.log.1


Намек ясен? :) Хоят, возможно, бага имеет место только на серверах с с-панелью, хотя не уверен.

Предпринимателями не становятся, рождаются

Очень долго не мог сформулировать подобное, но у Матта это получилось лучше всех: http://www.mattheaton.com/?p=50

Успех - убийца бизнеса

http://www.mattheaton.com/?p=55

Если Вы верите в Green Hosting, то прочтите это

http://www.mattheaton.com/?p=98

Установка collectl на Debian

Эта утилита является полной заменой таких программ как sar, vmstat, top, atop, iostat и проч. Вот ее отличный обзор от Matt Heaton - http://www.mattheaton.com/?p=166, офсайт программы вот: http://collectl.sourceforge.net/

Идем на страницу загрузок: http://sourceforge.net/projects/collectl/files/


apt-get install ethtool -y
cd /usr/src
wget 'http://downloads.sourceforge.net/project/collectl/collectl/collectl-2.5.1/collectl-2.5.1-src.tar.gz?use_mirror=sunet'
tar -xf collectl-2.5.1-src.tar.gz
cd collectl-2.5.1
./collectl.pl


Только вот профита от тулзы я пока не понимаю :)

Советы хостинг-компаниям от Matt Heaton

Рекомендую к прочтению всем представителям рынка хостинг-услуг: http://www.mattheaton.com/?p=101

CentOS Linux для шаред хостинга от Matt Heaton

Unfortunately, right now the answer is – With a GREAT DEAL of effort. I mentioned earlier that we use CentOS. This is a free rebranded version of Redhat Enterprise Linux which is a server class linux distribution. Meaning it is geared toward customers with a heavy server workload. The problem is the linux kernel they use in CentOS is SLOW, outdated, and certainly not tuned to our workload.


(c) http://www.mattheaton.com/?p=172

Прирост скорости при использовании MySQL на SSD дисках

Прошу: http://www.mattheaton.com/?p=174 Для тех, кто не ходит по ссылкам - практический прирост в пять раз.

2.6.32.3 kernel oops: dquot_transfer

Баг есть: http://bugzilla.kernel.org/show_bug.cgi?id=15051

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

А теперь немного сыскной работы, Changelog 32 ядра (ссылка) и видим там такой патч:


commit bbf245072d81e512cc88535379ae6edb5d08f420
Author: Dmitry Monakhov
Date: Mon Dec 14 15:21:13 2009 +0300

quota: decouple fs reserved space from quota reservation

commit fd8fbfc1709822bd94247c5b2ab15a5f5041e103 upstream.

Currently inode_reservation is managed by fs itself and this
reservation is transfered on dquot_transfer(). This means what
inode_reservation must always be in sync with
dquot->dq_dqb.dqb_rsvspace. Otherwise dquot_transfer() will result
in incorrect quota(WARN_ON in dquot_claim_reserved_space() will be
triggered)
This is not easy because of complex locking order issues
for example http://bugzilla.kernel.org/show_bug.cgi?id=14739

The patch introduce quota reservation field for each fs-inode
(fs specific inode is used in order to prevent bloating generic
vfs inode). This reservation is managed by quota code internally
similar to i_blocks/i_bytes and may not be always in sync with
internal fs reservation.

Also perform some code rearrangement:
- Unify dquot_reserve_space() and dquot_reserve_space()
- Unify dquot_release_reserved_space() and dquot_free_space()
- Also this patch add missing warning update to release_rsv()
dquot_release_reserved_space() must call flush_warnings() as
dquot_free_space() does.



А теперь открываем Chagelog 33 ядра (ссылка) и видим там такой антипатч:


commit 05b5d898235401c489c68e1f3bc5706a29ad5713
Author: Jan Kara
Date: Wed Jan 6 18:03:36 2010 +0100

quota: Fix dquot_transfer for filesystems different from ext4

Commit fd8fbfc1 modified the way we find amount of reserved space
belonging to an inode. The amount of reserved space is checked
from dquot_transfer and thus inode_reserved_space gets called
even for filesystems that don't provide get_reserved_space callback
which results in a BUG.

Fix the problem by checking get_reserved_space callback and return 0 if
the filesystem does not provide it.

CC: Dmitry Monakhov
Signed-off-by: Jan Kara


Вот ссылка на патч от Jan Kara.

А вот и сам патч:

index dea86ab..3fc62b0 100644 (file)
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -1377,6 +1377,9 @@ static void inode_sub_rsv_space(struct inode *inode, qsize_t number)
static qsize_t inode_get_rsv_space(struct inode *inode)
{
qsize_t ret;
+
+ if (!inode->i_sb->dq_op->get_reserved_space)
+ return 0;
spin_lock(&inode->i_lock);
ret = *inode_reserved_space(inode);
spin_unlock(&inode->i_lock);


Ани комментс? :) Так что осталось выдрать этот патч из 33 ветки и накатить на 32 ядро :)

Update: патч найден и накачен, все окей, проблема была именно в этом, по ссылке в багзилле ядра также дал ссылки на патч.

Update: фикс принят, но собстна он итак был в "next stable", но все равно очень приятно :)

Update: вышло 2.6.32.4, где баг испарвлен.