вторник, 31 марта 2009 г.

Крик души

Какой идиот придумал, чтобы ab НЕ РАБОТАЛА, если урл передан без слеша на конце?


ab ya.ru
ab: invalid URL
Usage: ab [options] [http[s]://]hostname[:port]/path




ab ya.ru/
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 ya.ru (be patient).....done


Server Software: httpd
Server Hostname: ya.ru
Server Port: 80

Document Path: /
Document Length: 4848 bytes

Concurrency Level: 1
Time taken for tests: 0.068 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Total transferred: 5095 bytes
HTML transferred: 4848 bytes
Requests per second: 14.73 [#/sec] (mean)
Time per request: 67.902 [ms] (mean)
Time per request: 67.902 [ms] (mean, across all concurrent requests)
Transfer rate: 73.28 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 21 21 0.0 21 21
Processing: 47 47 0.0 47 47
Waiting: 20 20 0.0 20 20
Total: 68 68 0.0 68 68

Как ограничить скорость закачки wget`у ?

А вот так:
wget --limit-rate=1M http://mirror.yandex.ru/centos/5.3/isos/x86_64/CentOS-5.3-x86_64-bin-2of7.iso

Как избавиться от ошибки в YUM: "TypeError: unsubscriptable object"

Вылезла вот такая противная ошибка (а если вкратце -- "TypeError: unsubscriptable object"):


Traceback (most recent call last):
File "/usr/bin/yum", line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 229, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 145, in main
(result, resultmsgs) = base.buildTransaction()
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 647, in buildTransaction
(rescode, restring) = self.resolveDeps()
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 704, in resolveDeps
for po, dep in self._checkFileRequires():
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 939, in _checkFileRequires
if not self.tsInfo.getOldProvides(filename) and not self.tsInfo.getNewProvides(filename):
File "/usr/lib/python2.4/site-packages/yum/transactioninfo.py", line 414, in getNewProvides
for pkg, hits in self.pkgSack.getProvides(name, flag, version).iteritems():
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 300, in getProvides
return self._computeAggregateDictResult("getProvides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 470, in _computeAggregateDictResult
sackResult = apply(method, args)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 861, in getProvides
return self._search("provides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 837, in _search
for pkg in self.searchFiles(name, strict=True):
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 586, in searchFiles
self._sql_pkgKey2po(rep, cur, pkgs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 470, in _sql_pkgKey2po
pkg = self._packageByKey(repo, ob['pkgKey'])
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 413, in _packageByKey
po = self.pc(repo, cur.fetchone())
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 68, in __init__
self._read_db_obj(db_obj)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 94, in _read_db_obj
setattr(self, item, _share_data(db_obj[item]))
TypeError: unsubscriptable object


Исправляется вот так:
yum clean all

Обновление Centos 5.2 до Centos 5.3

ВНИМАНИЕ!!! КАТЕГОРИЧЕСКИ ПРЕДОСТЕРЕГАЮ ВАС ОТ ПОВТОРЕНИЯ ЭТОГО МАНУАЛА НА ПРОДАКШЕН СЕРВЕРАХ!!! ТОЛЬКО ТЕСТЫ!!!!

Ставим апдейченые пакеты:
rpm -Uhv http://mirror.yandex.ru/centos/5.3/os/x86_64/CentOS/centos-release-5-3.el5.centos.1.x86_64.rpm
rpm -Uhv http://mirror.yandex.ru/centos/5.3/os/x86_64/CentOS/centos-release-notes-5.3-3.x86_64.rpm


Открываем файл репо:

vi /etc/yum.repos.d/CentOS-Base.repo


Явно забиваем версию и выбираем везде baseurl вместо mirrorlist:

:%s/$releasever/5.3/
:%s/mirror.centos.org/mirror.yandex.ru


В результате он должен принять вид:


# CentOS-Base.repo
#
# This file uses a new mirrorlist system developed by Lance Davis for CentOS.
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-5.3 - Base
#mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=$basearch&repo=os
baseurl=http://mirror.yandex.ru/centos/5.3/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#released updates
[updates]
name=CentOS-5.3 - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=$basearch&repo=updates
baseurl=http://mirror.yandex.ru/centos/5.3/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#packages used/produced in the build but not released
[addons]
name=CentOS-5.3 - Addons
#mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=$basearch&repo=addons
baseurl=http://mirror.yandex.ru/centos/5.3/addons/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that may be useful
[extras]
name=CentOS-5.3 - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=$basearch&repo=extras
baseurl=http://mirror.yandex.ru/centos/5.3/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-5.3 - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=$basearch&repo=centosplus
baseurl=http://mirror.yandex.ru/centos/5.3/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#contrib - packages by Centos Users
[contrib]
name=CentOS-5.3 - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=5.3&arch=$basearch&repo=contrib
baseurl=http://mirror.yandex.ru/centos/5.3/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5



Ну и, наконец, yum update && yum upgrade

Что я скажу, жуть, но, видимо, такие проблемы из-за того, что релиз вот только только вышел и не доразложен по зеркалам. Часть идей слита с отличного мануала: http://xuev.blogbus.com/logs/37302025.html

четверг, 26 марта 2009 г.

dosemu + keyrus.com + DOS софт с кириллицей

Вот встала задачка поюзать одну старую софтинку, а всякие там лайвсиди с ДОСами искать, юзать вовсе не хочется, как всегда задача сходу решается в Линуксе :)

Ставим dosemu, скачиваем русификатор: http://games.gcmsite.ru/arch/keyrus.zip, распаковываем в папку с нашей DOS программой. Теперь надо каким-то образом запускать keyrus.com перед запуском самой программы. Конечно, это можно было сделать последовательным запуском указанных программ в консоли dosemu, но есть более элегантное решение -- старые добрые BAT файлы.

Создаём файлик run.bat вида:
KEYRUS.COM
TESTDOSPROG.EXE

или KEYRUS.COM /LAT -- если надо включить английскую раскладку стандартной

И после этого прямо его запускаем в dosemu: dosemu run.bat и видим русские буквы вместо кракозябл :)

вторник, 24 марта 2009 г.

Perl + locale + Debian

Довольно часто на Дебияне вываливается вот такая хрень:

perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "ru_RU.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").



Временное решение: export LANG=C и потом perl -v
Постоянное решение: открываем файл /etc/environment и добавляем там строку: LANG=C

Обновление Debian 4 Etch для Debian 5 Lenny

Для начала обновим систему до самой новой версии текущего стабильного дистрибутива:
apt-get update;
apt-get upgrade;

Теперь открываем файл управления репозиториями:
vi /etc/apt/sources.list


И меняем везде etch на lenny (конфиг файл может выглядеть иначе, то, что Вы видите ниже - лишь пример):
deb http://ftp2.de.debian.org/debian lenny main contrib non-free
deb http://ftp2.de.debian.org/debian-security lenny/updates main contrib non-free

После этого выполняем (да, apt-get upgrade включен в apt-get dist-upgrade, но я лично предпочитаю их запускать по отдельности):
apt-get update
apt-get upgrade
apt-get dist-upgrade

В процессе апгрейда Debian будет задавать множество вопросов на тему "а заменить ли этот конфиг?" самый безопасный способ на все вопросы отвечать "Оставить старый конфиг" (Save Old Config) / "Ok".

Также очень часто apt-get задает такой вопрос "The default action is to keep your current version. *** xxxxx.conf (Y/I/N/O/D/Z) [default=N] ? " и на него самое безопасное отвечать N либо просто нажимать Enter, так как этот ответ стандартный.

Еще очень част запрос в виде "Modified configuration file" на который необходимо отвечать: "keep the local version currently installed".

Также может выдаваться запрос "Services to restart for XXX library upgrade", на него можно смело отвечать Ok.

Но так или иначе, часто Debian задает такие вопросы, на которые без технических знаний не ответить, так что, если не уверены в своих силах, обращайтесь к профессионалам, пожалуйста, иначе убытки неминуемы.

Вот и все, апдейт закончен :)

воскресенье, 22 марта 2009 г.

Каким образом Jabber транспорты связываются с jabber сервером?

Сабж, прошу закидать ссылками.

Пока понял лишь то, что транспорты работают отдельным процессом и соединяются с сервером по сети (5347 порт для Jabberd2), используя некий "secret", который используется для отличения "своих" транспортов.

Установка Twisted в Debian based дистрибутивах

Встала необходимость поставить эту либу для работы PyICQ, но по каким-то сакральным причинам оно не ставится через easy_install (а через apt генерит ворох ошибок и тоже не ставится), поэтому ставим из исходников.

Сначала установим пакеты необходимые для сборки: sudo apt-get install python-dev build-essential

Потом находим исходники на странице: http://twistedmatrix.com/trac/wiki/Downloads "Source Tarball Twisted 8.2.0 tarball" и сливаем, распаковываем и из папки запускаем: sudo ./setup.py install ну и всё, теперь мы захламили систему ворохом Питоновских либ :)

Работа с протоколом ICQ из Python - установка

Во-первых, стоит вопрос -- какую же библиотеку для этого использовать? Мне кажется, самый что ни на есть лучший вариант -- это взять библиотеку, которую использует много народу. Выбор пал на PyICQt, которая по совместительству является лучшим ICQ транспортом для Jabber`а.

Вообще, я полностью не уверен, что это библиотека авторов PyICQt, но тем не менее, у них есть какие-то патчи к ней и можно быть уверенным, что в случае проблем с протоколом, они его быстро пропатчат :)

Ну что же, идём на их страницу: http://code.google.com/p/pyicqt/source/checkout и сливаем себе весь их svn репозиторий: svn checkout http://pyicqt.googlecode.com/svn/trunk/ pyicqt-read-only

Ставим Twisted, для этого идём в мануал http://phpsuxx.blogspot.com/2009/03/twisted-debian-based.html. Ставим остальные модули: sudo easy_install config, sudo easy_install Nevow

Теперь переходим в папку проекта, копируем дефалтный конфиг: cp config_example.xml config.xml и запускаем: python PyICQt.py и всо, транспортег работает =)

