2011-10-06

Oracle 8.1.7 RHEL3 VLM

Итак, есть такая тема, как использование Very Large Memory (VLM) в Oracle 8.1.7 на RHEL3 AS.
Тема возникла по той простой причине, что человеческой информации в интернете я по этому поводу не нашел, а проблема с тем, что невозможно данную версию Oracle заставить использовать под SGA больше 1,7 Gb очень животрепещуща. Ситуация такова, что есть достаточно серьезная железка с 8Gb ОЗУ, 8 HDD, 2*4 CPU с установленным RHEL3 AS Update 6, на которой кроме этого самого Oracle 8i ничего нет. И того максимального количества оперативы(1,7), которого раньше хватало по уши, сейчас хватать резко перестало. Ну тупо количество пользователей системы выросло на порядок. 64 битной версии 8i не существует в природе, и поменять ее на что-то другое невозможно. На ней весь буховский софт крутится, а контора производитель поддерживать его практически перестали, на аксапту они видите ли переваливаются и никакие ораклы им более не антиресны. Так что крутитесь, что называется, как хотите. Вот и приходится.

Короче, сервер в постоянном затыке из-за того, что постоянно читает с диска, а процы затарены под завязку тем, что разруливают ресурсы оперативы между 20-ю - 40-ка активными сессиями. Можно долго рыть события, которые зафаживают систему, но ясно одно - пока не увеличишь количество памяти, которое данная версия оракла может адресовать, рыть дальше бесполезно.

И это дело для настоящих пацанов. Понял я это после того, как НЕДЕЛЮ пытался это сделать, ухоркал 2 тестовые виртуалки, но добился только того, что НИЧЕГО не добился. И если вы думаете, что я пишу это потому, что знаю, как выделить хотя-бы 4 Gb ОЗУ под SGA, то плачьте, ибо это не так!!! Но истинный путь самурая заключается в том, чтобы решить нерешаемую задачу на зависть всем недоделанным нинзям, и выложить ее, решенную и разжеванную, всему сообществу, чтобы любой мог проделать этот же путь не умываясь соплями отчаянья, а с радостью того, что не надо ничего даже понимать, а тупо выполнить набор инструкций и быть в шоколаде.



Но в сторону сантименты и словоблудие....

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

http://www.puschitz.com/TuningLinuxForOracle.shtml
http://www.oracle-base.com/articles/linux/LargeSGAOnLinux.php

На данный момент init.ora выглядит так:

db_name = "main"
instance_name = main
service_names = main
global_names = false
control_files = ("/u02/oradata/main/control01.ctl", "/u02/oradata/main/control02.ctl", "/u02/oradata/main/control03.ctl")
background_dump_dest = /u01/admin/main/bdump
core_dump_dest = /u01/admin/main/cdump
user_dump_dest = /u01/admin/main/udump
utl_file_dir = /u01/admin/main/utl_file_dir
open_cursors = 10000
max_enabled_roles = 148
db_block_size = 8192
db_block_buffers = 110000
db_file_multiblock_read_count = 32
shared_pool_size = 700000000
large_pool_size = 614400
java_pool_size = 50000000
log_buffer = 163840
log_checkpoint_interval = 10000
log_checkpoint_timeout = 1800
processes = 600
timed_statistics = true
log_archive_start = true
log_archive_dest_1 = "location=/u02/arch/main"
log_archive_format = main%s.rdo
remote_login_passwordfile = shared
os_authent_prefix = ""
compatible = "8.1.0"
sort_area_size = 65536
sort_area_retained_size = 65536
job_queue_processes = 4


sysctl.conf выглядит так:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.shmmax = 4096000000
kernel.shmmni = 100
kernel.sem = 600 32000 100 128
fs.file-max = 131072


Необходимо увеличить db_block_buffers. На данном этапе даже при незначительном увеличении значения Oracle не стартует, выдает ошибку, будь она неладна:

SVRMGR> ORA-27123: unable to attach to shared memory segment
Linux Error: 22: Invalid argument
Additional information: 1
Additional information: 32768

Первым делом меняем ядро. По умолчанию используется 2.4.21-37.ELsmp (kernel-smp-2.4.21-37.EL)

