воскресенье, 9 декабря 2012 г.

Setuid, Setgid


Поиск файлов с битом setuid

find / -type f -perm -4000 -exec ls -l {} \;

...
-rwsr-xr-x 1 root root 35712 Nov  8  2011 /bin/ping
-rwsr-xr-x 1 root root 40256 Nov  8  2011 /bin/ping6
-rwsr-xr-x 1 root root 69096 Mar 30  2012 /bin/umount
-rwsr-xr-x 1 root root 36832 Sep 13 02:29 /bin/su
-rwsr-xr-x 1 root root 31304 Mar  2  2012 /bin/fusermount
-rwsr-xr-x 1 root root 94792 Mar 30  2012 /bin/mount
...

(Бит setuid, установленный для директорий игнорируется (в большинстве дистрибутивов Linux/Unix))

Поиск файлов и каталогов с битом setgid

find / -perm -2000 -exec ls -l {} \;

...
-rwxr-sr-x 1 root tty 14648 Mar 31  2012 /usr/bin/bsd-write
-rwxr-sr-x 3 root mail 14544 Oct 18  2011 /usr/bin/mail-unlock
-rwxr-sr-x 3 root mail 14544 Oct 18  2011 /usr/bin/mail-touchlock
-rwsr-sr-x 1 daemon daemon 47928 Oct 25  2011 /usr/bin/at
-rwxr-sr-x 1 root mlocate 39472 Aug 17  2011 /usr/bin/mlocate
-rwxr-sr-x 1 root shadow 50760 Sep 13 02:29 /usr/bin/chage
-rwxr-sr-x 3 root mail 14544 Oct 18  2011 /usr/bin/mail-lock
-rwxr-sr-x 1 root utmp 375984 Jun  6  2011 /usr/bin/screen
-rwxr-sr-x 1 root shadow 23168 Sep 13 02:29 /usr/bin/expiry
-rwxr-sr-x 1 root tty 18976 Mar 30  2012 /usr/bin/wall
-rwxr-sr-x 1 root mail 14800 Oct 17  2011 /usr/bin/dotlockfile
-rwxr-sr-x 1 root crontab 35896 Jun 20  2012 /usr/bin/crontab
-rwxr-sr-x 1 root ssh 129104 Apr  2  2012 /usr/bin/ssh-agent
-rwsr-sr-x 1 libuuid libuuid 18856 Mar 30  2012 /usr/sbin/uuidd
...

Поиск файлов и каталогов c обеими битами сразу

find / -perm -6000 -exec ls -l {} \;

...
-rwsr-sr-x 1 daemon daemon 47928 Oct 25  2011 /usr/bin/at
-rwsr-sr-x 1 libuuid libuuid 18856 Mar 30  2012 /usr/sbin/uuidd
...

setuid, setgid для файла:

Когда атрибут setuid установлен файлу (chmod u+s), обычный пользователь, запускающий этот файл на исполнение, получает повышение прав до пользователя-владельца файла (обычно root) в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи выполнение которых обычному пользователю недоступно. Пользователю будет запрещено системой изменение нового процесса. Из-за возможности состояния гонки многие операционные системы игнорируют установленный атрибут к shell-скриптам.
Хоть атрибут setuid очень удобен во многих случаях, его неправильное использование может представлять угрозу безопасности когда атрибут присваивается исполняемому файлу, который не тщательно спроектирован. Пользователи могут использовать уязвимости в недоработанных программах, чтобы получить повышенные привилегии или непреднамеренно запустить программу троянского коня.
Установленный setgid атрибут (chmod g+s) дает аналогичное повышение прав, но только для группы. Атрибуты setuid и setgid обычно устанавливаются командой chmod установкой первого бита в 4 (setuid) или 2 (setgid). Команда "chmod 6711" соответственно установит оба бита сразу (4+2=6). Также можно использовать символьные аргументы для установки этих битов командой "chmod ug+s".
Обычно, установка бита setuid и setgid на неисполняемых файлах бессмысленна.

setuid, setgid для директории:

Бит setgid для папки (chmod g+s) заставляет только новые папки и файлы, созданные в ней, наследовать ID группы этой папки вместо ID группы пользователя создавшего файл. Новые подпапки также наследуют бит setgid. Это например позволяет создать общее рабочее пространство для группы без неудобств членам группы явно менять их текущую группу для создания новых файлов и папок. Наследование устанавливается только для новых файлов и папок.

Бит setuid не несет никакого смысла, если он установлен на директорию.

Полезные shell команды


Nohup

Запуск процесса в фоновом режиме с игнорированием к сигналу HUP, чтобы процесс мог продолжать свою работу, после того как пользователь выйдет из системы.

nohup <command> &

nohup — UNIX-утилита, запускающая указанную команду с игнорированием сигналов потери связи (hangup)таким образом, команда будет продолжать выполняться в фоновом режиме и после того, как пользователь выйдет из системы. Если стандартным выводом (stdout) команды является терминал, то он и стандартный поток диагностики (stderr) перенаправляются с добавлением в файл «nohup.out» в текущей директории; если это невозможно сделать, то перенаправление происходит в файл «$HOME/nohup.out». Если и это невозможно сделать, то команда не запускается совсем.
При создании файлов «nohup.out» или «$HOME/nohup.out» команда nohup устанавливает им атрибуты доступа только для владельца этих файлов (группа и остальные пользователи не имеют прав доступа к этим файлам). Если же эти файлы уже существуют, то их права доступа не изменяются.
nohup не переводит автоматически команду в фоновый режим; пользователь должен сделать это явным образом, завершив командную строку символом «&».