А вот здесь есть примеры использования Twisted Oscar (да, библиотека входит в состав Twisted, а не PyICQt): http://twistedmatrix.com/projects/words/documentation/examples/

суббота, 21 марта 2009 г.

Один аватар для всех и вся!

Вот прошу любить и жаловать отличный сервис http://en.gravatar.com/, он отличен тем, что позволяет использовать один аватар на куче сайтов -- т.е. один раз загрузив сюда милую сердцу аву, вы её сможете в один клик (а можно вообще без кликов, например, на CPAN) поставить на любом сайте, поддерживающим эту фичу :)

Unix way

Вот так надо проектировать и писать софт:



ПЫСЫ: это Postfix

пятница, 20 марта 2009 г.

Ещё один сторонний репозиторий для Centos / RHEL, Epel

Ранее использовал только Rpm Forge, но недавно наткнулся на вот это http://fedoraproject.org/wiki/EPEL/FAQ#howtouse, сам теперь юзаю Epel и Вам советую -- в репо дофика полезных пакетов :)

Ставится очень легко:
rpm -Uhv http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

Установка PostGIS

Ставим PostgreSQL по следующему мануалу: http://phpsuxx.blogspot.com/2010/03/postgresql-8-centos-debian-5.html

Установка:
yum install -y postgis # Centos5
apt-get -y install postgresql-8.3-postgis # Debian 5