Ставим ядро 2.4.21-37.ELhugemem (kernel-hugemem-2.4.21-37.EL)

До установки нового ядра /boot/grub/grub.conf выглядит так:

default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Enterprise Linux AS (2.4.21-37.ELsmp)
root (hd0,0)
kernel /boot/vmlinuz-2.4.21-37.ELsmp ro root=LABEL=/
initrd /boot/initrd-2.4.21-37.ELsmp.img
title Red Hat Enterprise Linux AS-up (2.4.21-37.EL)
root (hd0,0)
kernel /boot/vmlinuz-2.4.21-37.EL ro root=LABEL=/
initrd /boot/initrd-2.4.21-37.EL.img


После установки hugemem ядра он должен выглядеть так:

default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Enterprise Linux AS (2.4.21-37.ELhugemem)
root (hd0,0)
kernel /boot/vmlinuz-2.4.21-37.ELhugemem ro root=LABEL=/
initrd /boot/initrd-2.4.21-37.ELhugemem.img
title Red Hat Enterprise Linux AS (2.4.21-37.ELsmp)
root (hd0,0)
kernel /boot/vmlinuz-2.4.21-37.ELsmp ro root=LABEL=/
initrd /boot/initrd-2.4.21-37.ELsmp.img
title Red Hat Enterprise Linux AS-up (2.4.21-37.EL)
root (hd0,0)
kernel /boot/vmlinuz-2.4.21-37.EL ro root=LABEL=/
initrd /boot/initrd-2.4.21-37.EL.img


Следующее, что мы сделаем, это настроим параметры ядра для использования 4Gb для Oracle. Для этого отредактируем /etc/sysctl.conf так, чтобы он имел следующий вид:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
kernel.sysrq = 0
kernel.core_uses_pid = 1

kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.sem = 1000 150000 1000 150
fs.file-max = 131072


Тут заметил такой прикол :) На ядре hugemem с этими параметрами ядра oracle может выделить под SGA меньше оперативы, чем на ядре smp, хотя со слов Пушитса, ситуация должна быть обратной. Я себе чуть мозг не поломал, пока эту закономерность выяснил. Прикольно получается, пытаешься лучше сделать, а получается только хуже. То есть если вы делали все как я говорю, то на данном этапе вы в еще большей жопе, чем были в начале. А свет в конце туннеля еще впереди :)

Спустя неделю....

Этот туннель не для оптимистов.... Чем дальше, тем хуже. Ни на каком линуксе никаким способом сделать то, что хотелось не получилось...

Предположительно сделать это можно на винде 2000 или 2003 с PAE ядром.

Получилось только на Windows 2000 Advanced Server с указанием опции /PAE в boot.ini. Но при этом выделать много оперативы можно только под буферный кэш блоков данных, под shared pool выделить больше не получится, потому что он большую память не использует.

Вот така муйня, малята. Если есть возможность, меняйте 8-ю версию оракла на что-то более современное :) Иначе вам (и нам) удачи не видать...

Тема закрывается.


Читать далее

2011-08-16

Oracle 8.1.7.4 hot backup/restore

Админ оракла я уже много лет, но вот реализовать горячий бэкап при моих стажных пока не доводилось. Тупо не было смысла пока была возможность делать бэкапы холодные, такие любимые и проверенные временем, не требующие наличия бубна и заячьей лапки в некоторых случаях... Эх, было время. Но все растет все меняется, и вот наш бухгалтерский софт подвязали на текущий учет, а он, сука, работает круглосуточно. Всякие дядьки на подстанциях по ночам составляют планы и т.д. Ну а что еще делать ночью на подстанции где-нибудь в чигирях у черта на куличках, при наличии канала связи и куче свободного времени...


Итак, реализуем горячий бэкап и составляем механизм для восстановления из бэкапа...

