FastNetMon

Monday, 31 May 2010

Уважаемый all! Как ограничить число worker процессов для виртуального хост апача?

Сабж.


update1:
ага, спасибо, в ITK такое есть.

MaxClientsVHost: A separate MaxClients for the vhost. This can be useful if, say, half of your vhosts depend on some NFS server (like on our setup); if the NFS server goes down, you do not want the children waiting forever on NFS to take the non-NFS-dependent hosts down. This can thus act as a safety measure, giving "server too busy" on the NFS-dependent vhosts while keeping the other ones happily running. (Of course, you could use it to simply keep one site from eating way too much resources, but there are probably better ways of doing that.)


http://mpm-itk.sesse.net/

Куча сторонних модулей к Nginx

http://wiki.nginx.org/Nginx3rdPartyModules#Catalog_of_Modules

Как научить eAccelerator не работать c shm/sysvipc памятью, а переключить его на mmap

Имеем: eAccelerator + shm валит сервер с ошибками:

eAccelerator: shmmax should be at least 2MBPHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0
PHP Fatal error: Unable to start eAccelerator module in Unknown on line 0
eAccelerator: Could not allocate 33554432 bytes, the maximum size the kernel allows is 1048576 bytes. Lower the amount of memory request or increase the limit in /proc/sys/kernel/shmmax.


При его сборке есть следующее:

checking for sysvipc shared memory support... yes
checking for mmap shared memory support... yes
checking for mmap on /dev/zero shared memory support... yes
checking for anonymous mmap shared memory support... yes
checking for posix mmap shared memory support... no
checking for best shared memory type... sysvipc


То есть, есть выбор между различными хранилищами, так как мой баг явно связан с sysvipc / shm, то логично будет его заменить на... на кого? В коде posix map явно указан как NOT TESTED, так что он отпадает.

Далее в configure можно найти кой что интересное:
5365 echo $ECHO_N "checking for best shared memory type... $ECHO_C" >&6; }
5366 if test "$mm_shm_ipc" = "yes"; then
5367
5368 cat >>confdefs.h <<\_ACEOF 5369 #define MM_SHM_IPC 1 5370 _ACEOF 5371 5372 msg="sysvipc" 5373 elif test "$mm_shm_mmap_anon" = "yes"; then 5374 5375 cat >>confdefs.h <<\_ACEOF 5376 #define MM_SHM_MMAP_ANON 1 5377 _ACEOF 5378 5379 msg="anonymous mmap"



Отсюда следует, что shm_mmap_anon (он же MM_SHM_MMAP_ANON) следующий в списке предпочтений.

Так что делаем следующее:
vi configure


Накатываем патч:

- 5366 if test "$mm_shm_ipc" = "yes"; then
+ 5366 if false; then


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

checking for sysvipc shared memory support... yes
checking for mmap shared memory support... yes
checking for mmap on /dev/zero shared memory support... yes
checking for anonymous mmap shared memory support... yes
checking for posix mmap shared memory support... no
checking for best shared memory type... anonymous mmap


То есть, теперь он будет собран с anonymous_mmap и, возможно, прекратит сваливать сервер.

APC vs XCache vs eAccelerator

http://itst.net/654-php-on-fire-three-opcode-caches-compared и еще вот http://2bits.com/articles/benchmarking-drupal-with-php-op-code-caches-apc-eaccelerator-and-xcache-compared.html

Установка XCache 1.3.0 на Debian 5 Lenny

Ставим зависимости:
apt-get install -y php5-dev


Собираем:
cd /usr/src
wget http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz
tar -xf xcache-1.3.0.tar.gz
cd xcache-1.3.0
phpize
./configure --enable-xcache
make
make install


Создаем конфиг:

vi /etc/php5/conf.d/xcache.ini


Со следующим содержимым:

# configuration for php Xcache module