Создаем базу данных и пользователя для нее:
createuser --pwprompt --superuser --no-createdb --no-createrole my_db_user
createdb my_test_database --owner my_db_user


Подключаем поддержку PostGIS (если работаем с Геодатой):
createlang plpgsql my_test_database

Для Дебияна:
psql my_test_database my_db_user --password -h 127.0.0.1 -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql
psql my_test_database my_db_user --password -h 127.0.0.1 -f /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql


Для Центоса:
psql my_test_database my_db_user --password -h 127.0.0.1 -f /usr/share/pgsql/contrib/lwpostgis.sql
psql my_test_database my_db_user --password -h 127.0.0.1 -f /usr/share/pgsql/contrib/spatial_ref_sys.sql

четверг, 19 марта 2009 г.

О веб стандартах

Microsoft выпустил финальную версию Internet Explorer 8
По словам главы компании Стива Балмера, новый продукт "мгновенно приводит пользователей к нужной информации и обеспечивает непревзойденную ни одним другим браузером защиту".


Как говорил Геббельс - "ложь должна быть чудовищной, чтобы в неё поверили".

UPD: Вчера, 19 марта, всего через несколько часов после официального запуска нового браузера Internet Explorer 8 от компании Microsoft, его взломал немецкий специалист во время соревнования PWN2OWN.

среда, 18 марта 2009 г.

Технический аудит хостинг провайдеров

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

Я в печали. Сделайте такой сервис и дайте мне ссылку :)

вторник, 17 марта 2009 г.

Be Linux

Установка Socks5 прокси сервера на Debian 4

Ну беглый поиск по репо дал результат: dante-server ну что же, Данте так Данте :)

apt-get install dante-server после этого будет немного ругани, что сервер не запустился, игнорируем и продолжаем.

Открываем конфиг: /etc/danted.conf, раскомменчиваем строчку:
internal: <тут наш внешний айпи> port = 1080


Аналогичную процедуру выполняем со строкой:
external: <тут наш внешний айпи>


Выключаем каую-либо авторизацию юзеров:
method: none


Внизу добавляем ниже указанный блок, тем самым разрешая любых юзеров отовсюду:

client pass { from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0 }
pass { from: 0.0.0.0/0 to: 0.0.0.0/0 protocol: tcp udp }


sudo /etc/init.d/danted start и пробуем прителнетица к нашему прокси: telnet <тут наш внешний айпи> 1080


Теперь к этому чуду надо прикрутить авторизацию:

Прописываем следующие настрйоки:

method: username
user.privileged: root


После этого командой useradd добавляем юзера:
useradd proxyuser -G users
passwd proxyuser

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

понедельник, 16 марта 2009 г.