Идея горячей резервной копии проста как валенок, при наличии соответствующих знаний :). Все происходит следующим образом:
1. С каждым табличным пространством поочередно проводится следующий набор операций:
-- табличное пространство переводится в режим горячего резервного копирования (после этого данные в него писаться перестают и пишутся только в журналы транзакций, до момента перевода в нормальный рабочий режим)
-- файлы данных табличного пространства копируются в место резервной копии
-- табличное пространство выводится из режима горячего резервного копирования
2. Производится принудительный переворот журналов транзакций
3. Делается резервная копия контрольных файлов 2-мя методами (trace, to file)
4. Делается резервная копия online redo log
5. Делается резервная копия archive redo log
6. Желательно сделать резервную копию конфигурационных файлов (init, orapwd, /etc, network/admin, скриптов резервного копирования и сбора статистики и т.д.)

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

Идея восстановления из горячей резервной копии просто как валенок с другой ноги, не той, которая была использована для понимания простоты создания резервной копии :) Тут последовательность действий следующая:
1. Все файлы из резервной копии раскладываются по местам. Что это за места такие вы, как создатель резервной копии должны быть в курсе. Если вы не создатель, применяйте мозг, все получится. Если вы не создатель, и мозга нет, то странно что вы вообще интересуетесь такими вопросами и читаете этот блог.
2. Контрольный файл забэкапленый to file плодим тупым копированием в соответствии со значениями, указаными в init файле.
3. открываем базу в nomount
4. Выполняем инструкции по созданию контрольных файлов из trace копии контрольных файлов.
5. Гасим базу immediate.
6. Запускаем в mount
7. Выполняем recover database
8. открываем базу.
9. для верочки еще можно ее перезапустить и увидеть, что все нормально заработало :)

Видите, все просто :):):)

Ну а теперь конкретно реализация скриптами.

Читать далее

2011-07-28

Массовая отправка прикрепов в linux

Очень легко можно ухоркать почтовик конторы в которой работаешь :). Так что детям до 18 лет и дебилам читать не рекомендуется, а использовать и подавно :)

Часто и густо бывает нужно отправить кучу вложений по почте.
Есть вариант поискать готовые решения, типа плагинов для Thunderbird или использовать TheBat!, но зачем, если в linux уже есть такая замечательная вещь, как mail. Разобравшись разок жить становиться гораздо проще.
Пишем скриптец, и выполняем его. Вот пример:


#!/bin/bash
mail -r otkogo@mail.ru -s "kovi.7z.001 of 012" -a kovi.7z.001 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.002 of 012" -a kovi.7z.002 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.003 of 012" -a kovi.7z.003 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.004 of 012" -a kovi.7z.004 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.005 of 012" -a kovi.7z.005 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.006 of 012" -a kovi.7z.006 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.007 of 012" -a kovi.7z.007 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.008 of 012" -a kovi.7z.008 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.009 of 012" -a kovi.7z.009 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.010 of 012" -a kovi.7z.010 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.011 of 012" -a kovi.7z.011 komu@rambler.ru < .
mail -r otkogo@mail.ru -s "kovi.7z.012 of 012" -a kovi.7z.012 komu@rambler.ru < .

Запустив его 100 раз подряд начинаем нервно ждать, пока тебя придет убивать сисадмин. А если ты и есть сисадмин, то лучше заранее подготовить набор серьезных отмазок для начальника о проблемах в работе почтовика :) Ну и вспомнить, на всякий случай, как удалять письма из очереди в MTA.


Читать далее

2011-06-15

Резервное копирование и восстановление ESXi

Самому пока ума не хватило, поэтому вот:

http://vforv.me/2010/12/25/backuprestore-esxi-серверов/

Процитирую, на случай, если ссылка устареет:

Одним из важных элементов администрирования ESXi серверов иметь план резервного копирования (Backup Plan) и восстановления (Recovery Plan). Сегодня хочу показать вам как делать бэкапы ESXi серверов используя vCLI (vSphere Command-Line Interface).

Конфигурация ESXi сервера хранится в архиве state.tgz что позволяет ей сохранятся после рестартов или в случае выключения сервера.

Бэкап ESXi сервера делается командой vicfg-cfgbackup из vCLI или же из vMA сервера.

vicfg-cfgbackup.pl –server имя_сервера –save путь_к_файлу

Вводим root и его пароль и бэкап начинается.

Бэкап успешно завершён.

Перейдём к восстановлению системы. Первое что надо это установить систему заново или же починить ее. Важно пропатчить систему чтоб она стала идентичной той которая она была когда мы брали бэкап или же во время восстановления использовать параметр –-force. Чтоб восстановить конфигурацию набираем:

