понедельник, 18 января 2010 г.

Хостинги. Начало.

Давненько не излагал мыли. Хотя есть чем поделиться.

Так уж случилось, что хостим мы сайты своих клиентов на виртуальном хостинге от masterhost. Что можно сказать плохого об этом:
  1. Цена. За 4 площадки тарифа "Специалист", где можно разместить 60 доменов и 40 баз MySQL платить приходится около 24 т.р. в год.
  2. Странные тарифы. На 1 площадку дается 1 MySQL пользователь. Получается что если нужно дать доступ клиенту к площадке (по умолчанию не даем, сами обслуживаем - так вернее) - светятся пароли к БД. А докупить 1 БД юзера - 4 у.е. в месяц. Некисло так выходит.
  3. Кодировки сервера MySQL. Я работаю с базами в уникоде. По умолчанию на сервере кодировка баз - кириллица. А сопоставление соединения с MySQL - юникод. В итоге приходится извращаться когда нужно сделать дамп базы - данные дампятся в кириллице, но при этом в дампе валяется "SET NAMES UTF8". И пока не изменишь на cp1251 - дамп по человечески не зальеш. А править файлы например размером 50 мб - не айс, только vi и справляется, а под виндой сделать это нереально. В общем не понимаю я зачем все это :-(
Хотя, надо отдать должное, за более чем 2-х летний опыт работы с хостингом - проблем почти не было. Бэкапы по просьбам "достают" довольно быстро, сайты работают нормально, в почте спам режется хорошо. Был прицидент с системным временем: время на хост-сервере и сервере БД отличалось секунд на 40 - потупил неслабо пока это понял. Но поддержка оперативно таки среагировала, молодцы.

Но кризис есть кризис, и решили мы сэкономить. Толчком послужило открытие сервиса truevds с мизерными ценами на ВПС (при оплате за год - скидка 50%. Это не реклама, просто делюсь:-). Был взят для пробы минимальный тариф, так потыкать и оттестировать предполагаемую схему. Позже был изменен тариф на 256Мб/480МГц/8Гб и взят дополнительный сервер под базу данных - 128Мб/320Мгц/4Гб.
Ну и впоследствии 40 сайтов были перенесены на него. Так как с почтой разбираться категорически влом - почта переехала на Google Apps/pdd.Yandex.ru

Что получилось:
  1. Настроен хостинг с учетом некоторых рекомендаций безопасности на основе FAST-CGI (php-fpm+apc)/lighttpd
  2. Размещены 40 сайтов, их них 35 - динамика (php и mysql)
  3. Экономия денег - считайте сами (расходы были 24 000, стали 6 000)
  4. Свобода действий: понадобился например модуль для псевдостриминга flv и php-ffmpeg - да пожалуйста.
  5. После настройки акселератора - сайты летают. Хотя нагруженных сайтов нет - все они чисто номинальные (самый посещаемый - 1000 хостов/4000 хитов в сутки), но на глаз открываются гораздо шустрее чем это было у мастерхоста.
  6. Глядя на загрузку сервера - думается еще есть задел на будущее.
Как это делалось на практике - в следующих статьях.
Про что хочется поведать:
  • Установка lighttpd-1.4.25(из Sid - там есть полезная фича в mod_rewrite для легкой настройки правил rewrite для Codeigniter/Kohana) на Debian 5 и его настройка.
  • Настройка виртуальных хостов.
  • Настройка php через fast-cgi. На каждом вирт. хосте php будет работать под своим uid/gid. Сначала все запустил через spawn-fcgi. Позже перешёл на использование deb-пакета php-fpm, который собрали (и планируют поддерживать) ребята из truevds.
  • Тестирование производительности сервера. Смотреть что он выдает будем с помощью siege.
  • Подключение apc/xcache/eaccelerator. Опять тестирование производительности.
  • Про тонкую настройку MySQL сервера.


вторник, 13 октября 2009 г.

Some tips for Gentoo

Несколько полезных моментов

  1. -fomit-frame-pointer Glibc has a glibc-omitfp USE flag. This makes glibc use -fomit-frame-pointer and some other optimizations for the build where it's safe.)
  2. If you are using gcc-4.2.2 or newer you can also use -march=native or -mtune=native.
  3. 64 bit profile (amd64):
CHOST="x86_64-pc-linux-gnu"
CFLAGS="-march=native -mtune=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"




Apache auth in PHP

Пример кода для реализации аутентификации в PHP средствами Apache:
(не тестировалось)
session_start();
error_reporting(2047);
$user = '112';
$pass = 'test';

$authorized = false;

if(isset($_GET['logout']) && (0!=$_SESSION['user_id'])) {
$_SESSION['auth'] = false;
unset($_SESSION['user_id']);
header("Location: ./googby.html");
// session_destroy();
echo "logging out...";
}

if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
if (($user == $_SERVER['PHP_AUTH_USER']) && ($pass == ($_SERVER['PHP_AUTH_PW'])) && $_SESSION['auth']) {
$authorized = true;
$_SESSION['user_id']=intval($_SERVER['PHP_AUTH_USER']);

}
}

if ((! $authorized)) {
header('WWW-Authenticate: Basic Realm="Login please"');
header('HTTP/1.0 401 Unauthorized');
$_SESSION['auth'] = true;
print('Login now or forever hold your clicks...');
// header("Location: ./access_denied.html");
exit;
}