Работа с сигналами


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

kill -n HUP <PID>

Временная остановка процесса:

Выполняется с помощью отправки сигнала stop:

kill -s STOP 1313, где 1313 PID процесса


после чего в выводе утилиты ps в поле STAT описывающее текущее состояние процесса он засветится как T

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

tsyrenov  1214  0.0  0.0  73360  1796 ?        S    23:06   0:00 sshd: tsyrenov@pts/1
tsyrenov  1215  0.0  0.3  26256  7516 pts/1    Ss+  23:06   0:00 -bash
tsyrenov  1313  0.4  0.1  14616  2200 pts/1    T    23:06   0:02 watch -n0 date


Возобновление работы приостановленного процесса можно выполнить отправкой сигнала CONT

kill -s CONT 1313

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

Гарантированное уничтожение процесса

kill -s KILL <PID>

Уничтожение процесса с созданием дампа памяти

kill -s SEGV <PID>

Nice, renice

Запуск процесса с понижением приоритета на право доступа к cpu (чем выше значение, тем ниже приоритет). Возможный диапазон значений от +20 до -19.

nice -n '12' bash

процесс был запущен из под рядового пользователя у которого по умолчанию есть права только на понижение приоритета, но не на повышение. В выводе утилиты ps с ключом lax, данный процесс в поле NI отображающего фактор уступчивости засветится значением 12

F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND

5  1000 19138 19006  20   0  73360  1788 poll_s S    ?          0:00      \_ sshd: tsyrenov@pts/1
0  1000 19139 19138  20   0  26256  7520 wait   Ss   pts/1      0:00          \_ -bash
0  1000 19238 19139  32  12  22816  3972 n_tty_ SN+  pts/1      0:00              \_ bash

вся дальнейшая работа из под такого shell'а будет выполнятся с пониженным, унаследованным приоритетом 12.

Уже работающим процессам на лету изменить приоритет можно с помощью renice.

Из под пользователя root мы можем на лету изменить приоритет в любую сторону

root@srv:~# renice -22 19238
19238 (process ID) old priority 12, new priority -20

Видим что приоритет у процесса поднялся до -20

5  1000 19138 19006  20   0  73360  1788 poll_s S    ?          0:00      \_ sshd: tsyrenov@pts/1
0  1000 19139 19138  20   0  26256  7520 wait   Ss   pts/1      0:00          \_ -bash
0  1000 19238 19139   0 -20  22816  4072 n_tty_ S<+  pts/1      0:00              \_ bash

С ключом -u можно увеличить фактор уступчивости для всех процессов конкретного пользователя

root@srv:~# renice 10 -u tsyrenov
1000 (user ID) old priority -20, new priority 10

4     0 19006   435  20   0  73360  3540 poll_s Ss   ?          0:00  \_ sshd: tsyrenov [priv]
5  1000 19138 19006  30  10  73360  1788 poll_s SN   ?          0:00      \_ sshd: tsyrenov@pts/1
0  1000 19139 19138  30  10  26256  7520 wait   SNs  pts/1      0:00          \_ -bash
0  1000 19238 19139  30  10  22816  4072 wait   SN   pts/1      0:00              \_ bash

Fuser

Для определения процессов использующих те или иные файлы или сокеты, можно воспользоваться утилитой fuser. Fuser полезен при диагностике, например при ситуации когда размонтируемая файловая система занята по причине того что используется какими либо процессами, все эти процессы можно без труда выявить.


root@srv:~# fuser -mv /dev
                     USER        PID ACCESS COMMAND
/dev:                root     kernel swap  /dev/dm-1
                     root     kernel mount /dev
                     root          1 F.... init
                     root        306 F.... upstart-udev-br
                     root        310 F.... udevd
                     root        474 F.... sshd
                     messagebus    482 F.... dbus-daemon
                     root        546 F.... upstart-socket-
                     root        579 F.... udevd
                     root        616 F.... udevd
                     root        746 F.... getty
                     root        757 F.... getty
                     root        776 F.... getty
                     root        778 F.... getty
                     root        784 F.... getty
                     root        796 F.... acpid
                     whoopsie    806 F.... whoopsie
                     root        812 F.... cron
                     daemon      813 F.... atd
                     root        844 F.... getty
                     root        864 F.... sshd

root@srv:~# fuser -mv /run/shm
                     USER        PID ACCESS COMMAND
/run/shm:            root     kernel mount /run/shm




воскресенье, 8 января 2012 г.

Настройки PHP-FPM

(PHP 5.2.17, PHP-FPM 0.5.14)


Глобальные параметры


pid_file - pid файл. По умолчанию: то, что было указано при maleextra компилировании опцией --with-fpm-pid

error_log - файл журнала ошибок. По умолчанию: то, что было указано при компилировании опцией --with-fpm-log

log_level - уровень записываемых в журнал ошибок. По seo India умолчанию: "notice" (TODO: get list)

emergency_restart_threshold - при это числе рабочий процессов завершенных с SIGSEGV или SIGBUS... По умолчанию: 10

emergency_restart_interval - ...менее чем за этот промежуток instant performer времени, php-fpm будет мягко перезапущен. Это необходимо, чтобы исключить случайные повреждения памяти. По умолчанию: "1 минута"

