пятница, 10 сентября 2010 г.

Изменение hostid для Solaris 10 глобальной/неглобальной зоны и Solaris 8/9 контейнеров.

В Solaris 10 вы не можете изменить идентификатор host ID, не делая некоторые крупные замены аппаратных средств. В этой статье приводятся методы, позволяющие это сделать. Некоторые приложения, лицензированные к конкретному hostid, не будут работать, если их установить на другом сервере.

Однако вы можете указать пользовательский hostid на Solaris 8 или 9 контейнеров (не глобальной зоне), запущенных на Solaris 10 глобальной зоны. Это может быть сделано с помощью команды zonecfg -z. Инструкции по изменению hostid для Solaris 10 глобальных и неглобальных зон в нижней части этой статьи.

globalserver# zonecfg -z myzone1
zonecfg:myzone1> add attr
zonecfg:myzone1:attr> set name=hostid
zonecfg:myzone1:attr> set type=string
zonecfg:myzone1:attr> set value=”123456″
zonecfg:myzone1:attr> end
zonecfg:myzone1> exit

Остановить myzone1
globalserver# zonecfg -z myzone1 halt
Запустить myzone1
globalserver# zonecfg -z myzone boot

Проверить статус myzone1
globalserver# zonecfg list -vc

Залогиниться в консоль myzone1 и проверить hostid
globalserver@ zlogin -C myzone1

После ввода логина и пароля, запустить hostid.
# hostid
123456


Изменение hostid для Solaris 10 глобальных и неглобальных зон.

Здесь приводится небольшой скрипт, найденный на просторах интернета, который может быть использован для изменения hostid для Solaris 10 глобальных и неглобальных зон. Этот скрипт должен выполняться как процесс в фоновом режиме. Убийство этого процесса вернёт hostid к первоначальному значению, заложенному в оборудование. Вырезать и вставить нижеприведённый скрипт в файл с именем zhostid, сделать файл исполняемым. Измените следующие строки с идентификаторами, указав нужные.
global 12345678
myzone1 90abcdef

#!/usr/bin/ksh
#
# zhostid - demo changing hostids for Solaris Zones.
# Written using DTrace (Solaris 10 3/05).
#
# WARNING: This is a demonstration of DTrace, it is not intended as a
# standard daemon. In particular, hostids are used by Sun to track support
# calls, so changing hostids may make life somewhat confusing for all.
#
# 21-Jun-2005, ver 0.70 (first release)
#
# USAGE: zhostid &
#
# Edit the "Configuration" section below to set the zones and
# hostids to what is desirable.
#
# BASED ON: hostid.d by Iain Hayes, and idea by Jon Haslam.
#
# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# (http://www.gnu.org/copyleft/gpl.html)
#
# 21-Jun-2005 Brendan Gregg Created this.

#
# Configuration
#
hostids='
global 12345678
myzone1 90abcdef

' # simply modify the above by adding extra lines for each zone.

