Тестирование производительности Оракла на виртуальном кластере: VirtualBox и SwingBench

THE HOLY BIBLE - King James Version - БИБЛИЯ в Синодальном переводе
"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу

Тестирование производительности Оракла на виртуальном кластере: VirtualBox и SwingBench.

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

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

Swingbench имеет несколько встроенных вариантов сценариев, которые можно использовать без изменений или подстраивать под свою задачу. Чаще всего я изменяю так называемое "Время реакции пользователя" (Think Time) и варьирую процентное соотношение различных DML (Update, Insert, Select, Delete).

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

Прежде чем мы продолжим, я хотел бы привести строки из Евангелия:



Послание к Титу святого апостола Павла, 2:11-14

Ибо явилась благодать Божия, спасительная для всех человеков,
научающая нас, чтобы мы, отвергнув нечестие и мирские похоти,
целомудренно, праведно и благочестиво жили в нынешнем веке,
ожидая блаженного упования и явления славы великого Бога и
Спасителя нашего Иисуса Христа, Который дал Себя за нас, чтобы
избавить нас от всякого беззакония и очистить Себе народ
особенный, ревностный к добрым делам.

Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошел на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное. Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.

Чтение Святого Писания поможет Вам в жизни. Обращайтесь к Богу в минуты радости и печали, задумывайтесь над Его заповедями и выполняйте их - и ваша жизнь приобретет стройность и порядок, в ней появится смысл и радость. Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.

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


Вернемся к нашим техническим деталям.

Я предполагаю что уважаемый читатель владеет необходимыми знаниями и навыками использования Linux и Oracle, поэтому я буду очень краток. Цель этой заметки изложить мой подход к тестированию Оракла, показать ключевые моменты и подчеркнуть особенности.