process_control_timeout - время ожидания ответа от рабочий процессов. По умолчанию: "5 секунд"

daemonize - укажите "no" для отладки php-fpm или для его performer5 запуска в диспетчере (runit/sv, daemontools, upstart, etc.) По умолчанию: "yes"

Настройки пулов

Пул естественно может быть не один, а сколько вам потребуется. Это позволяет запускать их под разными системными пользователями, разными chroot'ами и т.д. Вообщем это дает определенною гибкость, так как позволяет в каждом пуле использовать свои собственные настройки под веб-приложение, которое будет его использовать. Улучшает безопасность, так как веб-приложения изолированы друг от друга и при компрометации одного приложения, остальные останутся в относительной безопасности. Кроме того это же и облегчает процесс обнаружения скомпрометированных веб-приложений.

В конфигурационном файле php-fpm.conf объявление 2-3 пулов будет выглядеть примерно так

<?xml version="1.0" ?>
<configuration>
<workers>
<section name="pool">
<value name="name">pool-1</value>
...
...
</section>
<section name="pool">
<value name="name">pool-2</value>
...
...

</section>
<section name="pool">
<value name="name">pool-3</value>
...
...
</section>
</workers>
</configuration>


Но так как PHP-FPM с PHP версий ниже 5.3.3 не поддерживает динамическое число дочерних процессов, то путем разнесения веб-приложений по свои отдельным php-fpm пулам, мы теряем по ресурсам. Связано это с тем что при static style pm кол-во процессов всегда одинаковое и если все процессы в одном пуле и ими пользуются все веб-приложения, то единовременно каждому приложению доступно на порядок большее число php-fpm процессов для обработки запросов, чем если бы у каждого приложения было по собственному персональному пулу.


name - имя пула, используется php-fpm'ом при ведении логов

listen_address - прослушиваемый адрес, здесь можно указать как сетевой адрес и порт, так и файловый сокет, например 127.0.0.1:9000 или tmp/php-fpm.sock, соответственно

owner - владелец, который будет назначен файловому сокету

group - группа, которая будет назначена файловому сокету

mode - права, которые будут выставлены на созданный файловый сокет

php_defines - описание настроек php, которые будут применены к данному пулу, перекрыв настройки указанные в /etc/php.ini. Например задание параметров max_execution_time и upload_max_filesize будет выглядеть вот так


<value name="php_defines">
<value name="max_execution_time">120</value>
<value name="upload_max_filesize">30</value>
</value>


user - системный пользователь из под которого будет работать процесс текущего пула

group - системная группа из под которой будет работать процесс текущего пула

style - задает стиль управления кол-вом рабочих процессов php-fpm. Возможные значения это static и apache-like (для PHP версии 5.2.17 с патчем PHP-FPM 0.5.14 - apache-like скорее всего работать не будет, с PHP версии 5.3.3 значение apache-like переименовано в dynamic и работает)

max_children - максимальное кол-во одновременно обрабатываемых запросов, т.е. кол-во процессов php-fpm которое будет запущено

startservers - кол-во создаваемых рабочих процессов php-fpm при запуске (применяется только при использовании apache-like для style)

minspareservers - минимальное кол-во рабочих процессов php-fpm (применяется только при использовании apache-like для style)

maxspareservers - максимальное кол-во рабочих процессов php-fpm (применяется только при использовании apache-like для style)

request_terminate_timeout - время в секундах на обслуживание одного запроса, по истечение которого рабочий процесс будет остановлен. Используется в том случае когда php параметру max_execution_time по каким либо причинам не удается остановить выполнение скрипта. Значение "0s" отключает использование этой функции.

request_slowlog_timeout - время в секундах для обработки одного запроса и при превышении которого данные о выполненном php скрипте будут сброшены в slow.log файл (аналог логирования медленных sql запросов Mysql сервера). 
Значение "0s" отключает использование этой функции.

slowlog - лог файл для записи в него информации о медленных запросах

rlimit_files - устанавливает лимит дескрипторов открытых файлов rlimit

rlimit_core - устанавливает максимальное кол-во используемых ядер rlimit

chroot - директория chroot окружения при запуске. Путь должен быть абсолютным

chdir - изменяет текущую директория при запуске

catch_workers_output - перенаправление STDOUT и STDERR рабочего процесса в главный лог ошибок. Если не установлен, STDOUT и STDERR будут перенаправлены в /dev/null в соответствии со спецификацией FastCGI

max_requests - кол-во запросов которое может обработать процесс, по истечению лимита которого он будет перезапущен. Полезно для минимизации негативного эффекта от утечки памяти при использовании сторонних библиотек. Нулевое значение отключает перезапуск

allowed_clients - список IP адресов запросы с которых будут разрешены к обработке, IP адреса перечисляются через запятую. Нулевое значение снимает ограничение на доступ к php-fpm по IP адресу

Переменные окружения

Особо описывать нечего, ниже часть настроек по умолчанию из конфига php-fpm

                        <value name="environment">
                                <value name="HOSTNAME">$HOSTNAME</value>
                                <value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
                                <value name="TMP">/tmp</value>
                                <value name="TMPDIR">/tmp</value>
                                <value name="TEMP">/tmp</value>
                                <value name="OSTYPE">$OSTYPE</value>
                                <value name="MACHTYPE">$MACHTYPE</value>
                                <value name="MALLOC_CHECK_">2</value>
                        </value>

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

Сборка PHP-FPM в Deb пакет

