"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу
Тестирование производительности Оракла на виртуальном кластере: VirtualBox и SwingBench.
Довольно часто возникает необходимость проверить производительность существующей или оценить характеристики новой системы, выяснить предел возможностей оборудования или просто протестировать техническое решение.
В таких случаях я использую несложную методику, изложенную ниже и основанную на применении пакета "Swingbench". Выработав определенные "тестовые сценарии", я выполняю один из них на новой системе и сравниваю со старой.
Swingbench имеет несколько встроенных вариантов сценариев, которые можно использовать без изменений или подстраивать под свою задачу. Чаще всего я изменяю так называемое "Время реакции пользователя" (Think Time) и варьирую процентное соотношение различных DML (Update, Insert, Select, Delete).
Swingbench не подойдет для сравнения характеристик баз данных различных производителей, так как пакет разработан исключительно для Оракла и использует соответствующие Java-библиотеки. Тем не менее, эта программа заняла достойное место в моем "наборе инструментов" и я надеюсь может быть полезной и для вас.
Прежде чем мы продолжим, я хотел бы привести строки из Евангелия:
Послание к Титу святого апостола Павла, 2:11-14
Ибо явилась благодать Божия, спасительная для всех человеков,
научающая нас, чтобы мы, отвергнув нечестие и мирские похоти,
целомудренно, праведно и благочестиво жили в нынешнем веке,
ожидая блаженного упования и явления славы великого Бога и
Спасителя нашего Иисуса Христа, Который дал Себя за нас, чтобы
избавить нас от всякого беззакония и очистить Себе народ
особенный, ревностный к добрым делам.
Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошел на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное. Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.
Чтение Святого Писания поможет Вам в жизни. Обращайтесь к Богу в минуты радости и печали, задумывайтесь над Его заповедями и выполняйте их - и ваша жизнь приобретет стройность и порядок, в ней появится смысл и радость. Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.
На главной странице этого сайта вы найдете программу для чтения Библии в командной строке - буду очень рад если программа окажется полезной. Пожалуйста, читайте Библию, на экране или в печатном виде - вы будете искренне удивлены как много там сказано лично про вас и ваши обстоятельства.
Вернемся к нашим техническим деталям.
Я предполагаю что уважаемый читатель владеет необходимыми знаниями и навыками использования Linux и Oracle, поэтому я буду очень краток. Цель этой заметки изложить мой подход к тестированию Оракла, показать ключевые моменты и подчеркнуть особенности.
Установка Линукса
[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]#
[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]#
[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]#
[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]#
[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 ~]#
[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 ~]#
[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 ~]#
[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 ~]$
[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
[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 ('[]'). Hittingwithout 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 ~]#
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).
[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 диске.
... 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 можно установить локально, в вашей домашней директории, а можно использовать пакет, предоставляемый на уровне системы.
[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 ~]$
- Type IV jdbc driver (Thin)
- DBA username: "sys as sysdba"
- DBA password: "whatever-it-is"
- schema tablespace "USERS", проверьте размер и autoextend
- пометьте только один checkbox "Use Partitioning"
Sizing - 1Gb
Level of Parallelizm - 20 (В моей системе 10 CPUs)
Убедитесь что в логе нет ошибок.
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 будет использовать при тестировании. Мой опыт показывает, что самый эффективный способ создания нагрузки - запускать по одному генератору на каждом узле кластера, подключая все сессии только локально. В этом случае получается достигать максимум транзакций в секунду, недостижимый при использовании генераторов на отдельном компьютере, подключенном по сети.
[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". Но в своих тестах я отключаю и это чудо и пользуюсь:
[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".
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>
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% от общего числа и время дисковых операций "просело" бы значительно, вероятнее всего в разы.
Определение реальных пределов производительности системы я оставляю в качестве упражнения для пытливого читателя.
Спасибо что зашли,
Будьте благословенны!
Денис