Причина не запрещать root`у логиница по SSH

Сам всегда работаю под обычным юзером и исполняю команды через sudo, но вот сегодня после долгого редактирования /etc/sudoers я получил вот такое чудо:

sudo vim /etc/sudoers
>>> sudoers file: syntax error, line 85 <<< sudo: parse error in /etc/sudoers near line 85



Как же мне повезло, что логин рута по SSH не был залочен (требование определенной проги, сам бы я залочил). Так что безопасность, безопасностью, а паранойя паранойей, теперь НИКОГДА не буду запрещать логин рута по SSH, буду лишь ставить НУ ОЧЕНЬ длинные пароли. Как раз вот для таких случаев.

воскресенье, 15 марта 2009 г.

MySQL vs MemcacheDB

MemcacheDB мы протестировали ранее и получили результаты 14 000 / 18 000 записей в секунду соотвественно для записи / чтения.

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

#!/usr/bin/perl

use strict;
use warnings;

use DBI;

my $dsn = "DBI:mysql:database=test_hashed;host=localhost";
my $dbh = DBI->connect($dsn, 'root', '') or die "Cannot connect to db";

open my $fl, '<', 'lists/test.txt' or die "suxx"; $dbh->do("DELETE FROM test_table");

while(<$fl>) {
chomp $_;
$dbh->do("INSERT INTO test_table VALUES (?, ?)", undef, $_, "$_ value");
}



Для проверки скорости чтения будет следующий скрипт:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use DBI;

my $dsn = "DBI:mysql:database=test_hashed;host=localhost";
my $dbh = DBI->connect($dsn, 'root', '') or die "Cannot connect to db";

open my $fl, '<', 'lists/test.txt' or die "suxx"; #$dbh->do("DELETE FROM test_table");

while(<$fl>) {
chomp $_;
#$dbh->do("INSERT INTO test_table VALUES (?, ?)", undef, $), "$_ value");
my $sth = $dbh->prepare("SELECT value_ FROM test_table WHERE key_=?");
$sth->execute($_);
my $result = $sth->fetchrow_hashref();

#print Dumper($result);
}



Тест1.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ varchar(255), value_ varchar(255)) ENGINE = MYISAM;

При записи имеем:
time ./work_db_mysql.pl
real 2m4.629s
user 0m6.640s
sys 0m5.608s

Т.е. около 16 000 записей / секунду.

При чтении имеем:
.... жду уже 10 минут, а скрипт даже не добрался до цифры "1" в файле (там данные упорядочены по алфавиту -- 01234567890abcd...z), что говорит о том, что ещё ждать десятки минут. Что же, MySQL просто ужасен, если не использовать индексы.


Тест2.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ varchar(255), value_ varchar(255), index(key_)) ENGINE = MYISAM; (предварительно убиваем старую таблицу -- drop table test_table;)

Тест на скорость записи данных:
real 3m3.763s
user 0m10.985s
sys 0m9.669s

Т.е. ~10 500 записей / секунду

Тест на чтение данных:
time ./work_db_mysql_read.pl

real 6m17.771s
user 0m19.949s
sys 0m8.509s

Т.е. около 3 000 чтений / секунду, что подтверждает явное преимущество MemcacheDB.

Тест 3.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ char(255), value_ char(255), index(key_)) ENGINE = MYISAM; (т.е. fixed length char вместо varchar)

Запись:
real 3m15.876s
user 0m6.944s
sys 0m5.820s

~ 10 000 записей в секунду

Чтение:

real 6m11.984s
user 0m20.137s
sys 0m8.385s

Т.е. около ~3200 записей / секунду.

Ну выводы... MySQL слил на данном типе данных =)

Почему Centos5 фееричная хрень?

Эм, немного холивара, сёдня мы будем сливать Centos5 (он же RHEL5 в миру).

Вот почти все фичи, которые делают пользование дистрибом очень неудобным:

1. Неимоверно тормозной менеджер пакетов YUM, делающий апдейты довольно продолжительным процессом; по этой же причине Centos5 почти нереально использовать на слабых VPS с ограничением по памяти и процессору. UPD! Достаточно не юзать VPS с жутким оверселлом от всяких ... (вставь имя нелюбимого хостера) и все будет ок!

2. Слишком бедный выбор пакетов в стандартном репозитории (в сравнении с почти любым другим Linux дистрибом). Ничего толкового из этого дистра без репозиториев epel и rpmforge не сделать.

3. Удаление /sbin и /usr/sbin из PATH - самое идиотское, что только можно было придумать для повышения безопасности (причем, любой адекватный человек сразу же их добавить РУКАМИ в PATH и будет жить счастливо).

4. Очень часты проблемы с железом - как со старым, так и с новым; такое впечатление, что бэкпортинг драйверов из Федоры не производится вовсе. Также за время работы с Центосом сталкивался с его спорадическими зависаниями в режиме Xen Dom0.

5. Установка КУЧИ ненужных пакетов при Minimal Install (убирание всех пунктов + очистка вложенных пунктов при кастомной настройке). Причем, это не только моё субъективное имхо -- в Нете куча мануалов на тему "Cleanup default Centos Installation": http://phpsuxx.blogspot.com/2009/03/centos.html

6. Долбаный SeLinux, который подавляющему большинству людей НЕ нужен и возможности отключить который на стадии инсталляции нету.

7. Жутко неюзабельное управление сетью, которое после Дебияновского /etc/network/interfaces превращает конфигурирование сети в ад. UPD! Ну тут на самом деле, вопрос привычки, так что не согласен со своим же утверждением :)

8. Установка IPv6 facility опять же без возможностью отрубить его на стадии установки, ну нету у меня IPv6 и не хочу я его, точка.

9. Полная иррациональность в названии пакетов, например, пакета gvim и apache я найти так и не смог, их заменяют мифические httpd и vim-gtk. Ну и самое жестокое -- чтобы поставить обычный консольный vim надо додуматься, что его пакет называется не просто "vim", а "vim-enhanced". UPD! Опять же, вопрос привычки.

10. Но последним пунктом, после которого я потерял терпение было то, что после установки гипервизора XEN по зависимостям поставилось ещё ПОЧТИ ДВА ДЕСЯТКА десктоп-ориентированных пакетов (SDL, libx11 и проч), что никак иначе, как идиотизмом на сервере без всего связанного с графикой, назвать нельзя. Ага, с этой феерией по засеранию системы мусором сложно сравниться любому их дистрибов :)

В итоге, довольно продолжительное общение с Centos5 мне все больше и больше напоминает тёмные времена общения с вендой, которую как раз приходилось ОЧЕНЬ ДОЛГО настраивать всяческими бубнами? чтобы получить приемлемо работающую платформу, c Centos5 ситуация точно-в-точь аналогичная -- я вынужден по несколько часов тратить на ненужные задачи.

А вот в Дебияне5 ситуация полностью иная - я за минимальное время получаю полностью работающую систему почти НЕ требующую доводки и каких-то ну нужных рутинных действий (разве что прописывание себя в sudoers). Так что господам из RH стоит ДОЛГО и УПОРНО учиться у сообщества имхо лучшего дистрибутива Linux - Дебияна.

P.S. всё выше написанное справедливо для Centos 5.4 со всеми установленными апдейтами.

суббота, 14 марта 2009 г.

Работа с MemcachDB из Perl Cache::Memcached::Fast

В документации сказано, что MemcacheDB поддерживает протокол обмена своего старшего брата -- Memcached`а. Но, как следовало ожидать, функции поддерживаются далеко не все:
* get(also mutiple get)
* set, add, replace
* append/prepend
* incr, decr
* delete
* stats