Пошаговый мануал по сборке PHP-FPM в Deb пакет


(ОС: Debian GNU/Linux 6.0 amd64, PHP 5.2.17, PHP-FPM 0.5.14)

Устанавливаем пакеты необходимые для работы

apt-get install build-essential dh-make libxml2-dev


Создаем каталог в который будем производить инсталляцию пакета до его сборки в deb пакет

mkdir /tmp/package


Логинимся в систему под обычным пользователем и все дальнейшие действия выполняем из под него. Скачиваем нужную нам версию PHP (в примере это будет PHP версии 5.2.17) и распаковываем ее в домашнем каталоге пользователя, под которым зашли в систему

cd ~
wget http://ru.php.net/distributions/php-5.2.17.tar.gz
tar -xf php-5.2.17.tar.gz


скачиваем PHP-FPM патч для нашей версии PHP, выполняем декомпрессию

wget http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz
gzip -d php-5.2.17-fpm-0.5.14.diff.gz


проходим в каталог с исходным кодом PHP

cd php-5.2.17


теперь патчим наш PHP патчем PHP-FPM и включаем поддержку FastCGI и собственно PHP-FPM (в ./configure не забываем добавить нужные нам ключи для сборки PHP с необходимыми нам модулями, например поддержка Mysql)

patch -p1 < ../php-5.2.17-fpm-0.5.14.diff
./configure --prefix= --bindir=/usr/bin --sbindir=/usr/sbin --mandir=/usr/share/man --libdir=/usr/lib --includedir=/usr/include --enable-fastcgi --enable-fpm --with-fpm-log=/var/log/php-fpm.log --with-fpm-pid=/var/run/php-fpm.pid --with-mysql --with-zlib --with-config-file-path=/etc


выполняем компиляцию и установку PHP в заранее подготовленный нами каталог /tmp/package. Данный процесс займет некоторое время, зависит от мощности сервера

INSTALL_ROOT=/tmp/package make all install


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

Build complete.
Don't forget to run 'make test'.


Installing PHP SAPI module:       cgi
Installing PHP CGI binary: /tmp/package/usr/bin/
Installing FPM config:            /tmp/package/etc/php-fpm.conf
Installing init.d script:         /tmp/package/sbin/php-fpm
Installing PHP CLI binary:        /tmp/package/usr/bin/
Installing PHP CLI man page:      /tmp/package/usr/share/man/man1/
Installing build environment:     /tmp/package/usr/lib/build/
Installing header files:          /tmp/package/usr/include/php/
Installing helper programs:       /tmp/package/usr/bin/
  program: phpize
  program: php-config
Installing man pages:             /tmp/package/usr/share/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /tmp/package/usr/lib/php/
[PEAR] Archive_Tar    - installed: 1.3.7
[PEAR] Console_Getopt - installed: 1.2.3
[PEAR] Structures_Graph- installed: 1.0.3
[PEAR] XML_Util       - installed: 1.2.1
warning: pear/PEAR requires package "pear/Archive_Tar" (recommended version 1.3.7)
warning: pear/PEAR requires package "pear/Structures_Graph" (recommended version 1.0.3)
warning: pear/PEAR requires package "pear/Console_Getopt" (recommended version 1.2.3)
warning: pear/PEAR requires package "pear/XML_Util" (recommended version 1.2.1)
[PEAR] PEAR           - installed: 1.9.1
Wrote PEAR system config file at: /tmp/package//etc/pear.conf
You may want to add: /usr/lib/php to your php.ini include_path
Installing PDO headers:          /tmp/package/usr/include/php/ext/pdo/


(в корне каталога /tmp/package удаляем все файлы и каталоги имя которых начинается на точку)


В каталоге /tmp/package создаем подкаталог DEBIAN, в нем файл control с примерно таким содержимым

Package: php-5.2.17-fpm-0.5.14
Architecture: amd64
Depends:
Provides:
Priority:
Version: 5.2.17
Maintainer: nobody
Description: PHP 5.2.17 with PHP-FPM 0.5.14


в этом же каталоге создаем еще один файл c именем preinst (выставляем ему права 775). Этот файл выполняется перед разворачиванием пакета в системе, в нашем случае это простой скрипт, который создаст системного пользователя php-fpm из под которого будет работать PHP-FPM. Выглядит скрипт вот так

#!/bin/sh -e


id php-fpm >/dev/null 2>&1 || addgroup --system php-fpm && \
adduser --system --no-create-home --disabled-password --ingroup php-fpm php-fpm

теперь создаем файл postinst (выставляем ему права 775), это скрипт запускается после разворачивания пакета. Он копирует php-fpm скрипт к init скриптам, делает его исполняемым и прописывает в автозагрузку

#!/bin/sh -e

cp /sbin/php-fpm /etc/init.d/ && \
chmod +x /etc/init.d/php-fpm && \
/usr/sbin/update-rc.d -f php-fpm defaults

и последний файл имеющий отношение к pre, post, rm скриптам Deb пакета это prerm. Он запускается перед удалением пакета из системы, у нас он останавливает PHP-FPM, удаляет системного пользователя php-fpm, убирает php-fpm из автозагрузки и удаляет init скрипт. Как обычно права на него 775

#!/bin/sh -e

/usr/sbin/invoke-rc.d php-fpm stop && \
userdel php-fpm && \
/usr/sbin/update-rc.d -f php-fpm remove && \
rm -f /etc/init.d/php-fpm