Установка Линукса

  • Установите Oracle Enterprise Linux 5.5, используя набор пакетов по умолчанию (Default Selection), но добавьте средства для разработки (Development)
  • Сконфигурируйте второй сетевой адаптер используя "system-config-network"
  • Добавьте инсталляционный диск как "yum repository" - он будет использован для установки необходимыx пакетов и автоматического разрешения зависимостей. Создайте файл "oul.repo" в "/etc/yum.repos.d" с такими строками:
  • [root@OUL5A yum.repos.d]# cat oul.repo
    [oul]
    mediaid=1270506149.012989
    name=OUL $releasever - $basearch
    failovermethod=priority
    baseurl=file:///media/Enterprise%20Linux%20dvd%2020100405/Server
    enabled=1
    gpgcheck=0
    [root@OUL5A yum.repos.d]#
    

  • Проверьте работу вновь созданного "yum repository", используя "yum repolist"
  • Попробуйте установить пакет:
  • [root@OUL5A yum.repos.d]# yum install sysstat
    Loaded plugins: security
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package sysstat.x86_64 0:7.0.2-3.el5 set to be updated
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    =======================================================================================================
    Package                 Arch                   Version 	Repository           Size
    =======================================================================================================
    Installing:
    sysstat                 x86_64                 7.0.2-3.el5  	oul                  174 k
    
    Transaction Summary
    =======================================================================================================
    Install       1 Package(s)
    Upgrade       0 Package(s)
    
    Total download size: 174 k
    Is this ok [y/N]: y
    Downloading Packages:
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
    Installing     : sysstat 		1/1
    
    Installed:
    sysstat.x86_64 0:7.0.2-3.el5
    
    Complete!
    [root@OUL5A yum.repos.d]#
    
    

  • Просмотрите документацию по адресу "http://download.oracle.com/docs/cd/E11882_01/install.112/e17212/toc.htm" и прочтите раздел "1.3 Preinstallation Steps Requiring Manual Tasks". Я не использую "Oracle Validated Configuration RPM" - но вы можете попытать счастья
  • Когда доберетесь до раздела "1.3.3 Check Operating System Packages", используйте "yum" и установите обе версии пакетов, 32 и 64 битные (даже несмотря на то, что Oracle 11.2 может обходиться только 64-битными):
  • [root@OUL5A yum.repos.d]# yum install binutils
    Loaded plugins: security
    Setting up Install Process
    Package binutils-2.17.50.0.6-14.el5.x86_64 already installed and latest version
    Nothing to do
    [root@OUL5A yum.repos.d]#
    [root@OUL5A yum.repos.d]# yum install compat-libstdc++*
    Loaded plugins: security
    Setting up Install Process
    Package compat-libstdc++-296-2.96-138.i386 already installed and latest version
    Package compat-libstdc++-33-3.2.3-61.x86_64 already installed and latest version
    Package compat-libstdc++-33-3.2.3-61.i386 already installed and latest version
    Nothing to do
    [root@OUL5A yum.repos.d]#
    [root@OUL5A yum.repos.d]# yum install elfutils-libelf*
    Loaded plugins: security
    Setting up Install Process
    Package elfutils-libelf-0.137-3.el5.x86_64 already installed and latest version
    Package elfutils-libelf-0.137-3.el5.i386 already installed and latest version
    Package elfutils-libelf-devel-static-0.137-3.el5.x86_64 already installed and
    latest version
    Package elfutils-libelf-devel-0.137-3.el5.x86_64 already installed and latest
    version
    Resolving Dependencies
    --> Running transaction check
    ---> Package elfutils-libelf-devel.i386 0:0.137-3.el5 set to be updated
    ---> Package elfutils-libelf-devel-static.i386 0:0.137-3.el5 set to be updated
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    =======================================================================================================
    Package                                 Arch            Version 	Repository      Size
    =======================================================================================================
    Installing:
    elfutils-libelf-devel                   i386            0.137-3.el5 	oul             24 k
    elfutils-libelf-devel-static            i386            0.137-3.el5 	oul             66 k
    
    Transaction Summary
    =======================================================================================================
    Install       2 Package(s)
    Upgrade       0 Package(s)
    
    Total download size: 90 k
    Is this ok [y/N]: y
    Downloading Packages:
    -------------------------------------------------------------------------------------------------------
    Total                                                                   36 MB/s |  90 kB     00:00
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
    Installing     : elfutils-libelf-devel 		1/2
    Installing     : elfutils-libelf-devel-static 	2/2
    
    Installed:
    elfutils-libelf-devel.i386 0:0.137-3.el5
    elfutils-libelf-devel-static.i386 0:0.137-3.el5
    
    Complete!
    [root@OUL5A yum.repos.d]#
    

  • Выключите Network Time Protocol, мы будем использовать Oracle Cluster Time Synchronization daemon (ctssd):
  • [root@OUL5A yum.repos.d]# chkconfig --list | grep ntpd
    ntpd           	0:off	1:off	2:off	3:off	4:off	5:off	6:off
    [root@OUL5A yum.repos.d]# mv /etc/ntp.conf /etc/ntp.conf.orig
    [root@OUL5A yum.repos.d]#
    

  • Создайте необходимые группы "oinstall", "dba" и пользователя "oracle":
  • [root@OUL5A ~]# groupadd -r oinstall
    [root@OUL5A ~]# groupadd -r oinstall
    [root@OUL5A ~]# useradd -r -c "Oracle Software owner" -g oinstall -G dba,oinstall oracle
    [root@OUL5A ~]# id -a oracle
    uid=101(oracle) gid=104(oinstall) groups=104(oinstall),105(dba)
    [root@OUL5A ~]#
    

  • Создайте нужные директории для Grid Infrastructure и Oracle Base:
  • [root@OUL5A ~]# mkdir -p  /u01/app/11.2.0/grid
    [root@OUL5A ~]# chown oracle:oinstall /u01/app/11.2.0/grid
    [root@OUL5A ~]# chmod -R 775 /u01/app/11.2.0/grid
    [root@OUL5A ~]# mkdir -p  /u01/app/oracle
    [root@OUL5A ~]# chown -R oracle:oinstall /u01/app/oracle
    [root@OUL5A ~]# chmod -R 775 /u01/app/oracle
    [root@OUL5A ~]# ls -laR /u01/
    /u01/:
    total 16
    drwxr-xr-x  3 root root 4096 Jan 17 05:37 .
    drwxr-xr-x 26 root root 4096 Jan 17 05:37 ..
    drwxr-xr-x  4 root root 4096 Jan 17 05:39 app
    
    /u01/app:
    total 16
    drwxr-xr-x 4 root   root     4096 Jan 17 05:39 .
    drwxr-xr-x 3 root   root     4096 Jan 17 05:37 ..
    drwxr-xr-x 3 root   root     4096 Jan 17 05:37 11.2.0
    drwxrwxr-x 2 oracle oinstall 4096 Jan 17 05:39 oracle
    
    /u01/app/11.2.0:
    total 12
    drwxr-xr-x 3 root   root     4096 Jan 17 05:37 .
    drwxr-xr-x 4 root   root     4096 Jan 17 05:39 ..
    drwxrwxr-x 2 oracle oinstall 4096 Jan 17 05:37 grid
    
    /u01/app/11.2.0/grid:
    total 8
    drwxrwxr-x 2 oracle oinstall 4096 Jan 17 05:37 .
    drwxr-xr-x 3 root   root     4096 Jan 17 05:37 ..
    
    /u01/app/oracle:
    total 8
    drwxrwxr-x 2 oracle oinstall 4096 Jan 17 05:39 .
    drwxr-xr-x 4 root   root     4096 Jan 17 05:39 ..
    [root@OUL5A ~]#
    

  • На инсталляционном диске "Grid Infrastructure Oracle media" найдите и установите пакет "cvuqdisk-1.0.7-1.rpm", файл "p10098816_112020_Linux-x86-64_3of7.zip" можно скачать с Oracle Support вебсайта (или файл "V17531-01.zip" с Oracle E-Delivery вебсайта):
  • [root@OUL5A Downloads]$ unzip -l V17531-01.zip | grep cvuqdisk-1.0.7-1.rpm
    8173  07-15-2009 02:05   grid/stage/cvu/cv/remenv/cvuqdisk-1.0.7-1.rpm
    8173  07-15-2009 02:05   grid/rpm/cvuqdisk-1.0.7-1.rpm	-- вам нужен этот файл
    [root@OUL5A Downloads]$ cd ~
    [root@OUL5A ~]# rpm -ivh cvuqdisk-1.0.7-1.rpm
    Preparing...                ########################################### [100%]
    Using default group oinstall to install package
    1:cvuqdisk               ########################################### [100%]
    [root@OUL5A ~]#
    

  • Выключите только что установленную систему и создайте ее точную копию - она станет вторым узлом (нодом) кластера
  • Включите вторую машину, смените имя и IP адреса обоих сетевых интерфейсов
  • Проверьте наличие устойчивого сетевого соединения между обоими узлами кластера и удостоверьтесь, что физические MAC адреса не совпадают
  • На обеих машинах отредактируйте /etc/hosts файлы таким образом:
  • [oracle@OUL5B ~]$ cat /etc/hosts
    # Do not remove the following line, or various programs
    # that require network functionality will fail.
    127.0.0.1		localhost.localdomain localhost
    ::1		localhost6.localdomain6 localhost6
    
    192.168.56.10   OUL5A
    192.168.56.11   OUL5B
    #
    10.1.1.10   OUL5A-priv
    10.1.1.11   OUL5B-priv
    #
    192.168.56.30   OUL5A-vip
    192.168.56.31   OUL5B-vip
    #
    192.168.56.100  rac1-scan
    [oracle@OUL5B ~]$
    

  • Проверьте наличие и доступность общих дисков (shared disks). Каждый диск должен быть виден с обеих машин. В моем примере, я использую виртуальные машины на Virtual Box 4. Выполните эти действия для создания общих дисков:
  • [u@x ASM]$ VBoxManage createhd --filename asm1.vdi --size 500 --format VDI --variant Fixed
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    Disk image created. UUID: 0ebcf1c3-5d18-4d79-a87b-bbbb9ef13979
    [u@x ASM]$ VBoxManage createhd --filename asm2.vdi --size 1000 --format VDI --variant Fixed
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    Disk image created. UUID: 8c104328-d211-41d7-9805-1e0785fd6937
    [u@x ASM]$ VBoxManage storageattach OUL5A --storagectl "SATA Controller" --port 1 --device 0 --type hdd
    --medium asm1.vdi --mtype shareable
    [u@x ASM]$ VBoxManage storageattach OUL5A --storagectl "SATA Controller" --port 2 --device 0 --type hdd
    --medium asm2.vdi --mtype shareable
    [u@x ASM]$ VBoxManage modifyhd asm1.vdi --type shareable
    [u@x ASM]$ VBoxManage modifyhd asm2.vdi --type shareable
    [u@x ASM]$ VBoxManage storageattach OUL5B --storagectl "SATA Controller" --port 1 --device 0 --type hdd
    --medium asm1.vdi --mtype shareable
    [u@x ASM]$ VBoxManage storageattach OUL5B --storagectl "SATA Controller" --port 2 --device 0 --type hdd
    --medium asm2.vdi --mtype shareable
    

  • Установите пакет ASMLib (http://www.oracle.com/technetwork/topics/linux/downloads/rhel5-084877.html):
  • [root@OUL5A ~]# ls -latrh oracleasm*
    -rwxr-xr-x 1 root root 135K Jan 17 08:21
    oracleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm
    -rwxr-xr-x 1 root root  89K Jan 17 08:21
    oracleasm-support-2.1.3-1.el5.x86_64.rpm
    -rwxr-xr-x 1 root root  14K Jan 17 08:21 oracleasmlib-2.0.4-1.el5.x86_64.rpm
    [root@OUL5A ~]# rpm -ivh oracleasm*
    Preparing...                ########################################### [100%]
    1:oracleasm-support      ########################################### [ 33%]
    2:oracleasm-2.6.18-194.el########################################### [ 67%]
    3:oracleasmlib           ########################################### [100%]
    [root@OUL5A ~]#
    
    [root@OUL5B ~]# /etc/init.d/oracleasm configure
    Configuring the Oracle ASM library driver.
    
    This will configure the on-boot properties of the Oracle ASM library
    driver.  The following questions will determine whether the driver is
    loaded on boot and what permissions it will have.  The current values
    will be shown in brackets ('[]').  Hitting  without typing an
    answer will keep that current value.  Ctrl-C will abort.
    
    Default user to own the driver interface []: oracle
    Default group to own the driver interface []: dba
    Start Oracle ASM library driver on boot (y/n) [n]: y
    Scan for Oracle ASM disks on boot (y/n) [y]:
    Writing Oracle ASM library driver configuration: done
    Initializing the Oracle ASMLib driver:                     [  OK  ]
    Scanning the system for Oracle ASMLib disks:               [  OK  ]
    [root@OUL5B ~]#
    
    [root@OUL5A ~]# /etc/init.d/oracleasm createdisk asmdisk1 /dev/sdb1
    Marking disk "asmdisk1" as an ASM disk:                    [  OK  ]
    [root@OUL5A ~]# /etc/init.d/oracleasm createdisk asmdisk2 /dev/sdc1
    Marking disk "asmdisk2" as an ASM disk:                    [  OK  ]
    [root@OUL5A ~]#
    
    [root@OUL5B ~]# /etc/init.d/oracleasm scandisks
    Scanning the system for Oracle ASMLib disks:               [  OK  ]
    [root@OUL5B ~]# /etc/init.d/oracleasm listdisks
    ASMDISK1
    ASMDISK2
    [root@OUL5B ~]#
    

  • С версии 11 каждый патч Oracle содержит полную инсталляцию. Извлеките содержимое файлов "p10098816_112020_Linux-x86-64_1of7.zip", "p10098816_112020_Linux-x86-64_2of7.zip", "p10098816_112020_Linux-x86-64_3of7.zip" в какую-нибудь директорию ("ora" в моем примере) и создайте ISO образ, запишите его на DVD
  • Вставьте DVD в нод 1 и смонтируйте его
  • mkisofs -r -J -iso-level 4 -o ora.iso ora/
    ...
    [oracle@OUL5A mnt]$ ls -la
    total 14
    dr-xr-xr-x  1 root root 2048 Jan 17  2011 .
    drwxr-xr-x 26 root root 4096 Jan 17 07:06 ..
    dr-xr-xr-x  1 root root 2048 Nov 16 19:10 database
    dr-xr-xr-x  1 root root 2048 Nov 12 17:59 grid
    [oracle@OUL5A mnt]$
    

    Установка Oracle Grid Infrastructure

    Эта новая составляющая появилась в Oracle 11 и включает в себя ASM и CRS. Также clusterware было разделено на два компонента - lower и upper CRS. Как всегда, это привело к появлению новых процессов, усложнило архитектуру кластерных компонентов (одних "агентов" теперь 3 штуки) и заложило основу для унифицированной "сети вычислений" (Grid Computing).

    Процесс установки очень подробно описан в документации и состоит из выбора опций графического интерфейса Oracle Universal Installer. Кстати, в версии 11 этот самый Installer был полностью переработан, его рабочее окно сделали просто огромным, так что оно не умещается теперь на экраны с разрешением 800х600. Кроме того, в процессе гонки за сроками, разработчики забыли о кнопке "Uninstall", что привело к появлению новой командной утилиты в Oracle 11. Также заметьте, что CRS диск и диск кворума (voting disk) размещены в дисковой группе ASM. На мой взгляд, это наиболее простой и эффективный способ. Размещение их на кластерной файловой системе OCFS выглядит слишком громоздко, raw devices более не поддерживаются Ораклом (только для старых систем, обновляемых до версии 11).

  • Наиболее важный момент в установке Oracle GI - выполнение скрипта "root.sh" на всех узлах кластера, хорошо хоть это не изменили.
  • [root@OUL5A ~]# /u01/app/11.2.0/grid/root.sh
    Running Oracle 11g root script...
    
    The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/11.2.0/grid
    
    Enter the full pathname of the local bin directory: [/usr/local/bin]:
    Copying dbhome to /usr/local/bin ...
    Copying oraenv to /usr/local/bin ...
    Copying coraenv to /usr/local/bin ...
    
    
    Creating /etc/oratab file...
    Entries will be added to the /etc/oratab file as needed by
    Database Configuration Assistant when a database is created
    Finished running generic part of root script.
    Now product-specific root actions will be performed.
    Using configuration parameter file:
    /u01/app/11.2.0/grid/crs/install/crsconfig_params
    Creating trace directory
    LOCAL ADD MODE
    Creating OCR keys for user 'root', privgrp 'root'..
    Operation successful.
    OLR initialization - successful
    root wallet
    root wallet cert
    root cert export
    peer wallet
    profile reader wallet
    pa wallet
    peer wallet keys
    pa wallet keys
    peer cert request
    pa cert request
    peer cert
    pa cert
    peer root cert TP
    profile reader root cert TP
    pa root cert TP
    peer pa cert TP
    pa peer cert TP
    profile reader pa cert TP
    profile reader peer cert TP
    peer user cert
    pa user cert
    Adding daemon to inittab
    ACFS-9200: Supported
    ACFS-9300: ADVM/ACFS distribution files found.
    ACFS-9307: Installing requested ADVM/ACFS software.
    ACFS-9308: Loading installed ADVM/ACFS drivers.
    ACFS-9321: Creating udev for ADVM/ACFS.
    ACFS-9323: Creating module dependencies - this may take some time.
    ACFS-9327: Verifying ADVM/ACFS devices.
    ACFS-9309: ADVM/ACFS installation correctness verified.
    CRS-2672: Attempting to start 'ora.mdnsd' on 'oul5a'
    CRS-2676: Start of 'ora.mdnsd' on 'oul5a' succeeded
    CRS-2672: Attempting to start 'ora.gpnpd' on 'oul5a'
    CRS-2676: Start of 'ora.gpnpd' on oul5a' succeeded
    CRS-2672: Attempting to start 'ora.cssdmonitor' on 'oul5a'
    CRS-2672: Attempting to start 'ora.gipcd' on 'oul5a'
    CRS-2676: Start of 'ora.gipcd' on 'oul5a' succeeded
    CRS-2676: Start of 'ora.cssdmonitor' on 'oul5a' succeeded
    CRS-2672: Attempting to start 'ora.cssd' on 'oul5a'
    CRS-2672: Attempting to start 'ora.diskmon' on 'oul5a'
    CRS-2676: Start of 'ora.diskmon' on 'oul5a' succeeded
    CRS-2676: Start of 'ora.cssd' on 'oul5a' succeeded
    
    ASM created and started successfully.
    
    Disk Group DBFS_DG created successfully.
    
    clscfg: -install mode specified
    Successfully accumulated necessary OCR keys.
    Creating OCR keys for user 'root', privgrp 'root'..
    Operation successful.
    CRS-4256: Updating the profile
    Successful addition of voting disk 896d6ba8d41e4f42bfb92eaec33159c6.
    Successfully replaced voting disk group with +DBFS_DG.
    CRS-4256: Updating the profile
    CRS-4266: Voting file(s) successfully replaced
    ##  STATE    File Universal Id                File Name Disk group
    --  -----    -----------------                --------- ---------
    1. ONLINE   896d6ba8d41e4f42bfb92eaec33159c6 (ORCL:ASMDISK2) [DBFS_DG]
    Located 1 voting disk(s).
    CRS-2672: Attempting to start 'ora.asm' on 'oul5a'
    CRS-2676: Start of 'ora.asm' on 'oul5a' succeeded
    CRS-2672: Attempting to start 'ora.DBFS_DG.dg' on 'oul5a'
    CRS-2676: Start of 'ora.DBFS_DG.dg' on 'oul5a' succeeded
    ACFS-9200: Supported
    ACFS-9200: Supported
    CRS-2672: Attempting to start 'ora.registry.acfs' on 'oul5a'
    CRS-2676: Start of 'ora.registry.acfs' on 'oul5a' succeeded
    Configure Oracle Grid Infrastructure for a Cluster ... succeeded
    [root@OUL5A ~]#
    
    [root@OUL5B ~]# /u01/app/11.2.0/grid/root.sh
    Running Oracle 11g root script...
    
    The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/11.2.0/grid
    
    Enter the full pathname of the local bin directory: [/usr/local/bin]:
    Copying dbhome to /usr/local/bin ...
    Copying oraenv to /usr/local/bin ...
    Copying coraenv to /usr/local/bin ...
    
    
    Creating /etc/oratab file...
    Entries will be added to the /etc/oratab file as needed by
    Database Configuration Assistant when a database is created
    Finished running generic part of root script.
    Now product-specific root actions will be performed.
    Using configuration parameter file:
    /u01/app/11.2.0/grid/crs/install/crsconfig_params
    Creating trace directory
    LOCAL ADD MODE
    Creating OCR keys for user 'root', privgrp 'root'..
    Operation successful.
    OLR initialization - successful
    Adding daemon to inittab
    ACFS-9200: Supported
    ACFS-9300: ADVM/ACFS distribution files found.
    ACFS-9307: Installing requested ADVM/ACFS software.
    ACFS-9308: Loading installed ADVM/ACFS drivers.
    ACFS-9321: Creating udev for ADVM/ACFS.
    ACFS-9323: Creating module dependencies - this may take some time.
    ACFS-9327: Verifying ADVM/ACFS devices.
    ACFS-9309: ADVM/ACFS installation correctness verified.
    CRS-4402: The CSS daemon was started in exclusive mode but found an active CSS
    daemon on node oul5a, number 1, and is terminating
    An active cluster was found during exclusive startup, restarting to join the cluster
    Configure Oracle Grid Infrastructure for a Cluster ... succeeded
    [root@OUL5B ~]#
    

  • Убедитесь, что кластер работает:
  • [oracle@OUL5A bin]$ ./crsctl check cluster -all
    **************************************************************
    oul5a:
    CRS-4537: Cluster Ready Services is online
    CRS-4529: Cluster Synchronization Services is online
    CRS-4533: Event Manager is online
    **************************************************************
    oul5b:
    CRS-4537: Cluster Ready Services is online
    CRS-4529: Cluster Synchronization Services is online
    CRS-4533: Event Manager is online
    **************************************************************
    
    [oracle@OUL5A oul5a]$ /u01/app/11.2.0/grid/bin/olsnodes
    oul5a
    oul5b
    [oracle@OUL5A oul5a]$
    [oracle@OUL5A oul5a]$ tail -200 /u01/app/11.2.0/grid/log/oul5a/alertoul5a.log
    ...
    [cssd(3086)]CRS-1601:CSSD Reconfiguration complete. Active nodes are oul5a .
    2011-01-19 15:08:30.142
    [ctssd(3195)]CRS-2407:The new Cluster Time Synchronization Service reference node is host oul5a.
    2011-01-19 15:08:30.142
    [ctssd(3195)]CRS-2401:The Cluster Time Synchronization Service started on host oul5a.
    2011-01-19 15:08:30.530
    [cssd(3086)]CRS-1601:CSSD Reconfiguration complete. Active nodes are oul5a oul5b .
    ...
    

    Установка Oracle RAC, создание кластерной БД

    Применяя тот же самый подход "прощелкивания" сквозь дебри графического интерфейса инсталлятора, установим сам Oracle RAC. Для этого запустите программу установки из директории "database" на DVD диске.

  • Проверить результат работы можно в "alert log" на ноде 1 (мы устанавливаем с него):
  • ...
    CREATE DATABASE "DB"
    MAXINSTANCES 32
    MAXLOGHISTORY 1
    MAXLOGFILES 192
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    DATAFILE SIZE 700M AUTOEXTEND ON NEXT  10240K MAXSIZE UNLIMITED
    EXTENT MANAGEMENT LOCAL
    SYSAUX DATAFILE SIZE 600M AUTOEXTEND ON NEXT  10240K MAXSIZE UNLIMITED
    SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE SIZE 20M AUTOEXTEND ON NEXT
    640K MAXSIZE UNLIMITED
    SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE SIZE 200M AUTOEXTEND ON NEXT
    5120K MAXSIZE UNLIMITED
    CHARACTER SET US7ASCII
    NATIONAL CHARACTER SET UTF8
    LOGFILE GROUP 1  SIZE 51200K,
    GROUP 2  SIZE 51200K
    USER SYS IDENTIFIED BY *USER SYSTEM IDENTIFIED BY
    ...
    Thread 1 opened at log sequence 1
    Current log# 1 seq# 1 mem# 0: +DATA_DG/db/onlinelog/group_1.257.740902837
    Successful open of redo thread 1
    MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
    processing ?/rdbms/admin/dcore.bsq
    create tablespace SYSTEM datafile  SIZE 700M AUTOEXTEND ON NEXT  10240K
    MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL online
    SMON: enabling cache recovery
    Thu Jan 20 06:20:47 2011
    Completed: create tablespace SYSTEM datafile  SIZE 700M AUTOEXTEND ON NEXT
    10240K MAXSIZE UNLIMITED
    ...
    Thu Jan 20 06:20:58 2011
    [16876] Successfully onlined Undo Tablespace 2.
    Completed: CREATE SMALLFILE UNDO TABLESPACE UNDOTBS1 DATAFILE  SIZE 200M
    AUTOEXTEND ON NEXT  5120K MAXSIZE UNLIMITED
    
    CREATE SMALLFILE TEMPORARY TABLESPACE TEMP TEMPFILE  SIZE 20M AUTOEXTEND ON NEXT
    640K MAXSIZE UNLIMITED
    
    Completed: CREATE SMALLFILE TEMPORARY TABLESPACE TEMP TEMPFILE  SIZE 20M
    AUTOEXTEND ON NEXT  640K MAXSIZE UNLIMITED
    
    ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP
    Completed: ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP
    ALTER DATABASE DEFAULT TABLESPACE SYSTEM
    Completed: ALTER DATABASE DEFAULT TABLESPACE SYSTEM
    ...
    processing ?/rdbms/admin/dfmap.bsq
    processing ?/rdbms/admin/denv.bsq
    processing ?/rdbms/admin/drac.bsq
    processing ?/rdbms/admin/dsec.bsq
    processing ?/rdbms/admin/doptim.bsq
    processing ?/rdbms/admin/dobj.bsq
    processing ?/rdbms/admin/djava.bsq
    processing ?/rdbms/admin/dpart.bsq
    processing ?/rdbms/admin/drep.bsq
    processing ?/rdbms/admin/daw.bsq
    processing ?/rdbms/admin/dsummgt.bsq
    processing ?/rdbms/admin/dtools.bsq
    processing ?/rdbms/admin/dexttab.bsq
    processing ?/rdbms/admin/ddm.bsq
    processing ?/rdbms/admin/dlmnr.bsq
    processing ?/rdbms/admin/ddst.bsq
    Thu Jan 20 06:21:06 2011
    SMON: enabling tx recovery
    Starting background process SMCO
    Thu Jan 20 06:21:06 2011
    SMCO started with pid=30, OS id=16927
    replication_dependency_tracking turned off (no async multimaster replication found)
    Starting background process QMNC
    Thu Jan 20 06:21:06 2011
    QMNC started with pid=32, OS id=16931
    Completed: CREATE DATABASE "DB"
    ...
    Reconfiguration started (old inc 2, new inc 4)
    List of instances:
    1 2 (myinst: 1)
    

  • Проверьте состояние базы, добавьте онлайн логи, измените параметры как считаете нужным:
  • e@OUL5A trace]$ srvctl status database -d DB
    Instance DB1 is running on node oul5a
    Instance DB2 is running on node oul5b
    [oracle@OUL5A trace]$
    

    Установка Swingbench

    Утилита представляет собой Java приложение, последняя версия требует Java 6. Java можно установить локально, в вашей домашней директории, а можно использовать пакет, предоставляемый на уровне системы.

  • Установим последнии версии Java и Swingbench на обоих кластерных нодах:
  • [oracle@OUL5A sw]$ su -
    Password:
    [root@OUL5A ~]# /home/oracle/jre-6u23-linux-x64-rpm.bin
    Unpacking...
    Checksumming...
    Extracting...
    UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (Zip-Bugs@lists.wku.edu).
    inflating: jre-6u23-linux-amd64.rpm
    Preparing...                ########################################### [100%]
    1:jre                    ########################################### [100%]
    Unpacking JAR files...
    rt.jar...
    jsse.jar...
    charsets.jar...
    localedata.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
    Done.
    [oracle@OUL5A ~]$ ls -l
    total 35484
    -rwxr-xr-x  1 oracle oinstall 20135679 Jan 20 06:58 jre-6u23-linux-x64-rpm.bin*
    -rw-r-----  1 oracle oinstall 16113445 Jan 20 06:58 swingbench240688.zip
    [oracle@OUL5A ~]$ unzip swingbench240688.zip
    Archive:  swingbench240688.zip
    creating: swingbench/
    inflating: swingbench/.DS_Store
    creating: swingbench/bin/
    ...
    inflating: swingbench/winbin/swingconfig.xml
    [oracle@OUL5A ~]$ cd swingbench
    [oracle@OUL5A swingbench]$ ls
    bin/  configs/	launcher/  lib/  log/  README.txt*  source/
    sql/  swingbenchFAQ.pdf  winbin/
    [oracle@OUL5A swingbench]$ cd bin/
    [oracle@OUL5A bin]$ ls
    bmcompare*     	  ccwizard.xml*	 clusteroverview.xml  minibench* 	shwizard*	    swingconfig.xml*
    ccconfig.xml*  	  charbench*	 coordinator*	      oewizard* 	shwizard.xml* 	    ccwizard*
    clusteroverview*  data/          oewizard.xml*        swingbench*
    [oracle@OUL5A swingbench]$ cd ~
    [oracle@OUL5A ~]$ tail -8 ~/.bashrc
    if [ -f /etc/bashrc ]; then
    . /etc/bashrc
    fi
    export ORACLE_BASE=/u01/app/oracle
    export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
    export ORACLE_SID=DB
    export PATH=$ORACLE_HOME/bin:/usr/java/jre1.6.0_23/bin:$PATH
    
    [oracle@OUL5A ~]$ which java
    /usr/java/jre1.6.0_23/bin/java
    [oracle@OUL5A ~]$ java -version
    java version "1.6.0_23"
    Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
    Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
    [oracle@OUL5A ~]$
    

  • Используя программу "oewizard", создадим пользователя ОЕ (Order Entry):
  • На шаге "Database Details" используем:
  • - Connect string: "//oul5a/DB", подразумевается порт 1521
    - Type IV jdbc driver (Thin)
    - DBA username: "sys as sysdba"
    - DBA password: "whatever-it-is"
  • Для "Schema Details":
  • - username "soe"
    - schema tablespace "USERS", проверьте размер и autoextend
    - пометьте только один checkbox "Use Partitioning"
    Sizing - 1Gb
    Level of Parallelizm - 20 (В моей системе 10 CPUs)
    Убедитесь что в логе нет ошибок.

  • В процессе работы Swingbench (утилита "oewizard") генерирует множество SQL запросов, ход выполнения которых можно легко проверить через "sqlplus":
  • SQL_ID
    -------------
    SQL_TEXT
    --------------------------------------------------------------------------------
    7xt1bx17pbqj6
    select sql_id, sql_text from v$sqlarea where sql_id in ( select sql_id from v$se
    ssion group by sql_id )
    
    5gkc10wnagprk
    Insert into ORDERS(ORDER_ID,ORDER_DATE,ORDER_MODE,CUSTOMER_ID,ORDER_STATUS,ORDER
    _TOTAL,SALES_REP_ID,PROMOTION_ID,WAREHOUSE_ID) values (:1 ,:2 ,:3 ,:4 ,:5 ,:6 ,:
    7 ,:8 ,:9 )
    
    d1yrz7run4p1s
    Insert into ORDER_ITEMS(ORDER_ID,LINE_ITEM_ID,PRODUCT_ID,UNIT_PRICE,QUANTITY) va
    lues (:1 ,:2 ,:3 ,:4 ,:5 )
    
    
    SQL>
    SQL_ID
    -------------
    SQL_TEXT
    --------------------------------------------------------------------------------
    1h6r541asp943
    CREATE INDEX ord_customer_ix  ON orders (customer_id)  REVERSE tablespace USERS
    parallel 20 nologging
    
    SQL>
    SQL_ID
    -------------
    SQL_TEXT
    --------------------------------------------------------------------------------
    a5z9u864c9wnq
    begin  dbms_stats.gather_schema_stats(	 ownname=>SYS_CONTEXT('USERENV','CURRENT
    _SCHEMA')  ,estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE  ,block_sample=>true
    ,method_opt=>'FOR ALL COLUMNS SIZE SKEWONLY'  ,degree=>20  ,granularity=>'ALL'
    ,cascade=>true);  end;
    

    Анализируя исполняемые запросы, мы видим что Swingbench (oewizard) использует "bind variables", partitioning и reverse indexes для уменьшения количества "горячих блоков" на индексах. Статистика собирается параллельно, используя полностью переработанный в версии Oracle 11 пакет DBMS_STATS.

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

  • Измените swingconfig.xml на обоих нодах соответственно:
  • [oracle@OUL5A bin]$ pwd
    /home/oracle/swingbench/bin
    [oracle@OUL5A bin]$ head -20 swingconfig.xml
    ...
    <Connection>
    <UserName>soe</UserName>
    <Password>soe</Password>
    <ConnectString>//oul5a/DB</ConnectString>  -- или oul5b для второго узла кластера
    <DriverType>Oracle jdbc Driver</DriverType>
    <Properties>
    <Property Key="TcpNoDelay">true</Property>
    <Property Key="StatementCaching">50</Property>
    </Properties>
    </Connection>
    ...
    

    В конце всех конфигурационных усилий у нас должны получиться две совершенно идентичные директории программы "swingbench" на обоих узлах кластера, готовые подключаться к базе данных только на локальном ноде. Самый простой способ - полностью подготовить один нод, затем перенести директорию "swingbench" на второй узел и просто изменить имя сервера в "swingconfig.xml".

    Тестирование кластера

    Запускаем генераторы "charbench" на каждом ноде. Я пришел к выводу, что самый простой и эффективный способ использования Swingbench - из командной строки. При этом мы не расходуем память и циклы процессора на прорисовку красивых графиков ("minibench" и "swingbench"), не создаем ненужный траффик на интерконнекте ("clusteroverview") и не затуманиваем основную картину - производительность кластерной БД и количество транзакций за единицу времени.

    Если есть желание посмотреть графики - всегда можно использовать Oracle Enterprise Manager Database Control, страничку "Performance". Но в своих тестах я отключаю и это чудо и пользуюсь:

  • "SQL*plus" чтобы смотреть что же происходит в базе (смотрите выше)
  • "AWR Report" для кумулятивного анализа производительности за период времени, обычно не более 20 минут
  • [oracle@OUL5A bin]$ ./charbench
    Version :        2.4.0.688
    
    Results will be written to results.xml.
    Hit Return to Terminate Run...
    
    Time            Users   TPM     TPS
    
    1:04:23 AM      15      305     14
    
    
    [oracle@OUL5B bin]$ ./charbench
    Version :        2.4.0.688
    
    Results will be written to results.xml.
    Hit Return to Terminate Run...
    
    Time            Users   TPM     TPS
    
    1:07:24 AM      15      81      15
    

    Заметьте, что мы не можем достичь более чем 15 TPS на каждом ноде, т.е. всего 30 транзакций в секунду на всем кластере. Позорный результат обеспечен виртуализацией и всего одним диском (даже несмотря на то, что это 15к RPM Tier 1 диск). Для нашего теста результат не так важен, но тем не менее попробуем проанализировать что же произошло и как можно улучшить результат (и нагрузить систему более интенсивно).

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

    [u@x ~]$ ssh oracle@oul5a
    Last login: Fri Jan 21 00:41:19 2011 from 192.168.56.1
    
    ........................... == Притчи Соломона == ..............................
    === Глава 12, Стих 3 ===
    3 Не утвердит  себя  человек  беззаконием;  корень  же  праведников  неподвижен.
    
    (b+/b-, c+/c-, +/-, *) >
    
    [oracle@OUL5A ~]$ w
    01:08:10 up 18:28,  2 users,  load average: 1.52, 1.41, 1.18
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    oracle   pts/1    192.168.56.1     23:56    4:16   7.44s  0.03s sshd: oracle [priv]
    oracle   pts/2    192.168.56.1     01:08    0.00s  0.04s  0.01s w
    [oracle@OUL5A ~]$ sar 5 5
    Linux 2.6.18-194.el5 (OUL5A) 	01/21/2011
    
    01:08:21 AM       CPU     %user     %nice   %system   %iowait    %steal     %idle
    01:08:26 AM       all      3.34      0.00     19.42      1.53      0.00     75.71
    01:08:31 AM       all      3.73      0.00     20.07      1.94      0.00     74.26
    01:08:36 AM       all      2.81      0.00     17.25      0.59      0.00     79.35
    01:08:41 AM       all      3.14      0.02     18.08      1.30      0.00     77.46
    01:08:46 AM       all      2.85      0.00     18.70      0.47      0.00     77.98
    Average:          all      3.18      0.00     18.71      1.17      0.00     76.94
    [oracle@OUL5A ~]$ w
    01:08:50 up 18:29,  2 users,  load average: 1.26, 1.37, 1.18
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    oracle   pts/1    192.168.56.1     23:56    4:56   8.08s  0.03s sshd: oracle [priv]
    oracle   pts/2    192.168.56.1     01:08    0.00s  0.03s  0.00s w
    [oracle@OUL5A ~]$ sqlplus
    
    SQL*Plus: Release 11.2.0.2.0 Production on Fri Jan 21 01:08:58 2011
    
    Copyright (c) 1982, 2010, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
    
    SQL> exec dbms_workload_repository.create_snapshot;
    
    PL/SQL procedure successfully completed.
    
    SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
    [oracle@OUL5A ~]$
    

    Как видно, система не делает фактически ничего - мы имеем достаточный запас по процессору, памяти и даже дисковым операциям. Подождем 20-30 минут, сделаем еще один AWR snapshot и завершим работу тестовых генераторов нажатием "Enter".

  • В течение этих 20 минут мы можем посмотреть, что же делается в базе данных:
  • SQL> select inst_id, count(*)
    fro  2  m gv$session
    3  where username = 'SOE'
    4  group by inst_id;
    
    INST_ID   COUNT(*)
    ---------- ----------
    1	   16
    2	   16
    
    SQL>
    1  select inst_id, event, count(*)
    2  from gv$session
    3  where username = 'SOE'
    4  group by inst_id, event
    5  --having count(*) >3
    6* order by 1,2
    SQL> /
    
    INST_ID EVENT					   COUNT(*)
    ---------- --------------------------------------------- ----------
    1 PL/SQL lock timer					 13
    1 class slave wait					  1
    1 gc cr multi block request				  1
    1 gc cr request					  1
    2 PL/SQL lock timer					 13
    2 SQL*Net message from client				  2
    2 class slave wait					  1
    
    7 rows selected.
    
    SQL>
    

    Глядя на Oracle sessions wait events мы четко видим причину низкого числа транзакций в секунду - внутренняя PL/SQL логика Swingbench использует процедуру DBMSLOCK.SLEEP для имитации времени реакции пользователя ("Think time" параметер, ниже). В нашем случае пользователи явно неторопливы.

    Таким образом, уменьшив "Think time" до нуля и последовательно увеличивая количество сессий и число генераторов / узлов кластера, мы можем нагрузить дисковую систему до максимального уровня, на котором вероятнее всего длительность индивидуальных одно-блоковых дисковых операций возрастет до 100 - 500 миллисекунд (пол-секунды). В таком случае, мы можем записать число TPS и смело сказать, что наш кластер достиг его физического предела производительности.

    Ну а пока продолжим анализировать наш кластер с ленивыми пользователями и одним диском. Как сказано выше, завершим работу всех генераторов "charbench" нажатием "Enter". Файл "results.xml" показывает среднее и максимальное число транзакций за секунду и минуту, с точки зрения программы "swingbench" (но не с точки зрения базы данных. В прошлых версиях разница в TPS между "results.xml" и AWR могла быть очень существенной).

    <Overview>
    <BenchmarkName>"Order Entry (PLSQL)"</BenchmarkName>
    <Comment>""</Comment>
    <TimeOfRun>Jan 21, 2011 1:03:55 AM</TimeOfRun>
    <TotalRunTime>0:27:04</TotalRunTime>
    <TotalLogonTime>0:00:01</TotalLogonTime>
    <TotalCompletedTransactions>20485</TotalCompletedTransactions>
    <TotalFailedTransactions>0</TotalFailedTransactions>
    <AverageTransactionsPerSecond>12.61</AverageTransactionsPerSecond>
    <MaximumTransactionRate>817</MaximumTransactionRate>
    </Overview>
    <Configuration>
    <NumberOfUsers>15</NumberOfUsers>
    <MinimumThinkTime>100</MinimumThinkTime>	--"PL/SQL lock timer" waits
    <MaximumThinkTime>200</MaximumThinkTime>
    <ConnectString>//oul5a/DB</ConnectString>
    <TimingsIn>miliseconds</TimingsIn>
    </Configuration>
    <DMLResults>
    <SelectStatements>91550</SelectStatements>
    <InsertStatements>47826</InsertStatements>
    <UpdateStatements>26844</UpdateStatements>
    <DeleteStatements>0</DeleteStatements>
    <CommitStatements>30796</CommitStatements>
    <RollbackStatements>0</RollbackStatements>
    </DMLResults>
    

  • Сравним результаты с данными из AWR report:
  • SQL> @?/rdbms/admin/awrrpti
    ...
    Report written to /tmp/awr_i1_19_20.html
    SQL>
    
    -- Нас интересует это место:
    Transactions:	17.8
    ...
    Top 5 Timed Foreground Events
    Event			Waits	Time(s)	Avg wait (ms)	% DB time	Wait Class
    db file sequential read	4,799	27	6		34.70		User I/O
    DB CPU	 		17				22.12
    db file scattered read	2,645	13	5		16.46		User I/O
    gc current block 2-way	2,866	5	2		5.90		Cluster
    gc current multi 	1,161	2	2		3.07		Cluster
    block request
    

    "PL/SQL lock timer" считается "idle wait event" и поэтому здесь не представлен. Тем не менее, мы видим что число TPS почти совпадает (Swingbench показывал немного меньше чем AWR), время дисковых операций оставалось в пределах 5-8 миллисекунд в течение всего времени тестирования, что очень хорошо для нашего виртуального кластера. Обратите внимание, общее число дисковых waits значительно, но не критично. Это означает, что наша система "осталась в живых" исключительно из-за программных задержек ("Think time"). Стоило нам уменьшить это время ожидания реакции пользователя до нуля - и наш кластер показал бы совершенно другую картину в AWR - IO waits достигли бы 90-99% от общего числа и время дисковых операций "просело" бы значительно, вероятнее всего в разы.

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

    Спасибо что зашли,

    Будьте благословенны!
    Денис