vicfg-cfgbackup.pl – -server IP_Адрес –load Конфигурационный_Файл

Вот и все.

Есть один такой нюанс что если у вас бесплатная версия ESXi сервера вы сможете сделать бэкап системы но восстановить ее на бесплатную версию ESXi сервера к сожалению уже не получится. Это ограничение присутствует из-за того что в бесплатной версии ESXi сервера vSphere API работает в режиме read only, но всегда можно переустановить и в триальном режиме сервера восстановить конфигурацию. Так что так.


Читать далее

Перемещение виртуальной машины с одного ESXi на другой

"Верной дорогой идете, товарищи!!!", любил говаривать Владимир Ильич... Ну может не он, но кто-то из той эпохи. И путь виртуализации Вовчику Ленкиному понравился бы :)

Итак, тема эта у нас живет и пухнет. На данный момент 5 виртуальных серверов, на которых работает уже с десяток виртуальных машин. И вот проблема, которая возникла бы по любому - перенос виртуальной машины с одного сервера на другой.

Имеем VMWare ESXi 4.1 update 1

Поковыряв гугл минут 20 получил очень классный и вообще офигенно простой вариант:



1. Гасим виртуалку на старом ESXi.
2. Копируем папку с виртуальной машиной на новый ESXi (например при помощи Veeam Backup and FastSPC).
3. На новом ESXI открываем через vSphere Client хранилище (datastore), и находим в папке с виртуальной машиной файл с расширением vmx, кликаем правой кнопкой на нем, и выбираем "Add to Inventory".

Ха!!! Дальше сами догадайтесь, чего еще можно сделать чтоб у вас не получилось :)


Читать далее

2011-06-08

Восстановление Software RAID 1 на SLES9

Давно использую софтрэйд и вот первый раз у меня реальная проблема. Выгладит она так:

deimos:/proc # lsraid -a /dev/md0
[dev 9, 0] /dev/md0 D98A9487.3EE69195.E35737F7.76A313AC online
[dev ?, ?] (unknown) 00000000.00000000.00000000.00000000 missing
[dev 8, 33] /dev/sdc1 D98A9487.3EE69195.E35737F7.76A313AC good



deimos:/proc # mdadm -D /dev/md0
/dev/md0:
Version : 00.90.00
Creation Time : Thu Aug 17 16:16:53 2006
Raid Level : raid1
Array Size : 35543680 (33.90 GiB 36.40 GB)
Device Size : 35543680 (33.90 GiB 36.40 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Wed Jun 8 17:26:02 2011
State : clean, no-errors
Active Devices : 1
Working Devices : 1
Failed Devices : 1
Spare Devices : 0


Number Major Minor RaidDevice State
0 0 0 -1 removed
1 8 33 1 active sync /dev/sdc1
2 8 17 -1 faulty /dev/sdb1
UUID : d98a9487:3ee69195:e35737f7:76a313ac
Events : 0.269823066

deimos:/proc # cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdc1[1] sdb1[2](F)
35543680 blocks [2/1] [_U]

unused devices:


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

Кроме меня.

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

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

mdadm /dev/md0 -r /dev/sdb1

Перегружаемся и видим что яст его увидел (до перезагрузки не видел), что не может не радовать.
Пробуем добавить:

mdadm /dev/md0 -a /dev/sdb1

mdadm после этого покажет нам его как spare. Сначала меня это напугало, но глянув в /proc/mdstat увидел, что идет синхронизация массива:

deimos:~ # cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdc1[1] sdb1[2]
35543680 blocks [2/1] [_U]
[>....................] recovery = 0.1% (70528/35543680) finish=566.6min speed=1041K/sec
unused devices:

Так что все гуд.

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



Читать далее

2011-06-07

scp, ну как тут не применить :)

Почти 50 линуховых хостов по всей области, это вам не хухры-мухры. И часто нужно какую-то файловую мелкоту, типа логов и т.д. скопировать с линуха на линух. Не везде есть ftp, samba или nfs, зато везде есть ssh. И вот как просто можно обмениваться файлами имея только ssh и scp(не встречал еще ни одного дистра opensuse или debian где ее небыло бы). Итак...