В файле /tmp/package/sbin/php-fpm корректируем путь к php-cgi

php_fpm_BIN=/usr/bin/php-cgi


в /tmp/package/etc/php-fpm.conf выставляем пользователя из под которого будет работать PHP-FPM, эту часть конфига:

                        Unix user of processes
                <!--    <value name="user">nobody</value>                               -->

                        Unix group of processes
                <!--    <value name="group">nogroup</value>             -->

меняем на такую:

                        Unix user of processes
                        <value name="user">php-fpm</value>

                        Unix group of processes
                        <value name="group">php-fpm</value>

из под root пользователя меняем владельца и группу для всех файлов в каталоге /tmp/package

chown -R root:root /tmp/package


и из под обычного пользователя выполняем сборку Deb пакета


cd ~
dpkg-deb -b /tmp/package/ php-5.2.17-fpm-0.5.14-amd64.deb


будет аналогичное сообщение

dpkg-deb: building package `php-5.2.17-fpm-0.5.14' in `php-5.2.17-fpm-0.5.14-amd64.deb'.


и в текущем каталоге появится собранный Deb пакет php-5.2.17-fpm-0.5.14-amd64.deb

Теперь из под root пользователя можем установить собранный нами пакет

dpkg -i php-5.2.17-fpm-0.5.14-amd64.deb


(конфигурационный файл php.ini размещаем в каталоге /etc)

воскресенье, 25 декабря 2011 г.

MySQL - оптимизация сервера (часть 2)

Общие параметры конфигурационного файла my.cnf


max_connect_errors - максимальное кол-во ошибок, при достижении которого хост с которого они шли будет заблокирован и не сможет подключиться к серверу. Сбросить накопленное кол-во ошибок для всех хостов можно с помощью команды flush hosts.

binlog_cache_size - размер кэша, используемого для хранения SQL-операторов бинарного журнала регистраций во время транзакций. Этот кэш выделяется для каждого клиента, если сервер использует любой из транзакционных движков, например InnoBD и на сервере включена поддержка бинарного журнала регистраций.
При частом использовании объемных транзакций со множеством операторов, значение данной переменной рекомендуется увеличить. Связано это с тем что большая транзакция может выйти за пределы буфера и серверу придется сохранять часть данных на жесткий диск в временном файле, что снижает производительность. По умолчанию данный кэш равен 32768.

sort_buffer_size - размер буфера, выделяемого на поток при выполнении операций сортировки. Для ускорения операций ORDER BY, GROUP BY рекомендуется увеличить данное значение.
Если отсортированные данные не помещаются в текущий буфер сортировки, то данные начинают использовать жесткий диск. Если вы видите большое значение sort_merge_passes в выводите show global status, то надо задуматься об увеличении sort_buffer_size.
Максимальный объем буфера сортировки 4Гб.

join_buffer_size - размер буфера использующегося при операциях объединения таблиц (при этом объединение происходит без использования индексов). Данные объединения не очень хорошо сказываются на производительности сервера и увеличив join_buffer_size мы можем снизить влияние таких объединений на производительность.
Максимальное значение 4Гб.

thread_cache_size - регулирует кол-во потоков, которые сервер должен поместить в кэш для повторного использования. После отключения клиента, потоки не удаляются а помещаются в кэш, как только MySQL серверу понадобятся новые потоки, он берет их из кэша. Это значение может быть увеличено для повышения производительности, если у вас много новых подключений.

thread_concurrency - кол-во одновременно запускаемых потоков, для Linux систем это кол-во CPU * кол-во ядер в каждом CPU.

ft_min_word_len - минимальная длина слова для включения в индекс fulltext. При изменении данного значения, необходимо заново перестроить ваши fulltext индексы, это можно сделать с помощью команды repair table tbl_name quick или с помощью утилиты mysqlrepair, так mysqlrepair -u root -p --all-databases.

tmp_table_size - максимальный размер временных таблиц, расположенных в оперативной памяти. Если таблица не помещается в рамки указанного значения tmp_table_size, то для работы с ней начинает использоваться диск. Данное ограничение применяется для одной таблицы.

Параметры относящиеся к MyISAM


read_buffer_size - размер буфера, выделяемого потоком для каждой сканируемой таблицы. Используется во время полного сканирования таблиц. Максимальное значение 2Гб.

read_rnd_buffer_size - размер буфера, выделяемого для чтения строк после сортировки, что-бы избежать повторного поиска на диске. Увеличив размер данного буфера, вы значительно улучшите производительность order by. Данный буфер выделяется для каждого клиента.

bulk_insert_buffer_size - MyISAM использует специальный древовидный кэш, чтобы быстрее выполнять массивные insert'ы (такие как INSERT ... SELECT, INSERT ... VALUES (...), (...), ... и LOAD DATA INFILE). Эта переменная ограничивает размер древовидного кэша на каждый поток. При выставлении 0 значения, полностью его отключает. Для оптимальное производительности не устанавливайте его значение больше, чем значение key_buffer_size.
Этот буфер выделяется в момент обнаружения массивной вставки.

myisam_sort_buffer_size - выделяется на поток, используется данный буфер при сортировке MyISAM индексов во время восстановлении индексов, ремонте, оптимизации таблиц или изменении их структуры с помощью оператора alter table, а так же при выполнении load data infile в пустую таблицу.