Далее нам это надо будет учитывать при использовании модуля Cache::Memcached::Fast (который вам предстоит поставить с CPAN).

Вот простейший пример работы с MemcacheDB:

#!/usr/bin/perl

use strict;
use warnings;

use Cache::Memcached::Fast;

my $memd = new Cache::Memcached::Fast( {
servers => [ { address => 'localhost:7777' } ],
} );

$memd->set("some_key", "some data");
print $memd->get("some_key");



А сейчас давайте попробуем внести 2 миллиона записей в базу (2 млн уникальных ключей, значения поставим равными ключам + некий набор символов, суммарный размер ключей -- 33 102 046 байт (ок 32 мегайбайт), данных чуть больше). Платформа для теста: 4 * Intel(R) Xeon(R) CPU E5420 @ 2.50GHz + 8Гб памяти + SATA винты в RAID1 + Centos5. Перед началом теста БД занимала 28 мегабайт.

Итого время добавления 2 млн записей следующее:
time ./work_db.pl
real 2m35.559s
user 0m6.060s
sys 0m13.745s

Т.е. ~14 000 записей в секунду скорость записи.

Протестируем скорость чтения, просто получим ключи, которые возьмем из файла:

time ./work_db.pl
some data
real 1m46.386s
user 0m9.637s
sys 0m23.029s

Т.е. скорость чтения около ~18 000 записей / в секунду

Кстати, а статистику работу MemcacheDB можно посмотреть опять же Телнетом:

telnet localhost 7777
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 7673
STAT uptime 859
STAT time 1236987371
STAT version 1.2.0
STAT pointer_size 64
STAT rusage_user 3.684439
STAT rusage_system 19.183083
STAT ibuffer_size 512
STAT curr_connections 5
STAT total_connections 256615
STAT connection_structures 9
STAT cmd_get 4
STAT cmd_set 14623
STAT get_hits 4
STAT get_misses 0
STAT bytes_read 14110820
STAT bytes_written 6402248
STAT threads 4
END


Итого, мы получили ~18 000 записей / секунду при чтении, а при записи ~14 000 записей / секунду.

Errata: немного переклинило и считал минуты по 30 секунд, исправил, значения стали меньше :)