[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/lib/php5/20060613/xcache.so


[xcache.admin]
xcache.admin.enable_auth = On
# Configure this to use admin pages
; xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
; xcache.admin.pass = ""

[xcache]
; ini only settings, all the values here is default unless explained

; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 32M
; set to cpu count (cat /proc/cuinfo |grep -c processor)
xcache.count = 8
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0

; same as aboves but for variable cache
xcache.var_size = 0M
xcache.var_count = 1
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300

xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path = "/dev/zero"


; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory = ""

; per request settings
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off

[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager = Off

; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""


Все :) После этой фичи продакшен сервер лег насмерть с ла уходящим за 70 и помог только резет. Софтег, однако.

Sunday, 30 May 2010

Умные рассуждения на тему распределенного хранилища PHP сессий

http://www.mohawksoft.org/?q=node/36

Скрипт для массового добавления www доменов в ISPManager


cat domains.txt | perl -e 'for(<>){ do { chomp; s/^\\s//g; s/\\s+$//g; $_ = lc } for($_); my($d, $ip) = split "\\s+", $_; print "Add $d with $ip to ISPManager\n"; `/usr/local/ispmgr/sbin/mgrctl -m ispmgr wwwdomain.edit domain=$d ip=$ip php=phpmod admin=admin\@mail.ru alias=www.$d sok=ok su=user_name`; }'


В файле domains.txt домены должны быть просто списком в виде:
domain1.ru ip.ad.dr.es
domain2.ru ip.ad.dr.es

Распределенное хранилище для PHP сессий

Да, оказывается такое есть и готовое:
http://ru2.php.net/manual/en/book.msession.php

Скрипт для массового создания DNS доменов в ISPManager


cat domains.txt | perl -e 'for(<>){ do { chomp; s/^\\s//g; s/\\s+$//g; $_ = lc } for($_); my($d, $ip) = split "\\s+", $_; print "Add $d with $ip to ISPManager\n"; `/usr/local/ispmgr/sbin/mgrctl -m ispmgr domain.edit name=$d ip=$ip ns="ns3.fastvps.ru. ns4.fastvps.ru." sok=ok su=user_namee`; }'


В файле domains.txt домены должны быть просто списком в виде:
domain1.ru ip.ad.dr.es
domain2.ru ip.ad.dr.es

Также есть еще к нему в комплекте скрипт для массового создания DNS поддоменов:
for i in `cat domains.txt | awk '{print $1}'`; do echo $i | perl -e 'my$domain=<>; print $domain; chomp $domain; open my $fl, "<", "types.txt"; for(<$fl>) { chomp; @mas=split "\\s+", $_; print `/usr/local/ispmgr/sbin/mgrctl -m ispmgr domain.sublist.edit plid=$domain sdtype=$mas[1] prio=$mas[2] name=$mas[0] addr=$mas[3] sok=ok`; } ;'; done

Вот пример файла types.txt для Gmail MX:
@ MX 10 ASPMX.L.GOOGLE.COM.
@ MX 20 ALT1.ASPMX.L.GOOGLE.COM.
@ MX 20 ALT2.ASPMX.L.GOOGLE.COM.
@ MX 30 ASPMX4.GOOGLEMAIL.COM.
@ MX 30 ASPMX5.GOOGLEMAIL.COM.
@ MX 30 ASPMX2.GOOGLEMAIL.COM.
@ MX 30 ASPMX3.GOOGLEMAIL.COM.

После запуска скрипта, каждый домен из списка получит такой комплект MX записей.

Все PHP программеры, затачивающие cron скрипты на запуск только через веб - печальные му$$$ки

Сабж.

Мониторинг OpenVZ посредством Munin

http://wiki.openvz.org/Monitoring_openvz_resources_using_munin

lighttpd NOTE: a request for x.jpg timed out after writing x bytes. We waited 360 seconds. If this a problem increase server.max-write-idle

В этой ошибке ничего страшного. Она вызвана тем, что клиент сбросил соединение раньше, чем lighttpd смог отдать ему файлы либо клиент реально имеет ОЧЕНЬ медленный канал и не смог забрать файлы в заданное время.

Подробнее: http://redmine.lighttpd.net/wiki/lighttpd/server.max-write-idleDetails

Saturday, 29 May 2010

Установка Munin на Debian 6 Squeeze

Клиентская часть

Ставим датчика на Debian и набор плагинов мониторинга (они встанут в папку /usr/share/munin/plugins):
apt-get install -y munin-node munin-plugins-extra

Установка датчика на CentOS:
yum install -y munin-node

Запускаем его:
/etc/init.d/munin-node start


Убеждаемся, что процесс запустился:
ps aux | grep munin | grep -v grep
root 31205 0.0 0.0 124348 7100 ? Ss 19:47 0:00 /usr/sbin/munin-node


При этом он биндится на 4949 порт, но в конфиге блокировка на доступ к нему только с 127.0.0.1:
netstat -lnpt | grep muni
tcp 0 0 0.0.0.0:4949 0.0.0.0:* LISTEN 31205/munin-node
Для большей безопасности в случае только локального использования рекомендую его настроить на прослушивание только локального интерфейса:
vim /etc/munin/munin-node.conf 
Внисим там коррективу:
host 127.0.0.1
Применяем:
/etc/init.d//munin-node restart
Серверная часть

Ставим:
apt-get install -y munin


Далее я бы рекомендовал бы открыть конфиг:
vi /etc/munin/munin.conf


И сменить там стандартный путь на более удобный:
htmldir /var/www/munin


После этого оздаем папку и запускаем его вручную:
mkdir -p /var/www/munin
chown munin:munin -R /var/www/munin

su munin -s /bin/bash
/usr/bin/munin-cron
exit


При этом, никакой демон для него не требуется, опрос нод мониторинга производится по крон задачей /etc/cron.d/munin, которая также генерирует графики: /var/www/munin.

Если датчики расположены на удаленных серверах, то их нужно указывать в конфиге явно:
vi /etc/munin/munin.conf

Вот таким образом:
[srv1.domain.ru]
address 46.4.63.77
use_node_name yes

А на датчике в свою очередь нужно явно указать IP мастер сервера мониторинга:

vim /etc/munin/munin-node.conf

Он задается в строке:
allow ^127\.0\.0\.1$

После этого потребуется перезапуск: датчика
/etc/init.d/munin-node restart
Обращаю внимание, что стандартно доступ к графикам munin открыт только для 127.0.0.1 и для удаленного доступа к site.ru/munin нужно добавить свой IP:
vim /etc/apache2/conf.d/munin 

Управление плагинами

С плагинами работать крайне просто - это лишь набор слимлинков из папки /usr/share/munin/plugins в папку /etc/munin/plugins.

Например, удалить мониторинг эксима и лдап:
rm /etc/munin/plugins/exim_mailstats /etc/munin/plugins/slapd_bdb_cache_pages /etc/munin/plugins/slapd_bdb_cache_percent
А вот так можно добавить мониторинг апача (обращаю внимание, что для их работы должен быть включен ExtendedStatus у Апача, а также должен быть установлен пакет libwww-perl):
sudo ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
sudo ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
sudo ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes

После этого для изменения набора плагинов нужно перезапустить мониторинг-ноду:

/etc/init.d/munin-node restart   


Также вот хорошая инструкция: http://debianworld.ru/articles/ustanovka-i-nastrojka-munin-v-debian-ubuntu/

Скрипт для очистки неиспользуемой shm памяти

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


Бывает так, что процесс, работающий с shm падает и, разумеется, не успевает освободить блок shm памяти. Поэтому за shm памятью стоит следить и очищать, если находятся не используемые никем блоки. Число процессов, использующих блок shm можно посмотреть в столбце nattach выдачи команды
ipcs -m


А вот скрпит для удаления блоков shm памяти, у которых nattach равно 0.
ipcs -m | grep -v nattch | perl -e 'my $mem = 0; do { my@a=split "\\s+", $_; next if $a[4] or !$a[1]; print "Remove shm block with shmid $a[1] which used by $a[5] processes\n"; $mem+=$a[4]; `ipcrm -m $a[1]`} for<>; $mem /= 1024 for 1..2; print "Totally freed up: $mem mb\n" '

Установка APC (Alternative PHP Cache) на Debian 5 Lenny

This summary is not available. Please click here to view the post.