myisam_max_sort_file_size - размер временного файла, использующегося при восстановлении индексов MyISAM, при использовании операторов repair table, alter table или load data infile. Если размер необходимого файла больше значения данной переменной, то для создания индекса будет использоваться кэш ключей, что значительно медленней.

myisam_repair_threads - указывает кол-во потоков при ремонте таблицы. Увеличение этого значения имеет смысл, если у вас несколько процессоров и большое кол-во оперативной памяти.

Параметры относящиеся к InnoDB


innodb_additional_mem_pool_size - дополнительный пул памяти, который используется InnoDB для хранения метаданных, чем больше у вас таблиц, тем большее значение innodb_additional_mem_pool_size надо выставлять. Если InnoDB потребуется больше памяти, чем указано в данном параметре, то она начнет выделять память из ОС, это происходит достаточно быстро, поэтому менять данный параметр в большинстве случаев не надо.

innodb_buffer_pool_size - InnoDB в отличие от MyISAM использует буферный пул для кэширования индексов и строковых данных. При достаточном объеме памяти увеличение буфера InnoDB может снизить загруженность диска при доступе к табличным и индексным данным. На отдельно стоящем выделенном Mysql сервере можно установить этот параметр в 80% от общего объема физической памяти сервера.

innodb_file_io_threads - кол-во файловых потоков ввода/вывода для использования асинхронных операций. Для *nix систем жестко задано значение в 4, увеличение не даст эффекта.

innodb_thread_concurrency - максимальное кол-во одновременно действующих потоков для InnoDB. Как только кол-во потоков достигает значения указанного в данном параметре, все дополнительные потоки помещаются в FIFO очередь.
Правильное значение для этого параметра сильно зависит от аппаратной конфигурации сервера и рабочей нагрузки. Рекомендуемое значение это значение в два раза большее кол-ва CPU ядер, плюс кол-во жестких дисков. Начиная с версии 5.1.12 можно вообще отключить данный параметр выставив его значение в 0, это разрешит InnoDB использовать то кол-во потоков, которое ей потребуется.

innodb_flush_log_at_trx_commit - крайне желательно выставлять значение в 1. Возможные значения в 0 и 2 могут снизить нагрузку на дисковую подсистему сервера, но этого делать не рекомендуется, так как перестанет соблюдаться ACID.

innodb_log_buffer_size - размер буфера для хранения информации о каждой транзакции. После выполнения транзакции данные о ней сбрасываются на диск. Для больших транзакций, выходящих за пределы этого буфера есть смысл увеличить значение данного параметра, чтобы во время выполнения транзакции данные не сбрасывались на диск по несколько раз подряд, из-за того что они не помещаются в буфер.
Возможное значение от 1 до 8Мб.

innodb_log_group_home_dir - движок InnoDB ведет свои собственные журналы, которые создаются во время запуска сервера, если их еще не существует. По умолчанию эти журналы создаются в каталоге данных, их имена начинаются с ib_, пример файлов


-rw-rw---- 1 mysql mysql 5.0M Dec 23 02:43 /var/lib/mysql/ib_logfile0
-rw-rw---- 1 mysql mysql 5.0M Oct 31 13:23 /var/lib/mysql/ib_logfile1

и данный параметр используется для установки пути к каталогу в котором InnoDB будет записывать свои регистрационные журналы.


innodb_log_file_size - размер каждого файла-журнала в группе журналов. Когда регистрационный журнал переполняется, InnoDB сохраняет буфер на диске. Увеличение размера файла регистрационного журнала уменьшает периодичность переполнения журнала и соответственно периодичность с которой происходит обновление, тем самым снижая нагрузку на дисковую подсистему сервера. При этом, чем больше размер регистрационного журнала, тем больше и время восстановления после сбоя.

Общий размер должен быть не больше 4Гб, по умолчанию 5Мб. Общий размер считается как произведение значений innodb_log_file_size и innodb_log_files_in_group.

innodb_log_files_in_group - общее кол-во файлов журналов в группе журналов. Значение в 2-3 будет хорошим.

innodb_max_dirty_pages_pct - максимальный процент так называемых грязных страниц в буферном пуле InnoDB. Если оно будет достигнуто, то сервер попытается их сбросить, чтобы не закончились все чистые страницы. Диапазон значения от 0 до 100, по умолчанию 90.

innodb_lock_wait_timeout - время в секундах на протяжении которого транзакция InnoDB может ожидать блокировку до того, как будет произведен ее откат. InnoDB автоматически обнаруживает взаимные блокировки транзакций (deadlocks) в своей таблице блокировок и выполняет их откат. Если вы используете команду lock tables или работаете с другими движками с транзакциями, отличными от InnoDB, то в случае взаимной блокировки InnoDB не сможет ее обнаружить. По умолчанию данный параметр равен 50.

innodb_data_file_path -  InnoDB по умолчанию хранит данные в одном или нескольких файлах с данными формирующими табличное пространство. Если у вас есть один логический диск для хранения данных, то размещение одного автоматически расширяющегося файла на нем будет достаточно.
При задании объема файла можно указывать суффикс в конце, например K (килобайты), M (мегабайты), G (гигабайты). Если вообще не указывать параметр innodb_data_file_path в конфиг.файле my.cnf, то по умолчанию создастся автоматически расширяющийся 10Мб файл данных с именем ibdata1

-rw-rw---- 1 mysql mysql 10M Dec 23 06:20 /var/lib/mysql/ibdata1

это тоже самое что и innodb_data_file_path = ibdata1:10M:autoextend

