FastNetMon

Thursday 25 August 2011

Отладка плагинов munin

Осуществляет вот примерно такой командой:
/usr/bin/munin-cron --debug --nofork --host srv1.domain.ru --service if_eth0

Tuesday 23 August 2011

Потребление электричества Датацентрами мира

По оценкам Greenpeace, потребление электроэнергии всеми Дата-Центрами мира, составляет от 1,5 до 2 процентов от общемирового спроса и с каждый год эта потребность увеличивается на 12%. Если бы Интернет был страной, то он бы занял пятое место по объему потребления электроэнергии после России и Японии.



Источник: http://telecombloger.ru/7971

Thursday 18 August 2011

Подсчет pps в Линуксе

Если с просмотром утилизации канала в Линукс нет никаких проблем, что с просмотром числа пакетов в секунду на приеме/передаче - небольшие сложности.

Вариант 1: iptraf

Устанавливаем:
yum install -y iptraf
apt-get install -y iptraf

Используем:
iptraf - Detailed interface statistics │ - eth0

Вариант 2: tcpstat

Устаналиваем:
apt-get install -y tcpstat
yum install -y tcpstat

Используем:
tcpstat -o "%p\n" -i eth0 1

В ответ будет выдано примерно следующее:
418.00
606.00
559.00
1645.00
1695.00
491.00
334.00
536.00
416.00

Вариант 3: собственный скрипт.

Написать его крайне легко, а для получения данных можно использовать приведенные ниже источники:
ifconfig eth0 | grep pack
RX packets:6494715125 errors:0 dropped:28045132 overruns:0 frame:0
TX packets:7270808826 errors:0 dropped:0 overruns:0 carrier:0
cat /sys/class/net/eth0/statistics/tx_packets
cat /sys/class/net/eth0/statistics/rx_packets

Online конвертер pps в bps и наоборот

http://www.ccievault.net/index.php/tools

Tuesday 9 August 2011

MySQL: миграция с ENUM на VARCHAR

Перед началом работ необходимо сделать бэкап.

Итак, есть поле таблицы:
`status` enum('new','suspended','complete') default NULL,

Напрямую, насколько я понял, конвертировать его в VARCHAR нельзя. Поэтому пойдем по пути через промежуточное поле, создаем его:
alter table mod_ressrvlist add newstatus varchar(255) not null;

Итого, у нас теперь два поля в табоице:
`status` enum('new','suspended','complete') default NULL,
`newstatus` varchar(255) NOT NULL,

Итак, сейчас у нас следующее содержимое таблиц:
select status, newstatus from sometable;
+-----------+-----------+
| status | newstatus |
+-----------+-----------+
| new | |
| suspended | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| suspended | |
| new | |
| suspended | |
| suspended | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| new | |
| suspended | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
+-----------+-----------+

Копируем значения:
update sometable set newstatus = status;

Итого:
sql> select status, newstatus from mod_ressrvlist;
+-----------+-----------+
| status | newstatus |
+-----------+-----------+
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| suspended | suspended |
| new | new |
| suspended | suspended |
| suspended | suspended |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
+-----------+-----------+

После этого переименовываем старую таблицу:
ALTER TABLE sometable CHANGE status oldstatus enum('new','suspended','complete') default NULL;

Переименовываем новую в требуемое имя:
ALTER TABLE sometable CHANGE newstatus status varchar(255) NOT NULL;

Стираем старый филд с enum:
alter table sometable drop oldstatus;


Првоеряем новый тип поля:
`status` varchar(255) NOT NULL,

Делаем контрольную выборку:
select status from sometable;
+-----------+
| status |
+-----------+
| new |
| suspended |
| new |
| new |
| suspended |
| new |
| new |
| new |
| new |
| new |
| new |
| suspended |
| suspended |
| new |
| suspended |
| suspended |
| suspended |
| new |
| new |
| new |
| new |
| suspended |
| new |
| new |
| new |
| new |
| new |
| new |
| new |
| new |
| suspended |
| suspended |
| new |
| new |
| new |
| new |
| new |
| suspended |
| new |
| suspended |
| new |
| new |
| suspended |
| new |
| new |
+-----------+

Все! :)

MySQL - добавление нового значения в поле типа ENUM

Допустим, ранее было вот такое поле в некой таблице:
`status` enum('new','suspended') NOT NULL,

Но в один прекрасный момент понадобилось добавлять в этот самый enum что-то еще:
ALTER TABLEsome_table MODIFY status enum('new','suspended', 'complete')

Вуаля:
`status` enum('new','suspended','complete') default NULL,

Фишка тут еще в том, что новое значение нужно добавить в конец существующего списка:
Changing the definition of an ENUM or SET column by adding new enumeration or set members to the end of the list of valid member values, as long as the storage side of the data type does not change. For example, adding a member to a SET column that has 8 members changes the required storage per value from 1 byte to 2 bytes; this will require a table copy. Adding members in the middle of the list causes renumbering of existing members, which requires a table copy.

Источник: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

Tuesday 2 August 2011

В Bind 9 исправлен баг, который приводил к очень долгой загрузке на большом числе зон

http://www.isc.org/community/blog/201107/major-improvement-bind-9-startup-performance

И мы были подвержены этому багу...

Запуск arcconf на read only (ro) файловой системе

Итак, есть сервер с контроллером Adaptec, ФС которого перешла в RO. Очевидный вариант - проверить состояние массива утилитой arcconf, но она не срабатывает!

arcconf getconfig 1 ld
Could not open log file: /var/log/UcliEvt.log

После выдачи ошибки команда блокируется. Первое предположение было, что открытие лог файла необходимо для работы программы, но strace открыл глаза на источник проблемы:

umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = -1 EINTR (Interrupted system call)

То есть, программа не могла создать лок-файл. Фиксится легко:
mount -t tmpfs none /var/lock

Все, после этого сработало на ура:
arcconf getconfig 1 ld
Could not open log file: /var/log/UcliEvt.log
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
Logical device name : Device 0
RAID level : 10
Status of logical device : Optimal
Size : XXXXX MB
Stripe-unit size : 256 KB
Read-cache mode : Enabled
MaxIQ preferred cache setting : Enabled
MaxIQ cache setting : Disabled
Write-cache mode : Enabled (write-back)
Write-cache setting : Enabled (write-back)
Partitioned : Yes
Protected by Hot-Spare : No
Bootable : Yes
Failed stripes : No
Power settings : Disabled
--------------------------------------------------------
Logical device segment information
--------------------------------------------------------
Group 0, Segment 0 : Present (0,0) 6SJ0ET5R0000M124SKJU
Group 0, Segment 1 : Present (0,1) 6SJ0DRBM0000M125DK6G
Group 1, Segment 0 : Present (0,2) 6SJ0EET40000M125DNTK
Group 1, Segment 1 : Present (0,3) 6SJ0ERJZ0000M1214JZD



Command completed successfully.
Could not open log file: /var/log/UcliEvt.log

Демоны на PHP

http://sergey89.ru/notes/php-multi-threaded-daemon-part-one/