Передаем файлик с хоста, где мы залогинены куда-нибудь далеко на другой хост:

scp 1.tar.gz alexsf@10.77.11.200:/zzz/alexsf/work/2011.06.06-res_performance/2011.06.07

И всех делов :)

С удаленного хоста себе файл забрать не залогиниваясь на него так:

scp alexsf@10.77.11.200:/zzz/alexsf/work/2011.06.06-res_performance/2011.06.07/1.tar.gz /u02/work

Простота линуха радует :)
Читать далее

2011-03-31

Оптимизация производительности PostgreSQL

Появилась у нас в конторе мегапрограмма по оперативному учету. Программеры ее уже год как ваяют, практически все работники конторы в ней заняты, без нее в облэнерго сейчас жизни нет. Не работает программа - контора в определенном смысле парализована.
Сейчас в системе около 700 пользователей, при этом активных бывает до 100 рыл.
Естественно вопрос производительности сейчас первостепенный (если считать с нуля, то задача номер 0 отказоустойчивость будет решена в ближайшее время). Моя задача как админа выжать все возможное из базы данных. Это PostgreSQL версии 8.2, с которого сейчас осуществляется тестовая миграция на 9.0.
Здесь будет приведен файл параметров postgresql.conf с расширенными комментариями по каждому пункту.
Установка каждого параметра выбиралась исходя из существующего опыта эксплуатации, исследования открытых источников, как минимум 3-х, официальной документации, а также тестов производительности приложения на сервере в максимально идентичными настройками БД 8.2. и 9.0.


#########################################################
# Файл параметров PostgreSQL postgresql.conf
# Попытка заставить базу EnergyNET летать соколом.
# Указаные настройки подразумевают, что на сервере, где
# крутится PostgreSQL никого кроме него нет, не считая
# операционной системы.
#########################################################

# shared_buffers
#
# Смысл параметра: PostgreSQL не читает данные напрямую
# с диска и не пишет их сразу на диск. Данные загружаются
# в общий буфер сервера, находящийся в разделяемой памяти,
# серверные процессы читают и пишут блоки в этом буфере,
# а затем уже изменения сбрасываются на диск.
# Если процессу нужен доступ к таблице, то он сначала
# ищет нужные блоки в общем буфере. Если блоки
# присутствуют, то он может продолжать работу, если
# нет — делается системный вызов для их загрузки.
# Загружаться блоки могут как из файлового кэша ОС, так и
# с диска, и эта операция может оказаться весьма «дорогой».
# Если объём буфера недостаточен для хранения часто
# используемых рабочих данных, то они будут постоянно
# писаться и читаться из кэша ОС или с диска, что крайне
# отрицательно скажется на производительности.
# Принцип таков, что значение параметра устанавливаем
# в размере 25-40% от оперативной памяти. От версии
# PostgreSQL не зависит.
#
shared_buffers = 500MB # 2GB ОЗУ
#shared_buffers = 3000MB # 12GB ОЗУ

# temp_buffers
#
# Смысл параметра: Максимальное количество памяти, выделяемой
# каждой сессии для работы с временными таблицами.
# Необходимо помнить, что как только сессия заняла размер,
# указанный в temp_buffers, эта память не освобождается,
# пока сессия не завершится. На системах с большим
# количеством одновременно работающих пользователей
# некорректное (завышенное) значение этого параметра
# запросто может привести к бешеному свопу, и как
# следствие, краху операционной системы. А если при
# этом еще и fsync = off, то готовьтесь восстанавливать
# базу из резервных копий.
# У нас временные таблицы не используются, так что
# можно оставить значение по умолчанию. То есть
# вообще удалить из postgresql.conf
#
temp_buffers = 8MB

# max_prepared_transactions
#
# Смысл параметра: устанавливает максимальное количество
# PREPARED TRANSACTION которые могут устанавливаться в
# состояние prepared единовременно.
# У нас 98% всех транзакций - PREPARED.
# Минимально необходимое значение параметра = max_connections
#
max_prepared_transactions = 600