?>
?logout">exit

Как выбрать повторяющиеся записи в таблице

Еще один трюк, сам до этого ни за что бы не додумался, где то подсмотрел.

Запрос, показывающий повторяющиеся записи в таблице:

SELECT subject, сount(subject) AS retry
FROM myTable
-- where ....
GROUP BY subject
HAVING ( (Count(subject))>1 );

Количество записей возвращаемых MySQL без учета limit

Иногда нужно получить полное число записей в таблице. При этом в скрипте уже есть запрос, возвращающий часть записей (limit).

Чтобы обойтись одним запросом к базе, можно использовать такой код:
$query="select SQL_CALC_FOUND_ROWS id [, ...] from table_tb limit 1,1";
....
$result=mysql_query($query);
....
$result_=mysql_query('SELECT FOUND_ROWS() as total_count');

Размер таблиц в PostgreSQL

Посмотреть размер таблиц в PostgreSQL не очень то просто, здесь вам не мускуль.Но поможет такой запрос:

SELECT relname AS name, relfilenode AS oid, (relpages /128) as size_mb, reltuples as count
FROM pg_class WHERE relname='myBigTable';

Также он покажет примерное количество записей.

Очень выручает когда база пухнет и нужно выяснить кто виноват.
источник - какой то фак с опеннет.

Важно: нужно обращать внимание на toast таблицы - в них хранятся текстовые поля пользовательских таблиц, и насколько я понял, bytea тоже.

воскресенье, 7 июня 2009 г.

Размер картинки при кодировании DVD с помощью mencoder

Есть домашняя коллекция фильмов в mpeg4. DVD диски принципиально не покупаю - за лицензию платить как то очень дохрена. Смотреть что-то другое, как у нас любят продавать по 10 фильмов на диске - это не для меня. Поэтому уже несколько лет граблю позаимствованные диски у знакомых, иногда сливаю video_ts с винтов, которые проходят мимо меня.

Кодирую mencoder-ом в xvid, картинку не режу, стараюсь чтоб выходной файл был качественный, поэтому на размер - плевать.

Фильмы на dvd в основном размера 720*576, при этом aspect_ratio=16/9=1.778.
Если обрезать черные поля (а обрезать нужно - нахрен нам лишнее:-) - то aspect_ratio нужно менять. Долгое время мучался с подбором значения. Но таки пересилил лень и вывел формулу:
--------------------------
Xorig*Yorig - факт. размер картинки (720*576)
aspectOrig - оригинальный aspect_ratio (1.778)

Xcropped:Ycropped - размеры обрезанной картинки (-vf crop=704:412:8:82)

aspectNew=Xcropped*Yorig*aspectOrig/Ycropped*Xorig = 704*576*1.778/412*720=2.43
--------------------------

а вот сам скрипт для кодирования в 2 прохода:
----------------
#!/bin/bash
# исходник видео и выходной файл
source="/mnt/video/unsorted/королевство/video_ts"
#source="/dev/dvd"
title=2
out="~/movie.avi"

# битрэйт (в кбит/сек) прикидываем исходя из правила 0.25-0.30 бит на пиксель для хорошего качества: 720*432*25кадров в сек.=2332800 бит/пиксель ~ 2500 kbps
video_bitrate=2500

# размер картинки с учетом обрезанных черных полей. чтоб определить делаем maplayer ... -vf cropdetect
vf="-vf crop=
704:412:8:82"

# наш высчитанный aspect_ratio
aspect=2.43
aspect_ratio=":aspect=$aspect"
aspect="-force-avi-aspect $aspect"

#options='-aid 129'#если дорожка со звуком не одна
# звук кодируем пресетом
audiocodec="-oac mp3lame -lameopts preset=extreme"

# или постоянным битрэйтом
#audio_bitrate=256
#audiocodec="-oac mp3lame -lameopts vbr:br=${audio_bitrate}"
# или просто копируем с источника без пережатия (если к примеру нужен 5+1)
#audiocodec="-oac copy"

# если исходник - мульфильм
#cartoon=":cartoon"

# тут наши опции для xvid с макс. качеством
videooptions_pass1="-ovc xvid -xvidencopts pass=1${aspect_ratio}${cartoon}:chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:threads=16"

videooptions_pass2="-ovc xvid -xvidencopts pass=2${aspect_ratio}${cartoon}:chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:threads=16:bitrate=${video_bitrate}"

log=/tmp/encode-xvid.log

# 1 проход
mencoder dvd://$title -dvd-device $source \
$options \
-nosound \
$videooptions_pass1 \
$vf \
$aspect \
-o /dev/null

# 2 проход
mencoder dvd://$title -dvd-device $source \
$options \
$videooptions_pass2 \
$audiocodec \
$vf \
$aspect \
-o $out
----------------

а вот наборы опций для разного качества/скорости, рекомендованные на сайте mplayer

DescriptionEncoding optionsspeed (in fps)Relative PSNR loss (in dB)
Very high qualitychroma_opt:vhq=4:bvhq=1:quant_type=mpeg16fps0dB
High qualityvhq=2:bvhq=1:chroma_opt:quant_type=mpeg18fps-0.1dB
Fastturbo:vhq=028fps-0.69dB
Realtimeturbo:nochroma_me:notrellis:max_bframes=0:vhq=038fps-1.48dB