Uniвсячина

понемножку о Linux и программировании

Мониторинг нагрузки Apache 2

Рассмотрим ситуацию: у вас на сервере хостится несколько сайтов работающих через mod_php под Apache 2.×. Вы обнаруживаете, что сервер начинает тормозить. Запускаете top и видите, что верхние строчки занимает процесс apache2 (или httpd). Ваша задача - узнать какой из сайтов и какими запросами грузит сервер. <!-more—>

Первый шаг — разрешить загрузку модуля mod_status и сконфигурировать его в /etc/apache2/mods-available/status.conf или в /etc/apache2/apache2.conf (я буду писать пути и команды применительно к Debian):

<IfModule mod_status.c>
    ExtendedStatus On
    <Location /server-status>
        SetHandler server-status
    </Location>
</IfModule>

Можно опционально ограничить доступ к URL /server-status по IP-адресу или даже поставить пароль.

Добавляем к любому сайту на сервере путь /server-status и смотрим, что там показывается. Если видим много запросов к какому либо сайту в состоянии “W”, то можно предположить, что проблема с этим сайтом. Но это будет лишь гипотеза, так как узнать точно ситуацию по нагрузке, используя данный отчет, невозможно.

Apache 2 /server-status screenshot

Используем хитрый ход. Установим модуль mod_perl:

apt-get install libapache2-mod-perl2 apache2-prefork-dev

Пакет apache2-prefork-dev нужен для последующей установки перловых модулей. Далее запустим cpan и установим пару модулей:

cpan> install Sys::Proctitle
cpan> install Apache2::ShowStatus

В файл /etc/apache2/mods-available/perl.conf добавим следующие строчки:

<IfModule mod_perl.c>
    PerlModule Apache2::ShowStatus
    PerlInitHandler Apache2::ShowStatus
</IfModule>

Проставим линк на этот файл и перезагрузим Apache:

ln -s /etc/apache2/mods-available/perl.conf /etc/apache2/mods-enabled/
apache2 -t
invoke-rc.d apache2 restart

Смотрим что из этого получилось:

# ps -o user,pid,%cpu,args --sort=-%cpu -u www-data | egrep '^USER|httpd' | grep -v grep
USER       PID %CPU COMMAND
www-data 14039  0.6 httpd: GET /notices_item/????? HTTP/1.0
www-data 14073  0.5 httpd: GET /notice/???????.html HTTP/1.0
www-data 14069  0.5 httpd: GET /r_9/ HTTP/1.0    
www-data 14075  0.5 httpd: GET /notice/???????.html HTTP/1.0

Я заменил часть URL-ов вопросиками из соображений конфиденциальности.

Ну что же, это неплохо, теперь мы видим отсортированные по полю %CPU процессы Apache, а так же видим, какой запрос они выполняют в данный момент. Но мы не видим к какому сайту относятся эти запросы. Придеться немного подпатчить модуль Apache2::ShowStatus в файле /usr/local/share/perl/5.8.8/Apache2/ShowStatus.pm:

--- ShowStatus.pm.orig	2009-01-22 14:19:26.122058102 +0300
+++ ShowStatus.pm	2009-01-22 14:21:01.030847967 +0300
@@ -16,7 +16,7 @@
   my $r=shift;
 
   $r->pnotes( 'ProctitleObject'=>
-	      Sys::Proctitle->new( 'httpd: '.$r->the_request ) );
+             Sys::Proctitle->new( 'httpd: ['.$r->get_server_name().'] '.$r->the_request ) );
 
   return Apache2::Const::DECLINED;
 }

Перезагружаем Apache:

invoke-rc.d apache2 restart

Смотрим, что получилось:

# ps -o user,pid,%cpu,args --sort=-%cpu -u www-data | grep httpd | grep -v grep
www-data 16927  3.3 httpd: [www.????????.ru] GET /img_code.html HTTP/1.0
www-data 16885  3.2 httpd: [76.?????????.ru] GET /notices_item/???????/user_register/ HTTP/1.0
www-data 16921  1.0 httpd: [www.??????.ru] GET /products_item/?????? HTTP/1.0
www-data 16933  0.5 httpd: [www.????????.ru] GET /notice/????????.html HTTP/1.0
www-data 16878  0.5 httpd: [??????????.ru] GET /main_???????? HTTP/1.0
www-data 16930  0.2 httpd: [www.??????????.ru] GET /notice/??????????.html?sd=?????????????????????????????? HTTP/1.0

Ну вот, теперь мы видим и сайт, к которому пришел запрос, и сам запрос.