Синтаксис описания файла:

path:size
path:size:autoextended
path:size:autoextended:max:maxsize

autoextended - придает файлу свойство автоматического расширения, т.е. когда файл заполняется, InnoDB движок автоматически увеличивает его размер. По умолчанию при авторасширении файлы увеличиваются на 8Мб. Для того чтобы задать другое приращение, используется параметр innodb_autoextend_increment

maxsize - максимальный размер до которого может расширяться файл

Вышеуказанные атрибуты autoextended и maxsize могут быть использованы только для последнего файла данных в параметре innodb_data_file_path

Примеры:

innodb_data_file_path = ibdata1:50M;ibdata2:50M:autoextend - будет создан файл ibdata1 фиксированного размера в 50Мб и автоматически расширяющийся файл ibdata2 размером 50Мб

innodb_data_file_path=ibdata1:10M:autoextend:max:500M - будет создан единственный автоматически расширяющийся файл данных ibdata1 размером 10Мб, который сможет разрастись максимум до 500Мб

Ниже указан пример более интересного варианта, в каталогах /dr2 и /dr3 примонтированы два дополнительных жестких диска на считая основного. Таким образом мы разнесли наши файлы данных и файл-журналов на разные физические диски, что может дать ощутимый прирост производительности Mysql сервера. Кроме того это придает некую гибкость, например можно вынести файл-журналов на быстрый SSD-диск или поэкспериментировать со сменой файловой системы на дополнительных дисках.
Значение innodb_data_home_dir мы задали пустым для того чтобы иметь возможность использовать абсолютные пути в параметрах innodb_data_file_path и innodb_log_group_home_dir.

innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend
innodb_log_group_home_dir = /dr3/iblogs

и помним что InnoDB заполняет файлы данных поочередно, начиная с первого файла данных

innodb_data_home_dir - общая часть пути к каталогу всех файлов данных InnoDB. Если он не указан, то будет использоваться путь по умолчанию, а если указать пустую строку в качестве его значения, то в innodb_data_file_path можно будет использовать абсолютные пути к файлам.

воскресенье, 18 декабря 2011 г.

Восстановление Adaptec RAID массива после отказа жесткого диска

Смотрим состояние логического устройства
root@rescue ~ # arcconf getconfig 1 ld
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
   Logical device name                      : Xen
   RAID level                               : 5
   Status of logical device                 : Degraded
   Size                                     : 2086902 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                           : Yes
   Power settings                           : Disabled
   --------------------------------------------------------
   Logical device segment information
   --------------------------------------------------------
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Missing



Command completed successfully.
в предпоследней строке видим что один из трех HDD вообще не отвечает, заменяем его.
Теперь выводим физические устройства
root@rescue ~ # arcconf getconfig 1 pd

Controllers found: 1
----------------------------------------------------------------------
Physical Device information
----------------------------------------------------------------------
      Device #0
         Device is a Hard drive
         State                              : Online
         Supported                          : Yes
         Transfer Speed                     : SATA 3.0 Gb/s
         Reported Channel,Device(T:L)       : 0,0(0:0)
         Reported Location                  : Connector 0, Device 0
         Vendor                             :
         Model                              : ST31500341AS
         Firmware                           : CC1H
         Serial number                      : 9VS3YTBB
         Size                               : 1430799 MB
         Write Cache                        : Enabled (write-back)
         FRU                                : None
         S.M.A.R.T.                         : No
         S.M.A.R.T. warnings                : 0
         Power State                        : Full rpm
         Supported Power States             : Full rpm,Powered off
         SSD                                : No
         MaxIQ Cache Capable                : No
         MaxIQ Cache Assigned               : No
         NCQ status                         : Enabled
      Device #1
         Device is a Hard drive
         State                              : Online
         Supported                          : Yes
         Transfer Speed                     : SATA 3.0 Gb/s
         Reported Channel,Device(T:L)       : 0,1(1:0)
         Reported Location                  : Connector 0, Device 1
         Vendor                             :
         Model                              : ST31500341AS
         Firmware                           : CC1H
         Serial number                      : 9VS3WVC2
         Size                               : 1430799 MB
         Write Cache                        : Enabled (write-back)
         FRU                                : None
         S.M.A.R.T.                         : No
         S.M.A.R.T. warnings                : 0
         Power State                        : Full rpm
         Supported Power States             : Full rpm,Powered off
         SSD                                : No
         MaxIQ Cache Capable                : No
         MaxIQ Cache Assigned               : No
         NCQ status                         : Enabled
      Device #2
         Device is a Hard drive
         State                              : Ready
         Supported                          : Yes
         Transfer Speed                     : SATA 3.0 Gb/s
         Reported Channel,Device(T:L)       : 0,2(2:0)
         Reported Location                  : Connector 0, Device 2
         Vendor                             :
         Model                              : ST31500341AS
         Firmware                           : CC1H
         Serial number                      : 9VS217GE
         Size                               : 1430799 MB
         Write Cache                        : Enabled (write-back)
         FRU                                : None
         S.M.A.R.T.                         : No
         S.M.A.R.T. warnings                : 0
         Power State                        : Full rpm
         Supported Power States             : Full rpm,Powered off
         SSD                                : No
         MaxIQ Cache Capable                : No
         MaxIQ Cache Assigned               : No
         NCQ status                         : Enabled