Запуск MemcacheDB

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

Вот пример простенького скрипта для запуска MemcacheDB в Single режиме (без репликаций):

#!/bin/sh

PATH=/opt/memcacnedb120
$PATH/bin/memcachedb -p7777 -d -r -H $PATH/db -N -u root > $PATH/debug.log 2>&1


-p -- используемый порт
-d -- режим демона
-r -- эээ, "maximize core file limit", у кого есть идеи для адекватного перевода, прошу в комменты
-H -- путь к папке с базой данных
-v -- включить отладочные сообщения (используйте в целях отладки)
-N -- включить параметр "DB_TXN_NOSYNC", дающий сильный прирост производительности

Соответственно, в продакшн режиме -u root замените на юзера, от имени которого будет работать ваша БД.

Теперь для проверки БД заюзаем Телнет: telnet localhost 7777, в ответ мы должны увидеть нечто подобное:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.


Вот и всё, MemcachedDB готова к работе :)

Попробуем поместить данные в БД:
set test 0 0 4
1234
STORED


После этого отключаем telnet сессию (CTRL + ] и следом quit) и подключаемся заново, чтобы получить наши тестовые данные:

get test<и тыкаем энтер>
VALUE test 0 4
1234
END


Вот так всё просто, так что в случае необходимости можно сходу реализовать протокол к MemcacheDB для не поддерживаемого языка =)

пятница, 13 марта 2009 г.

Сборка и установка MemcacheDB

Что это?

"Memcachedb is a distributed key-value storage system designed for persistent."
(с) пдфка с презентацией этой бд, которую я настоятельно рекомендую пролистать всем: http://memcachedb.org/memcachedb-guide-1.0.pdf


Зачем?

MemcacheDB -- очень быстрая не реляционная БД (основана на ключах), имеющая поддержку транзакций, репликаций, а также имеющая универсальный АПИ (как раз от Memcached`а). Эта БД нужна там, где скорости MySQL / PostgreSQL недостаточно, а их функций предостаточно. По заявлениям разработчиков, скорость записи в MemcacheDB может достигать 20 000 записей в секунду, а чтения -- до 50 000 записей / секунду (на машинке Dell 2950III); не правда ли, неплохо?

+ искаропки мы получаем такую фичу как горячие бэкапы БД.

Кто авторы и где офсайт?

Официальный сайт этой БД: http://memcachedb.org/

Как поставить?

Ставить мы будем стабильную 1.2.0 версию вот отсюда: http://code.google.com/p/memcachedb/downloads/list

Итак, мануал по установке вот тута: http://memcachedb.googlecode.com/svn/trunk/INSTALL

Мануал в целом отличный, но от меня будут следующие правки к нему (диффы, надеюсь, все читать умеют? Для тех, кто не умеет: с минусом строка, которую удаляем, с плюсом -- та, которую добавляем):

BDB:
-$../dist/configure
+$../dist/configure --prefix=/opt/bdb47


libevent:
-$./configure
+$./configure --prefix=/opt/livevent13e


По поводу .so:
Вот это:
Load .so file by add two line in /etc/ld.so.conf:

/usr/local/lib
/usr/local/BerkeleyDB.4.7/lib


Заменяем на:
/opt/livevent13e/lib
/opt/bdb47/lib


MemcachDB:
-$./configure --enable-threads
+$./configure --enable-threads --prefix=/opt/memcacnedb120 --with-libevent=/opt/livevent13e --with-bdb=/opt/bdb47

Правки обусловлены тем, что я не привык засорять систему мусором, поэтому ставлю все, собранное из сорцов, в /opt.

Ну вот и всё, пробуем запустить собраный бинарик: /opt/memcacnedb120/bin/memcachedb -h. О запуске в "продакшен" режиме и о работе с этой БД расскажу в следующих статьях :)

вторник, 10 марта 2009 г.

Я, наверное, влюбился ... в Pylons :)

Прошу любить и жаловать http://www.pylonshq.com !
Пожалуй, один из десятков (а-то и сотен) фреймворков для веб разработки, который меня устраивает, как с точки зрения его пользователя (очень удобный способ установки библиотек в некую виртульную среду, вместо извращений с системными либами), так и с точки зрения программиста (тут имеется в виду архитектура фреймворка и его внутреннее устройство).

Что нам предоставляет эта прелесть? Ну, во-первых, ставший уже привычным MVC, т.е. весь проект представляет из себя трехслойный пирог, состоящий из Контроллеров, Модели и Вьюхи (кстати, общепринятого перевода View в данном контексте я не встречал, может подскажете?).

В отличие от вещей по типу Rails тут Вьюх аж три на выбор - выбирай любую, просто замечательный подход. В модели в качестве ORM используется SQLAlchemy - пожалуй, лучший ORM для динамического языка в мире :) Причем, спешу заметить, что Алчеми очень уместно использует особенности синтаксиса Питона и поэтому смотрится как "влитой", хотя очень часто ORM маппинги смотрятся просто жутко в коде.

Но наиболее интересен тот факт, что мне, наверное, впервые удалось написать приложение, использующее СУБД, ни разу не задумавшись о самой СУБД (прошу прощения за каламбур). Кстати говоря, если интересно, то использовал я SQLite (хотя в случае с MySQL потребовалось бы самому создать базу и выдать полномочия, что также нельзя называть затруднительным).

Об архитектуре. Pylons построен из отдельных кирпичиков, где каждый кирпичик представляет собой довольно мощный проект, который никакого прямого отношения с Pylons не имеет (сравните это с подходом в Rails, где всё собрано из "самопальных либ").

Раз уж я начал ругать Rails, то стоит, наверное, поругать и любимый мной Catalyst (ну как вы могли догадаться, любить я его меньше от этого не стану) - в частности Алчеми, на мой взгляд, обходит DBIx на голову, а по скорости работы встроенный http сервер пастер обходит почти любой httpd бэкэнд Каталиста, так что его можно использовать (только не очень долго...) бэз фронтэнда.

Ну и ещё немножко о модульном устройстве. Тут опять можно поругать Каталист, для установки которого надо вытянуть порядочную кучу библиотек с CPAN`а, тут же всё ставится за минуты :)