Кто еще какие способы использует для мониторинга нагрузки на хостинге в окружении Apache2 + mod_php5?

Что такое Zeroconf и с чем его едят

Я, как старый линуксоид, когда впервые установил Ubuntu и увидел незнакомое слово avahi, конечно же сразу посмотрел в google. Потыкался в несколько ссылок, увидел другие непонятные слова, типа zeroconf, multicast dns, bonjour. Сразу понял, что это какая то мутная технология от Apple и нафиг мне ненужная.

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

Давайте разберемся с терминологией:

  • Zeroconf — это протокол, разработанный Apple и призванный решать следующие проблемы:
    • выбор сетевого адреса для устройства;
    • нахождение компьютеров по имени;
    • обнаружение сервисов, например принтеров.
  • Avahi — открытая и свободная реализация протокола zeroconf.
  • Bonjour — проприетарная реализация протокола zeroconf от Apple.

Awesome 3.1 для Ubuntu 8.10 (Intrepid)

Прочитав перед новым годом статью про Awesome (awesome: ещё один шаг к идеальному wm), решил попробовать сие чудо инженерной мысли. Awesome — это такой tiling window manager. По-русски — мозаичный оконный менеджер. Основное отличие мозаичных window manager-ов — это то, что все окна всегда раскрыты и не перекрывают друг друга. Выглядит это, как то так:

Скриншот оконного менеджера Awesome 3.1

Другое интересное отличие Awesome — полное управление с клавиатуры. Все шорткаты продуманы и расположены очень грамотно, не надо растопыривать пальцы, при попытке нажать какой нибудь “аккорд”.

Первым делом, решил поставить Awesome прямо из убунтового репозитария. Сильно огорчился увидев, что версия весьма древняя. Полез по PPA в надежде найти свежачок. Снова огорчился, ибо нашел только 3.1-rc4. Полез по убунтувым форумам, почитать как решает проблему народ. Народ, с упорством леммингов, кололся, но пытался скомпилировать новую версию.

Ставить программы через make && make install — это не наш путь. Решение нашлось в experimental ветке Debian. Какой то добрый человек выложил исходники пакета. Ну а дальше дело техники — скачиваем, немножко трахаемся с зависимостями, делаем NMU-пакет и заливаем на PPA. Так что, кто хочет попробовать чудесный оконный менеджер Awesome версии 3.1, велкам:

deb http://ppa.launchpad.net/antage/ppa/ubuntu intrepid main
deb-src http://ppa.launchpad.net/antage/ppa/ubuntu intrepid main

Ключ репозитария:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.0.10

mI0ESXjseAEEANiCZQwAK2X8K7k9CGj4J4IqdY056vtsOn/vb9YXHt1McK1zOxdq+SWwG/0z
ml3uRBCJpHukGxZaZ1ObwzMxtKRWZUEkXdgMr1sXnrGdsUihkIr5j6owaP0u5RQA96WDrsXM
JLrh8noraLPNcxNUy6Yp9ib3n/I5n6HsOJSfeHv1ABEBAAG0GExhdW5jaHBhZCBQUEEgZm9y
IGFudGFnZYi2BBMBAgAgBQJJeOx4AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQIPxC
gsfupgdS+AQAioUyqYEnMx8PFGe93cI6k10uRJcFiFzR7LVPzTlKYH8da6T1hQcZCStZGaMU
7MJcRLxkZC0jzTVztvA0e8uIIuqc/0zEJMA+jdGRwRf+aSxWhaGDJpC8HAPbf40CFcrnVpEr
U4kD0958ky1s+QtrZSgVy3bUaYsMta5EkzWQK54=
=Ke7D
-----END PGP PUBLIC KEY BLOCK-----

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

cat key.txt | sudo apt-key add -

UPDATED: На лаунчпаде поменяли пути к репозитарию и все пакеты теперь подписывают персональным ключом.

Как быстро установить новый Adobe Flash 64-bit в Ubuntu

Adobe выпустила на днях пререлиз-версию Flash 10 64-bit под Linux. Чтобы вкусить прелести нативного плагина на 64-битных ОС, следует скачать архив с плагином. Распаковать. Положить libflashplugin.so в ~/.mozilla/plugins/. Старые пакеты удалить:

sudo apt-get purge flashplugin-nonfree
sudo apt-get purge nspluginwrapper

Сам Firefox после этого, понятное дело, нужно перезапустить.

Новый flash plugin я опробовал самолично. Страшных багов в его работе не обнаружил, нестрашных тоже. И вообще работает отлично, что даже настораживает.