Command completed successfully.
видим Device #2 c "State: Ready" это как раз новый HDD который поставили взамен сбойного
Запускаем следующую команду, после которой новый диск должен автоматически добавится в RAID массив и запустится процесс ребилда
arcconf rescan 1
Выводим состояние логического устройства
root@rescue ~ # arcconf getconfig 1 ld
...
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Rebuilding (0,2)             9VS217GE
...
Выводим статус и прогресс ребилда
root@rescue ~ # arcconf getstatus 1
Controllers found: 1
Logical device Task:
   Logical device                 : 0
   Task ID                        : 101
   Current operation              : Rebuild
   Status                         : In Progress
   Priority                       : High
   Percentage complete            : 0
 Если после запуска arcconf rescan 1 диск не добавился и массив не стал ребилдиться, то переводим новый HDD в hotspare состояние и ребилд массива начнется
arcconf setstate 1 device <channel_device> HSP
channel_device - это номер канала и id диска в этом канале. Узнать его можно выполнив команду
arcconf getconfig 1 pd
поле 
Reported Channel,Device(T:L)
После окончания ребилда диск становится в hotspare резерв
root@rescue ~ # arcconf getconfig 1 ld
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
   Logical device name                      : Xen
   RAID level                               : 5
   Status of logical device                 : Optimal
   Size                                     : 2086902 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                           : Yes
   Power settings                           : Disabled
   --------------------------------------------------------
   Logical device segment information
   --------------------------------------------------------
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Spare (0,2)             9VS217GE
Переводим из hotspare в ready
arcconf setstate 1 device <channel_device> RDY
Убеждаемся что массив и диски вернулись в нормальное состояние
root@rescue ~ # arcconf getconfig 1 ld
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
   Logical device name                      : Xen
   RAID level                               : 5
   Status of logical device                 : Optimal
   Size                                     : 2086902 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                           : Yes
   Power settings                           : Disabled
   --------------------------------------------------------
   Logical device segment information
   --------------------------------------------------------
   Segment 0                                : Present (0,0)             9VS3YTBB
   Segment 1                                : Present (0,1)             9VS3WVC2
   Segment 2                                : Present (0,2)             9VS217GE

четверг, 15 декабря 2011 г.

MySQL - файлы таблиц

MyISAM таблицы


MyISAM таблицы представляют собой файлы .frm, .MYD, .MYI. Например таблица с именем mytable будет выглядеть в виде файлов

mytable.frm - файл описания в котором хранится структура таблицы
mytable.MYD - файл данных в котором хранится содержимое таблицы
mytable.MYI - файл индексов, который содержит информацию обо всех индексах, представленных в данной таблице

Пример с сервера:

-rw-rw---- 1 mysql mysql    0 Dec 13 05:35 ofGroupProp.MYD
-rw-rw---- 1 mysql mysql 1.0K Dec 13 05:35 ofGroupProp.MYI
-rw-rw---- 1 mysql mysql 8.5K Dec 13 05:35 ofGroupProp.frm
-rw-rw---- 1 mysql mysql    0 Dec 13 05:35 ofGroupUser.MYD
-rw-rw---- 1 mysql mysql 1.0K Dec 13 05:35 ofGroupUser.MYI
-rw-rw---- 1 mysql mysql 8.5K Dec 13 05:35 ofGroupUser.frm
-rw-rw---- 1 mysql mysql   52 Dec 13 05:35 ofID.MYD
-rw-rw---- 1 mysql mysql 2.0K Dec 13 05:36 ofID.MYI
-rw-rw---- 1 mysql mysql 8.4K Dec 13 05:35 ofID.frm

InnoDB таблицы


Уникальной привязки каждой таблицы к определенным файлам нет, кроме файла описания .frm, размещенного в каталоге, к которому принадлежит таблица.
InnoDB можно настроить на представление содержимого баз данных с помощью табличных пространств двух типов

Общее табличное пространство


Тип табличного пространства который состоит из одного или нескольких больших файлов, расположенных в каталоге данных. Объем этих файлов равен сумме размеров индивидуальных файлов. При таком режиме единственным файлом, имеющим отношение к определенной таблице, является файл с расширением .frm.
Данный режим используется InnoDB движком по умолчанию.

Индивидуальное табличное пространство


Есть возможность настроить InnoDB таким образом, чтобы на одну таблицу приходилось по одному табличному пространству (с помощью параметра innodb_file_per_table = 1 в конфиг.файле my.cnf, перед включением данного параметра обязательно выполните бэкап всех текущих баз данных!). В таком случае каждой таблице InnoDB будет соответствовать по два файла в каталоге базы данных. Это файл .frm и файл .ibd, содержащие данные и индексы этой таблицы.

Пример с сервера:

-rw-rw---- 1 mysql mysql 8.5K Oct 31 13:35 bugreport.frm
-rw-rw---- 1 mysql mysql  96K Oct 31 13:36 bugreport.ibd
-rw-rw---- 1 mysql mysql 8.6K Oct 31 13:35 channels.frm
-rw-rw---- 1 mysql mysql  96K Oct 31 13:36 channels.ibd

И все равно общее табличное пространство будет использоваться даже при таком режиме работы. InnoDB ведет внутренний словарь данных, содержащий информацию о каждой таблице. Этот словарь хранится в общем табличном пространстве.

Так же в независимости от используемого механизма хранения и его настроек в каталоге данных каждой базы данных есть файл db.opt, этот файл содержит стандартную кодировку и порядок сортировки.