Кстати, как я понял, аналог CPAN для Python обитает по адресу http://pypi.python.org/pypi

пятница, 6 марта 2009 г.

Очистка Centos5 от мусора

Сабж. Вот ряд мануалов, рассказывающих, как облегчить стандартную инсталляцию CentOS 5:

http://www.bitzbyte.com/linux_unix/minimal_centos_install
http://sudhaker.com/linux-unix/very-minimal-centos-installation.html
http://www.pervasivecode.com/blog/2008/03/29/centos-51-minimal-vps-install-guide/

Чуть позже повторю это на реальной машинке и сведу в два мануала -- один "легкий Centos для VPS" и "легкий Centos для хост машины".

Новая земля

Посмотрел сегодня этот фильм, впечатления - картина просто превосходная, всем рекомендую, только не "под пиво", тут думать придётся :)

О проектировании сложных систем

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

Михаил Донской

Рекомендую всем прочесть: http://www.polit.ru/science/2008/08/20/programmist_print.html

среда, 4 марта 2009 г.

Тестирование пропускной способности сети

Встала вот такая вот банальная задача -- протестировать пропускную способность сети на новом сервере. На #perl kid- подсказал заюзать netperf (для Centos он есть в rpmforge), что я успешно и сделал.


Тестирование происходит довольно просто:
На первой машинке запускаем netserver, это сервер для тестов
А на второй машинке пускаем netperf -H айпи_первой_машинки -l 300 # 300 -- это время теста

Для моей железки получились следующий результаты:

Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 300.03 941.11


После окончания тестов не забудьте убить netserver.

Centos 5.2 + непонятный маршрут на 169.254.0.0

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

Убирать вот так:
в файле /etc/sysconfig/network добавляем строку:
NOZEROCONF=yes

+ рестарт сети: /etc/init.d/network restart

вторник, 3 марта 2009 г.

Установка Centos5.2 в DomU посредством virt-install

Вместе с Xen на Centos обычно ставится замечательная тулза, написанная на Питоне, virt-install. Она предназначена для упрощения создания новых виртульных машин.

Определимся с именами, наш тестовый сервер будет называется xenhosting1, мы сразу создадим для него папку в /home -- mkdir -p /home/xenhosting1; лимит по ОЗУ -- 1гб, ЖД -- 10Гб, поддержки графики -- нету. Install location следующий: http://mirror.yandex.ru/centos/5.3/os/x86_64/

С IP ситуация у нас такая -- есть два реальных айпи, один из них привязан к eth0, а другой никуда не привязан и будет использован нами как раз для нашей DomU.

Создаём один единственный раздел в ext3 и выбираем точку монтирования для него /, grub ОБЯЗАТЕЛЬНО СТАВИМ.

В результате установки имеем вот такой конфиг для нашего DomU:

cat /etc/xen/xenhosting1
name = "xenhosting1"
uuid = "2d6235eb-321f-0e3a-160e-0344a5a4a2a3"
maxmem = 1024
memory = 1024
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
vfb = [ ]
disk = [ "tap:aio:/home/xenhosting1/xenhosting1.disk,xvda,w" ]
vif = [ "mac=00:16:3e:33:82:3d,bridge=xenbr0" ]


xm create xenhosting1 # запускаем ВПС
xm console xenhosting1 # входим в консоль
xm create -c xenhosting # запуск со входом в консоль
xm list # просмотр запущенных впс
Для выхода из консоли используйте CTRL+]