#
# Check hostids
#
print "$hostids" | while read zone hostid_hex; do
### Sanity check hostid
if [[ "$zone" == "" || "$zone" == "#" ]]; then continue; fi
if [[ "$hostid_hex" == *[g-zG-Z]* ]]; then
print "ERROR2: Invalid hostid $hostid_hex. "
print "Please use hexadecimal.\n"
exit 2
fi
if (( ${#hostid_hex} > 11 )); then
# see /usr/src/uts/common/conf/param.c for limit.
print "ERROR3: Length of hostid $hostid_hex too long. "
print "Limit 11 chars.\n"
exit 3
fi

### Convert hostid to decimal
typeset -i10 hostid_dec
hostid_dec=16#$hostid_hex

### Build DTrace code
body="$body
syscall::systeminfo:return
/zonename == \"$zone\" && self->command == 7/
{
copyoutstr(\"$hostid_dec\", self->buffer, 11);
}"
done

#
# Run DTrace
#
exec /usr/sbin/dtrace -n '

#pragma D option destructive
#pragma D option quiet
#pragma D option bufsize=32k

inline string hostid = "'$hostid_dec'";

syscall::systeminfo:entry
{
self->command = arg0;
self->buffer = arg1;
}

'"$body"'

syscall::systeminfo:return
{
self->command = 0;
self->buffer = 0;
}
'


Теперь запустите файл zhostid в фоновом режиме в качестве процесса. Этот файл должен быть запущен из глобальной зоны.

globalserver# ./zhostid &


Проверьте hostid

globalserver# hostid
12345678


Залогиньтесь в консоль myzone1

# zlogin myzone1
[Connected to zone 'myzone1' pts/10]
Last login: Tue Jun 21 03:51:10 on pts/10
Sun Microsystems Inc. SunOS 5.10 Generic January 2005 myzone1

# hostid
90abcdef




четверг, 22 июля 2010 г.

Использование ulimit для контроля ресурсов. (linux limit kernel)

Рассмотрим использование ulimit на примере ограничений пользователя worker

Итак, добавим в конец /etc/profile:

if [ "$USER" = "worker" ]; then

ulimit -c 0 # Запрещаем создавать core файлы
ulimit -d 48000 # Ограничиваем максимальный размер сегмента данных в 48 MB
ulimit -s 8192 # Ограничиваем максимальный размер стэка в 8 MB
ulimit -m 48000 # Ограничиваем максимальный размер резидентной части процесса (находящейся в ОЗУ) в 48 MB
ulimit -u 64 # Ограничиваем максимальное число запущенных этим пользователем процессов.
ulimit -n 128 # Ограничиваем максимальное число открытых файлов.
ulimit -f 100000 # Ограничиваем максимальный размер создаваемого файла в 100 MB
ulimit -v 100000 # Ограничиваем максимальный размер используемой виртуальной памяти в 100 MB
fi

Для просмотра текущих установок нужно набрать ulimit -a


Либо можно сделать так: например, ограничения на кол-во процессов делается с помощью PAM:
/etc/security/limits.conf
+
"session required /lib/security/pam_limits.so"
в /etc/pam.d/login
Может попробовать и тебе так сделать (/etc/security/limits.conf):
* soft nproc 2048




Источник http://opennet.ru/base/sys/ulimit_mc.txt.html

Apache. Ограничение ресурсов.

Следующие опции могут употребляться для ограничения возможности DoS-атак против Web-сервера:

  • MaxClients <число> - задает максимальное число клиентов, которые могут работать с сервером вместе. Иногда запросов настолько много, что у компьютера не хватает памяти для загрузки дополнительных копий Web-сервера для обслуживания запросов клиентов. Эта директива дает возможность ограничить максимальное число клиентов. Значение по умолчанию 150, тоже рекомендуется применять или это значение, или значение из диапазона 100-200. Если ограничение будет превышено, новые клиенты получат сообщение Connection Refused.
  • RLimitCPU <мягкий> [жесткий] - устанавливает лимит на употребление процессорного времени. Значения лимита задаются в секундах. Разрешается применение значения max, что означает максимальную загрузку процессора.
  • RLimitMEM <мягкий> [жесткий] - устанавливает лимит на применение сервером памяти, в байтах.
  • RLimitNPROC <мягкий> [жесткий] - задает ограничение на количество порожденных сервером процессов.
  • LimitRequestBody - задает максимально допустимый размер HTTP-запроса. Надо применять любое значение: от 0 (неограниченный) до 2.147.483.647 (2. Гб). Если это значение превышено, клиенту будет возвращено сообщение об ошибке. Нужно помнить, что если используются CGI-скрипты для загрузки файлов на сервер, то размер запроса может достигать несколько мегабайтов.
  • LimitRequestFields - максимальное число полей заголовка HTTP-запроса. Допустимыми являются значения от 0 (не ограничено) до 32767.
  • LimitRequestFieldSize - максимальный размер поля заголовка запроса, в байтах. Допустимыми являются значения от 0 (не ограничено) до 8190 (около 8 Кб).
  • LimitRequestLine - максимальный размер строки HTTP-запроса. Не надо устанавливать слишком маленькое значение, так как тогда перестанут работать многие CGI-скрипты, использующие метод GET. Допустимыми являются значения от 0 (не ограничено) до 8190 (около 8 Кб).
Источник http://suvan.ru/page/apache-sokrytie-versii.html

вторник, 20 июля 2010 г.

linux, мониторинг, производительность

hdparm -t -T /dev/sda1 – дисковая производительность
stat -f / – количество занятых/свободных блоков/инодов
iostat -m -x sda 2 6 – смотрим загрузку указанного диска (пакет sysstat)
vmstat -S M 2 50 – смотрим статистику/потребление по ресурсам
free -m (колонка cache – память занятая под кэш ФС)
cat /proc/meminfo
cat /proc/cpuinfo
cat /proc/interrupts – кто генерит больше прерываний
cat /proc/net/dev – передано через интерфейс в байтах
cat /proc/sys/fs/file-max – макс. допустимое количество откр. файлов (sysctl -w fs.file-max=”16384″)
cat /proc/sys/fs/file-nr
nload – графический мониторинг трафика
fdisk -l – информация о дисках и разделах
top, 1 – распределение нагрузки по ядрам
netstat -s # статистика по сети. Например, netstat -s |grep establish текущее количество установленных соединений
ethtool eth0 # информация о режимах работы поддерживаемых сетевой картой, о текущих режимах и параметрах

Взято здесь http://unix-notes.ru/2008/12/09/linux-monitoring-proizvoditelnost/

четверг, 29 апреля 2010 г.

Копирование файловых систем гостевых машин в XEN на другую машину

Не следует использовать rsync для копирования файловой системы с одного компьютера на другой. Нужно использовать dd:

# dd if=/dev/vgxen/lvol0 | ssh dd of=/dev/vgxen/lvol0

Network Latency имеет отрицательное значение в гостевой системе Windows XEN при CPU>1

Латентность сети может иметь отрицательные значения в гостевой системе Windows XEN при установленном количестве процессоров больше 1.
Например, пинг с данной машины до удалённого хоста может иметь такой вид:

>ping 192.168.2.1
Reply from 192.168.2.1: bytes=32 time=-7639ms TTL=64

Для решения данной проблемы необходимо добавить параметр /usepmtimer в C:\boot.ini в гостевой ОС Windows и перегрузить её.

Данная проблема описана в Microsoft Support article number 895980 - http://support.microsoft.com/kb/895980.

Настройка времени в гостевых паравиртуализированных системах XEN (или корректировка времени в гостевых системах).

В ситуации когдя время в гостевых паравиртуализированных машинах рассинхронизируется от хостовой машины, выставить его вручную или через службу NTP не получается. Т.е. время управляется гипервизором XEN для всех гостевых машин.
Можно выставить собственное управление часами в гостевой машине. Для этого нужно выставить параметр xen.independent_wallclock в 1 в /etc/sysctl.conf
Пример:

xen.independent_wallclock = 1

Затем выполнить

#echo 1 > /proc/sys/xen/independent_wallclock

Теперь в гостевой системе можно выставлять автономное время вручную или через NTP
(Данный механизм не подходит для полной виртуализации гостевых систем)

среда, 31 марта 2010 г.

Перенос LOBSEGMENT и LOBINDEX в другой Tablespace.

Данный скрипт генерирует код, который нужно выполнить для переноса LOBSEGMENT и LOBINDEX в другой Tablespace.

DECLARE
V_OLD_TABLESPACE VARCHAR2(100):='USERS';
V_NEW_TABLESPACE VARCHAR2(100):='TEMP';
BEGIN
FOR XX IN (
SELECT L.TABLE_NAME, L.COLUMN_NAME, L.INDEX_NAME
FROM USER_LOBS L, USER_SEGMENTS S
WHERE (S.SEGMENT_NAME=L.SEGMENT_NAME) AND (S.TABLESPACE_NAME=V_OLD_TABLESPACE)) LOOP
DBMS_OUTPUT.PUT_LINE('ALTER TABLE '||XX.TABLE_NAME||' MOVE LOB('||XX.COLUMN_NAME||')
STORE AS (TABLESPACE '
||V_NEW_TABLESPACE||' INDEX '||XX.INDEX_NAME||'(TABLESPACE '||
V_NEW_TABLESPACE||' STORAGE (MAXEXTENTS UNLIMITED)));');
END LOOP;
END;

Пример результата работы данного скрипта:

ALTER TABLE QUERY_TBL MOVE LOB(QUERY_TEXT) STORE AS
(TABLESPACE TEST INDEX SYS_IL0000049532C00011$(TABLESPACE TEST
STORAGE (MAXEXTENTS UNLIMITED)));
ALTER TABLE QUERY_PARM_TBL MOVE LOB(QUERY_PARMS) STORE AS
(TABLESPACE TEST INDEX SYS_IL0000049553C00003$(TABLESPACE TEST
STORAGE (MAXEXTENTS UNLIMITED)));
ALTER TABLE OFS_ITEMS MOVE LOB(DATA) STORE AS (TABLESPACE TEST
INDEX SYS_IL0000177335C00011$(TABLESPACE TEST
STORAGE (MAXEXTENTS UNLIMITED)));
После этого сделать rebuild индексов (в данном случае, в таблицах QUERY_TBL, QUERY_PARM_TBL,
OFS_ITEMS).

Найдено на просторах www.sql.ru

вторник, 30 марта 2010 г.

Уменьшение размера tablespace в Oracle.

После чистки таблиц в базе, а затем выполнения их дефрагментации, высвободилось достаточно много свободного места в табличном пространстве. В итоге 24 datafile's размером по 32Гб каждый получились заняты процентов по 20-25%. Решено было уменьшить размеры самих datafile's, чтобы освободить место на файловой системе.

Размеры tablespace's можно посмотреть так:

select a.tablespace_name ,
round(a.bytes_alloc / 1024 / 1024, 2) m_alloc,
round(nvl(b.bytes_free, 0) / 1024 / 1024, 2) m_free,
round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024, 2) m_used,
round(maxbytes/1048576,2) Max
from ( select f.tablespace_name,
sum(f.bytes) bytes_alloc,
sum(decode(f.autoextensible, 'YES',f.maxbytes,'NO', f.bytes)) maxbytes
from dba_data_files f
group by tablespace_name) a,
( select f.tablespace_name,
sum(f.bytes) bytes_free
from dba_free_space f
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name (+);


Результат выглядит примерно так:





Здесь видно, что USERS занимает 618Gb, а использует 129Gb. Посмотрим до какого размера можно сжать tablespace.

select dba_data_files.file_name,
dba_data_files.file_id,
dba_data_files.tablespace_name,
ceil((nvl(hwm, 1) * db_block_size) / 1024 / 1024) smallest,
ceil(blocks * db_block_size / 1024 / 1024) currsize,
ceil(blocks * db_block_size / 1024 / 1024) -
ceil((nvl(hwm, 1) * db_block_size) / 1024 / 1024) savings
from dba_data_files,
(select file_id,
max(block_id + blocks - 1) hwm
from dba_extents
group by file_id) b,
(select value db_block_size from v$parameter where name = 'db_block_size') c
where dba_data_files.file_id = b.file_id(+);


Результат:





Там, где есть возможность уменьшить размер datafale's - уменьшаем. Т.е. datafile
E:\ORACLE\DATA\DSAUDIT\USERS19.DBF можно уменьшить до 6200Мб.

Пример:

SQL>alter database datafile 'E:\ORACLE\DATA\DSAUDIT\USERS19.DBF' resize 6200M;

Остальные datafile's уменьшить не получается, т.к. в них данные раскиданы по всему пространству. А это значит, что таблички нужно переносить в другой tablespace. Можно перенести все сразу таблички, уменьшить размер, и вернуть таблички на место. А можно найти объекты, которые раскиданы по tablespace, и переместить только их.
select dba_extents.owner,
dba_extents.segment_name,
dba_extents.segment_type,
dba_extents.tablespace_name,
dba_extents.file_id,
dba_extents.block_id
from dba_extents,
(select file_id,
max(block_id) max_block_id
from dba_extents
group by file_id) b
where dba_extents.file_id = b.file_id and
dba_extents.block_id = b.max_block_id;

Результат:





Для переноса таблицы в другой tablespace:

SQL>alter table PINECONE.QUERY_TABLE_TBL move tablespace TEST;

Затем в перенесённой таблице необходимо сделать rebuild индексов.
Посмотрим какие индексы есть в таблице

SQL>SELECT STATUS, INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'QUERY_TABLE_TBL';

STATUS INDEX_NAME
-------- ------------------------------
UNUSABLE QTT_OWNER_NAME

И делаем непосредственно ребилд

SQL> ALTER INDEX SYS_C005185 REBUILD;

Проверяем

SQL>SELECT STATUS, INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'QUERY_TABLE_TBL';

STATUS INDEX_NAME
-------- ------------------------------
VALID QTT_OWNER_NAME

Для переноса индексов в другой tablespace:

SQL>alter index PINECONE.SYS_C005180 rebuild tablespace TEST;

Также определяем и переносим другие таблички или индексы,и пробуем снова уменьшить tablespace.

Определяем объекты, находящиеся в корзине:

select decode(partition_name, null,
segment_name,
segment_name || ':' || partition_name) objectname,
segment_type object_type,
owner,
tablespace_name,
header_block
from dba_segments
where tablespace_name = 'PINECONE' and
segment_name like 'BIN$%';
И удаляем их, например так:

SQL>purge table PINECONE."BIN$0IlaH5/6SyGv+h8B8BzJzQ==$0";

Уменьшаем tablespace.

SQL>alter database datafile 'F:\ORACLE\DATA\DSAUDIT\USERS23.DBF' resize 10M;
...
...
...
В итоге получилось так:
Теперь переносим таблицы и индексы обратно.

Составлено на основе материалов http://all-oracle.ru, http://ora-20000.blogspot.com/2009/04/tablespace.html 

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

Как обрезать errorlog не останавливая сервер Sybase ASE.

Способы выполнения этой задачи зависят от версии ASE и платформы, на которой он работает.

Unix-подобные системы.
Здесь стандартный способ обрезать открытый другим процессом - это скопировать в него файл /dev/null. Т.е. :

cat /dev/null > /opt/sybase/YOUSERVERLOG.log

В вашей системе путь к файлу лога может быть другим.
Для выполнения этой команды из ASE можно воспользоваться системной процедурой xp_cmdshell.
Надо также заметить что в силу особенностей работы файловой подсистемы этих ОС, удаление файла лога или переименование пустого файла в файл лога не поможет - ASE будет все так же писать в свой старый файл.

Win32 (все Windows-ы)
Лог может быть обрезан открытием файла лога в редакторе Notepad, удалением всех строк и сохранением его. На самом деле конечно это может быть любой редактор, который не открывает файл в монопольном режиме для чтения и записи.
Кроме того, нужно отметить, что все особенности файловой системы Unix-подобных систем присущи и файловой системе NTFS, так что трюк с cat /dev/null > yourlog
также работает. Утилиту cat можно взять например в пакете CygWin.

Начиная с ASE 12.5 лог можно привязать к прокси-таблице ( в 12.5 появилась возможность делать прокси-таблицы на файлы ОС ) и тогда лог очищается коммандой

SQL>truncate table MYERRORLOG

где MYERRORLOG - прокси-таблица, привязанная к файлу лога ASE.
Этот способ работает на всех платформах, где работает ASE.

Создание копии MBR.

Создание копии MBR

dd if=/dev/sda of=mbr.img bs=446 count=1

Создание копии MBR+таблица разделов

dd if=/dev/sda of=mbr.img bs=512 count=1

Для восстановления параметры if и of поменять местами.

пятница, 19 марта 2010 г.

Пропадает место на разделе (Linux&unix).

Если команда df -h показывает заполненный раздел (например /var), а du -s /var выдаёт гораздо меньший размер, значит какие-то процессы "держат" удалённые файлы.

Получить список удалённых файлов и "держащих" их процессов можно командой
lsof | grep deleted

К сожалению lsof далеко не всегда показывает правильно статус (deleted), в таком случае можно проверить на существование все выданные им пути к файлам. Топорный способ:
lsof | grep REG| awk '{print $9}' | xargs ls -l >/dev/null

lsof в первую очередь вам выдал процессы, которые эти файлы держат, а также размеры файлов. Дальше виновнику посылка сигнала HUP или действие стартового скрипта reload. Ну а если не поможет, то stop/start. Перезагружать всю машину нет никакого смысла.

Фрагментация таблиц в Oracle.

1. Для начала посмотрим размер таблицы(с фрагментацией)

SQL> SELECT TABLE_NAME, ROUND((BLOCKS*8),2)||'KB' "SIZE"
FROM USER_TABLES
WHERE TABLE_NAME = 'SESSION_TBL';

TABLE_NAME SIZE
------------------------------ ------------------------------------------
SESSION_TBL 7497760KB

2. Определим реальный размер данных

SQL> SELECT TABLE_NAME, ROUND((NUM_ROWS*AVG_ROW_LEN/1024),2)||'KB' "SIZE"
FROM USER_TABLES
WHERE TABLE_NAME = 'SESSION_TBL';

TABLE_NAME SIZE
------------------------------ ------------------------------------------
SESSION_TBL 4032361,52KB


В итоге 7497760KB - 4032361KB = 3465399 KB используется без толку.
В процентном соотношении 46% занятого пространства не используется.

3. Для удаления фрагментации потребуется реорганизовать таблицу.
Есть несколько опций для реорганизации фрагментированных таблиц.
Рассмотрим один вариант - перенос таблицы и пересоздание индексов.

4. Посмотрим какие индексы имеются в данной таблице

SQL> SELECT STATUS, INDEX_NAME FROM USER_INDEXES
WHERE TABLE_NAME = 'SESSION_TBL';

STATUS INDEX_NAME
-------- ------------------------------
VALID SYS_C005180
VALID ST_LCL_SES_STRT_TS

5. Начинаем. Необходимо, чтобы в tablespaces имелось свободное место.

SQL> ALTER TABLE SESSION_TBL MOVE;

Table altered.

6. Проверим индексы.

SQL> SELECT STATUS, INDEX_NAME FROM USER_INDEXES
WHERE TABLE_NAME = 'SESSION_TBL';

STATUS INDEX_NAME
-------- ------------------------------
UNUSABLE SYS_C005180
UNUSABLE ST_LCL_SES_STRT_TS

7. Пересоздаём индексы.

SQL> ALTER INDEX SYS_C005180 REBUILD;

Index altered.

SQL> ALTER INDEX ST_LCL_SES_STRT_TS REBUILD;

Index altered.

8. Проверяем.

SQL> SELECT STATUS, INDEX_NAME FROM USER_INDEXES
WHERE TABLE_NAME = 'SESSION_TBL';

STATUS INDEX_NAME
-------- ------------------------------
VALID SYS_C005180
VALID ST_LCL_SES_STRT_TS

8. Собираем статистику.

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('workusers','SESSION_TBL');

PL/SQL procedure successfully completed.

9. Проверяем размеры данных в даблице и размер самой таблицы.

SQL> SELECT TABLE_NAME, ROUND((BLOCKS*8),2)||'KB' "SIZE"
FROM USER_TABLES
WHERE TABLE_NAME = 'SESSION_TBL';

TABLE_NAME SIZE
------------------------------ ------------------------------------------
SESSION_TBL 4780632KB

SQL> SELECT TABLE_NAME, ROUND((NUM_ROWS*AVG_ROW_LEN/1024),2)||'KB' "SIZE"
FROM USER_TABLES
WHERE TABLE_NAME = 'SESSION_TBL';

TABLE_NAME SIZE
------------------------------ ------------------------------------------
SESSION_TBL 4032361,52KB

В итоге 4780632KB - 4032361KB = 748271KB


Т.е. освободилось 36% от ранее занятого таблицей пространства.

Составлено на основе материалов http://all-oracle.ru