# work_mem
#
# Смысл параметра: Задаёт объём памяти, который используют
# внутренние операции сортировки и хэш-таблицы перед тем
# как перейти на использование временных файлов на диске.
# Если объём памяти недостаточен для сортироки некоторого
# результата, то серверный процесс будет использовать
# временные файлы. Если же объём памяти слишком велик,
# то это может привести к своппингу.
# В сложном запросе параллельно может быть запущено несколько
# операций сортировки и хэширования, и каждая может занять
# столько памяти, сколько задано в этом параметре, прежде
# чем начнет использовать временные файлы. Кроме того, эти
# операции могут одновременно выполняться в нескольких сессиях.
# Таким образом, используемая память может оказаться в несколько
# раз больше, чем work_mem. Операции сортировки используются
# для ORDER BY, DISTINCT и операций соединения методом
# слияния (merge joins). Хэш-таблицы используются при
# операциях соединения методом хэширования (hash joins),
# операциях аггрегирования, основанных на хэшировании и
# обработке IN-подзапросов на основе хэширования.
# Своими словами: если некая операция из перечисленных выше требует
# для выполнения больше памяти, чем указано в параметре work_mem,
# для этой операции будет создан временный файл в каталоге pgsql_tmp
# соответствующей БД. Так что оценить, какой объем необходимо задать
# данному параметру можно просто влянув в этот каталог в пиковые
# часы нагрузки. Если суммарный объем созданных там файлов поместится
# в оперативную память и останется хотя-бы 30% резерва, с учетом
# остальных работающих на сервере задач, то можно задавать значение, равное
# размеру примерно одинаковых по объему файлов. Тут конечно тоже без
# фанатизма, ибо если временный файл больше 100 метров, то нужно
# трижды подумать...
#
work_mem = 32MB

# autovacuum
#
# Смысл простой - выполнение процессов VACUUM в автоматическом
# режиме во время работы сервера.
# У нас VACUUM и ANALYZE будут выполняться ночью
# через CRON, так что включать автовакуум не будем.
# Ну незачем нам еще и в рабочее время систему
# нагружать некритичными вещами.
#
autovacuum = off

# effective_io_concurrency
#
# Смысл параметра: Задаёт число операций чтения/записи на
# диск, которые по мнению PostgreSQL могут выполняться
# одновременно. Увеличение этого значения может повысить
# число операций ввода/вывода, которое любая сессия
# PostgreSQL может попытаться выполнить параллельно.
# Допустимые значения лежат в диапазоне от 1 до 1000,
# либо 0, если вы хотите запретить выполнение асинхронных
# операций ввода/вывода.
# Для оценки необходимого значения этого параметра можно
# начать с числа отдельных устройств, включая RAID 0
# или RAID 1, используемых базой данных. Для RAID 5
# чётность устройств не учитывается. Однако, если база
# данных часто занята множеством запросов, получаемых от
# различных одновременных сессий, даже низкие значения
# могут держать занятым дисковый массив. Значение выше
# необходимого для поддержания занятости дисков приведёт
# только к дополнительной загрузке процессора.
# По простому, ставим значение параметра в число,
# равное количеству шпинделей в дисках, на
# которых расположена база данных. Потом пробуем уменьшить
# или увеличить, и оцениваем результат при каждом изменении
# параметра. Вообще параметр новый, малоопробованый,
# рекомендаций мало. Так что будем тестировать.
#
effective_io_concurrency = 4 # 4 диска в RAID10

# fsync
#
# Смысл параметра: Данный параметр отвечает за сброс данных
# из кэша на диск при завершении транзакций. Если
# установить его значение fsync = off то данные не будут
# записываться на дисковые накопители сразу после завершения
# операций. Это может существенно повысить скорость
# операций insert и update, но есть риск повредить базу,
# если произойдет сбой (неожиданное отключение питания,
# сбой ОС, сбой дисковой подсистемы).
# Самый сука стремный параметр. Если есть возможность,
# ВСЕГДА используйте fsync = on. Если с производительностью
# жопа, то при значении off большую часть проблем можно
# порешать. Вот такая неоднозначная хрень. На винде
# желательно его не выключать в следствии глючности самой
# винды.
# Если fsync = off, то обязательно установить
# full_page_writes = off
# Если fsync = on, а с производительность проблемы, то
# лучше поиграться с synchronous_commit, но fsync не
# трогать.
#
fsync = on