А вот так можно сделать автозагрузку впс при старте хост-машины: ln -s /etc/xen/xenhosting1 /etc/xen/auto

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

основано на: http://guruadmin.ru/page/ustanovka-xen-v-centos-50-i386 автору большое спасибо :)

Установка XEN на Centos 5.2 x86_64: Dom0

Установка гипервизора XEN на Centos 5.2 x86_64.

Установим ядро, способное работать в Dom0, и сам гипервизор:
yum install xen kernel-xen

Проследим, какие изменения происходят в конфиге GRUB.

/boot/grub/menu.lst до установки:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-92.1.22.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-92.1.22.el5 ro root=LABEL=/
initrd /boot/initrd-2.6.18-92.1.22.el5.img
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-92.el5 ro root=LABEL=/
initrd /boot/initrd-2.6.18-92.el5.img



/boot/grub/menu.lst после установки:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-92.1.22.el5xen)
root (hd0,0)
kernel /boot/xen.gz-2.6.18-92.1.22.el5
module /boot/vmlinuz-2.6.18-92.1.22.el5xen ro root=LABEL=/
module /boot/initrd-2.6.18-92.1.22.el5xen.img
title CentOS (2.6.18-92.1.22.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-92.1.22.el5 ro root=LABEL=/
initrd /boot/initrd-2.6.18-92.1.22.el5.img
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-92.el5 ro root=LABEL=/
initrd /boot/initrd-2.6.18-92.el5.img



Как видим, xen не был выбран стандартным для загрузки, стандартным осталось обычное ядро. Нам нужно default 1 исправить на default 0 и ребутнуца: shutdown -r now


После ребута, мы должны увидеть нечто вот такое:
uname -r
2.6.18-92.1.22.el5xen
, это означает, что гипервизор запустился нормально и наше Dom0 ядро под ним также отлично работает.

Ну что, можно уже использовать консоль управления XEN, пока в ней лишь наше Dom0 ядро:
xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 7931 4 r----- 16.6

Также стоит проверить, запустился ли служебный демон XENа -- /etc/init.d/xend status
Ну вот, с установкой гипервизора закончено, установку ОС в DomU рассмотрим в последующих статьях.

Использование screen

yum install screen ух! сколько я готовился к этому моменту, ну что, начинаю осваивать screen!

Теперь чтобы начать работать надо запустить screen, после этого можно смело закрыть консоль, не боясь, что выполняемые задачи завершаться. После повторного подключения достаточно ввести screen -r и перед вами предстанут все задачи, которые вы выполняли до входа (ну не совсем те, если быть честным, скорее всего они уже будут выполнены!).

А чтобы отключиться от screen без прерывания сессии (выйти в обычный ssh) нужно нажать CTRL + a и потом d.

Если же нужно посмотреть текст, который уже скрылся на предыдущем экране, то нажимаем клавиши CTRL+a и [, после чего screen переходит в copy-mode и стрелочками можно подняться на экран выше и просмотреть нужную информацию.

Как надо писать программы.

http://www.catonmat.net/blog/code-reuse-in-google-chrome-browser/ -- вот замечательный образец для подражания при написании программ.

Как прочесть в Ubuntu виндовый .HLP файл?

А очень просто:


apt-get install helpdeco
mkdir -p decompiled # при декомпиляции будет куча файлов и лягут они в текущую папку
cp *.gid *.hlp decompiled/
cd decompiled
helpdeco target.hlp


Ну вот и всё -- получаем кучу wmf и rtf файлов, которые легко прочесть на любой платформе.

ПыСЫ: а можно ещё проще, если стоит wine: wine ~/.wine/drive_c/windows/winhlp32.exe "file.hlp"

Что-то на меня нашло..

Начав с утреннего просмотра новостей, прочитал весь блог http://abava.blogspot.com, а это не много не мало, 1015 постов, тяга к знаниям, блин :)

Сервисы мониторинга серверов

Вот насмотрелся у Abava прикреплённых и часто обновляющихся постов, реши сделать нечто подобное, ну начнём.

Известные мне сайта / движки для мониторинга серверов:
0. http://host-tracker.com/
1. http://mon.itor.us/ (спасибо опять же Abav`е за наводку)
2. http://zabbix.com/ это как раз движок, посредством которого можно построить свой мониторинг, причем с очень красивым интерфейсом
3. http://www.nagios.org/ опять движок, который мне субъективно ОЧЕНЬ не нравится по причине жуткого интерфейса и способа добавления / настройки узлов (все через конфиг, никакой настройки через веб); хотя я использовал не последнюю версию, но ... "осадок остался".
4. http://www.zenoss.com/ и снова платформа, но с ней я не имел счастья работать, так что ничего не скажу

Список будет по мере поступления инфы обновляться и подниматься в топ.