# full_page_writes
#
# Смысл параметра: Если этот параметр включен, сервер
# PostgreSQL пишет весь контент каждой страницы диска в WAL
# во время первого изменения этой страницы после контрольной
# точки. Это необходимо, поскольку если в процессе записывания
# страницы произойдет системный сбой, на диске может оказаться
# страница, в которой смешаны старые и новые данные. Изменения
# на уровне строк данных, которые обычно хранятся в WAL, может
# быть не достаточно для восстановления страницы после
# системного сбоя. Хранение образа всей страницы гарантирует,
# что страница будет восстановлена правильно, но это будет
# стоить увеличения количества данных, которые нужно будет
# занести в WAL. (Так как чтение WAL всегда начинается с
# контрольной точки, удобно делать это при первом изменении
# каждой страницы после контрольной точки. Таким образом,
# одним из способов уменьшения стоимости записи страниц
# является увеличение интервала между контрольными точками.)
# Отключение этого параметра ускоряет работу, но может привести
# к повреждению базы данных в случае системного сбоя или
# отключения питания. Риски схожи с отключением fsync, хотя в
# данном случае они меньше.
#
full_page_writes=on

# synchronous_commit
#
# Смысл параметра: Определяет, должна ли транзакция ждать,
# пока записи WAL будут перенесены на диск, прежде чем команда
# вернёт клиенту сообщение об успешном выполнении. По
# умолчанию и с точки зрения безопасности этот параметр должен
# быть включен. Если параметр выключен, возможен промежуток
# времени между сообщением об успешном выполнении транзакции
# и моментом, когда транзакция на самом деле защищена от сбоя
# на сервере. В отличие от fsync, отключение этого параметра
# не может привести к риску противоречия в базе данных: сбой
# может привести к потере последних прошедших транзакций, но
# состояние базы данных при этом будет таким, как будто эти
# транзакции просто были прерваны. Таким образом, отключение
# synchronous_commit может оказаться полезным, если
# производительность важнее, чем точность в проведении
# транзакций.
#
synchronous_commit = off

effective_cache_size: указывает планировщику на размер самого большого объекта в базе данных, который теоретически может быть закеширован. На выделенном сервере имеет смысл выставлять effective_cache_size в 2/3 от всей оперативной памяти; на сервере с другими приложениями сначала нужно вычесть из всего объема RAM размер дискового кэша ОС и память, занятую остальными процессами.



Читать далее

2011-03-24

LogMnr Oracle8i

Иногда бывает потребность проанализировать содержимое журналов транзакций oracle8i (ну используется у нас до сих пор это старье). Вот напоминалка.


execute dbms_logmnr_d.build('log_dict.txt','/u01/admin/main/utl_file_dir');

EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192880.rdo', -
OPTIONS => dbms_logmnr.NEW);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192881.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192882.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192883.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192884.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192885.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192886.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192887.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192888.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192889.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192890.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192891.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192892.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192893.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192894.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192895.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192896.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192897.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192898.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192899.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192900.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => '/u01/admin/main/utl_file_dir/main192901.rdo', -
OPTIONS => dbms_logmnr.ADDFILE);


execute dbms_logmnr.start_logmnr( -
dictfilename=>'/u01/admin/main/utl_file_dir/log_dict.txt', -
starttime=>to_date('18-03-2011:12:10','DD-MM-YYYY:HH24:MI'), -
endtime=>to_date('18-03-2011:12:20','DD-MM-YYYY:HH24:MI'));


Читать далее

2011-01-19

Оптимизируем использование swap в linux

Постоянная проблема с производительностью на моей машине заключается в том, что linux (openSUSE 11.3) начинает использовать swap даже когда достаточно ресурсов оперативы. Умные люди подсказали, как можно эту ситуацию немного исправить:


В /etc/sysctl.conf добавляем строку

vm.swappiness = 10

Перегружаемся. Или если не хотим, то в консоли под root выполняем:

sysctl vm.swappiness=10

По умолчанию у меня этот параметр имел значение 60, то есть использование свапа системой допускалось уже при загрузке памяти всего на 40%.

Насчет использования этой штуки на серверах - надо думать...


Читать далее