{"id":19,"date":"2012-04-20T00:13:26","date_gmt":"2012-04-20T03:13:26","guid":{"rendered":"http:\/\/www.fernandosimon.com\/blog\/?p=19"},"modified":"2019-09-13T20:27:54","modified_gmt":"2019-09-13T23:27:54","slug":"iorm-parte-iii","status":"publish","type":"post","link":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/","title":{"rendered":"IORM &#8211; Parte III"},"content":{"rendered":"<p style=\"text-align: justify;\">Ao falar de IORM, deve-se lembrar que ele \u00e9 somente uma parte do processo. Como j\u00e1 citei em posts anteriores, o IORM \u00e9 um <em>resource manager<\/em> semelhante ao encontrado no banco de dados, sendo chamado de <em>interdatabase <\/em>enquanto o <em>resource manager<\/em> do banco de dados \u00e9 chamado de <em>intradatabase<\/em>. O IORM deve ser somente uma das funcionalidades utilizadas em um projeto para Exadata, um bom projeto come\u00e7a com preocupa\u00e7\u00f5es que v\u00e3o desde a conex\u00e3o a base de dados, passando pela ger\u00eancia dos recursos internos da inst\u00e2ncia e indo at\u00e9 I\/O.<\/p>\n<p style=\"text-align: justify;\">A integra\u00e7\u00e3o do IORM com o <em>resource manager<\/em> do banco de dado pode ser realizada atrav\u00e9s de categorias (catPlan). Apesar de o IORM em suas m\u00e9tricas apresentar a distin\u00e7\u00e3o por <em>consumer groups<\/em> n\u00e3o \u00e9 poss\u00edvel utiliz\u00e1-los na defini\u00e7\u00e3o do plano de recursos. Com o uso de categorias, voc\u00ea pode ir al\u00e9m de uma simples delimita\u00e7\u00e3o de recursos por bancos de dados, voc\u00ea pode agrupar o I\/O independente do banco de origem.<\/p>\n<p style=\"text-align: justify;\">Al\u00e9m do controle atrav\u00e9s de categorias, o IORM pode utilizar somente bases de dados (dbPlan), mas este n\u00e3o consegue se integrar completamente com o plano de recursos da base de dados. O uso \u00e9 realizado de maneira indireta, somente atrav\u00e9s das m\u00e9tricas, sem qualquer possibilidade de ger\u00eancia ou direcionamento dos recursos.<\/p>\n<p style=\"text-align: justify;\">Antes de come\u00e7ar a defini\u00e7\u00e3o do plano de recursos do IORM deve-se analisar o conjunto das bases de dados que estar\u00e3o em execu\u00e7\u00e3o. Indo al\u00e9m, deve-se verificar quais os tipos de aplicativos e carga de trabalho existente. Com base nesse levantamento ser\u00e1 poss\u00edvel tra\u00e7ar quais os servi\u00e7os que podem ser criados, quais os <em>consumer groups<\/em> existentes e principalmente, quais as categorias de I\/O que s\u00e3o comuns entre as bases de dados.<\/p>\n<p style=\"text-align: justify;\"><!--more Continue lendo...--><\/p>\n<p style=\"text-align: justify;\">Caso a carga de trabalho sobre as bases de dados n\u00e3o seja conhecida, um question\u00e1rio pode ser elaborado para identificar qual a demanda. Como estamos falando de um plano de recursos que vai al\u00e9m do controle de CPU \u00e9 importante abordar aspectos como o tipo de consultas existentes, funcionalidades da aplica\u00e7\u00e3o (como carga de dados e afins), tipos relat\u00f3rios, uso de lobs, demanda por <em>throughput<\/em> ou tempo de resposta. Caso existam demandas distintas para a mesma base de dados \u00e9 importante identificar qual a prioridade entre elas. \u00c9 importante que estas d\u00favidas sejam respondidas pela equipe da aplica\u00e7\u00e3o (desenvolvedores, analistas, gerentes) por conhecerem (deveriam) a aplica\u00e7\u00e3o com mais detalhes. Mas este question\u00e1rio n\u00e3o deve ser a \u00fanica fonte de informa\u00e7\u00e3o, a an\u00e1lise realizada pelo DBA (an\u00e1lise das consultas, <em>top queries, top consumers<\/em>&#8230;) tamb\u00e9m \u00e9 fundamental.<\/p>\n<p style=\"text-align: justify;\">Com estas as respostas, pode-se identificar qual a demanda sobre o I\/O e CPU que estar\u00e1 no Exadata, permitindo criar os servi\u00e7os e <em>consumer groups<\/em> a fim de elaborar um plano adequado. Por parte do banco de dados a cria\u00e7\u00e3o destes pode ser atrav\u00e9s de SQL ou GridControl. A vers\u00e3o 12c do GridControl teve algumas mudan\u00e7as quanto \u00e0 localiza\u00e7\u00e3o e acesso ao <em>resource manager<\/em>, agora existe um menu dedicado a este. Apesar desta integra\u00e7\u00e3o com o IORM n\u00e3o houve qualquer altera\u00e7\u00e3o no uso do <em>resource manager<\/em> no banco de dados, o conceito e m\u00e9todos continuam os mesmos.<\/p>\n<p style=\"text-align: justify;\">Antes de continuarmos vamos tomar como exemplo o seguinte cen\u00e1rio:<\/p>\n<p style=\"text-align: justify;\">DB01, utilizado em ambiente OLTP contando com os servi\u00e7os abaixo:<\/p>\n<ul style=\"text-align: justify;\">\n<li>DB01_WEB: servi\u00e7o para conex\u00f5es dos aplicativos WEB, utilizado exclusivamente para OLTP. Alta demanda quanto a conex\u00f5es e CPU, necessidade por tempo de resposta.<\/li>\n<li>DB01_DESKTOP: servi\u00e7o para conex\u00f5es dos aplicativos DESKTOP, aplicativos com \u00eanfase em fun\u00e7\u00f5es administrativas e controle dos dados. Baixa demanda e necessidade por tempo de resposta.<\/li>\n<li>DB01_BATCH: servi\u00e7o utilizado para aplicativos de carga de dados e consolida\u00e7\u00f5es de dados. Demanda elevada fora do hor\u00e1rio comercial, (caso ocorra algum erro, o aplicativo pode ser executado com conjunto espec\u00edfico de dados) necessita de <em>throughput<\/em>.<\/li>\n<li>DB01_LINK: servi\u00e7o para conex\u00f5es via DBLINK entre as bases de dados, algumas MV\u2019s de outras bases acessam os dados atrav\u00e9s deste. Alta demanda 24&#215;7 e necessidade por tempo de resposta.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">DB02, utilizado em ambiente misto de OLTP e DSS, conta com os servi\u00e7os abaixo:<\/p>\n<ul style=\"text-align: justify;\">\n<li>DB02_WEB: servi\u00e7o para conex\u00f5es dos aplicativos WEB, utilizado principalmente para consultas, algumas informa\u00e7\u00f5es s\u00e3o oriundas do DB01 atrav\u00e9s de MV\u2019s. Demanda m\u00e9dia quanto a conex\u00f5es e CPU, necessita de tempo de tempo de resposta.<\/li>\n<li>DB02_DESKTOP: servi\u00e7o para conex\u00f5es dos aplicativos DESKTOP, aplicativos utilizado pela equipe de tomada de decis\u00e3o, manipula\u00e7\u00e3o de dados e relat\u00f3rios gerenciais. Baixa demanda por conex\u00e3o e alta para CPU, necessidade por tempo de resposta.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">No cen\u00e1rio acima podemos identificar que o DB01 poderia apresentar os seguintes <em>consumer groups<\/em> (em ordem de prioridade): WEB, LINK, DESKTOP, BATCH. J\u00e1 o DB02 apresenta (tamb\u00e9m em ordem de prioridade): DESKTOP e WEB. Para ambas as bases, os servi\u00e7os n\u00e3o foram agrupados em <em>consumer groups<\/em>, esse agrupamento ser\u00e1 realizado atrav\u00e9s de categorias o que facilita um controle mais apurado de toda a carga de I\/O do Exadata. De qualquer forma, as m\u00e9tricas do IORM permitem identificar os <em>consumer groups<\/em> e as suas demandas.<\/p>\n<p style=\"text-align: justify;\">Em ambas as bases existe um servi\u00e7o chamado SUPORTE que \u00e9 utilizado por qualquer atividade administrativa ou manuten\u00e7\u00e3o no modelo de dados. N\u00e3o \u00e9 o intuito apresentar aqui o plano de recursos de CPU, mas com o cen\u00e1rio acima pode-se ter uma id\u00e9ia da divis\u00e3o de recursos.<\/p>\n<p style=\"text-align: justify;\">Com base no cen\u00e1rio apresentado podemos identificar as seguintes categorias:<\/p>\n<ul style=\"text-align: justify;\">\n<li>ALTA: Categoria para I\/O que demanda uma alta prioridade e n\u00e3o pode sofrer interfer\u00eancia das outras. Utilizada pelos <em>consumer groups<\/em> WEB (DB01) e DESKTOP(DB02).<\/li>\n<li>MEDIA_ALTA: Categoria para I\/O com alta demanda, mas com prioridade mais baixa que a anterior, pode sofrer interfer\u00eancia de outras categorias. Utilizada pelo <em>consumer group<\/em> LINK (DB01).<\/li>\n<li>MEDIA: Categoria de I\/O de m\u00e9dia prioridade. Utilizado pelo <em>consumer groups<\/em> WEB (DB02)<\/li>\n<li>BAIXA: Categoria de baixa prioridade para I\/O. Utilizada pelos <em>consumer groups<\/em> DESKTOP e BATCH (ambos DB01).<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Para a cria\u00e7\u00e3o destas categorias nas bases de dados o \u00fanico m\u00e9todo dispon\u00edvel \u00e9 atrav\u00e9s de SQL e pela fun\u00e7\u00e3o CREATE_CATEGORY do pacote DBMS_RESOURCE_MANAGER. Assim, seguindo o cen\u00e1rio, temos:<\/p>\n<pre>BEGIN\r\n    DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();\r\n    DBMS_RESOURCE_MANAGER.CREATE_CATEGORY(CATEGORY =&gt; 'ALTA', COMMENT =&gt; 'Alta demanda.');\r\n    DBMS_RESOURCE_MANAGER.CREATE_CATEGORY(CATEGORY =&gt; 'MEDIA_ALTA', COMMENT =&gt; 'Media\/Alta demanda.');\r\n    DBMS_RESOURCE_MANAGER.CREATE_CATEGORY(CATEGORY =&gt; 'MEDIA', COMMENT =&gt;&nbsp;'Media demanda.');\r\n    DBMS_RESOURCE_MANAGER.CREATE_CATEGORY(CATEGORY =&gt; 'BAIXA', COMMENT =&gt; 'Baixa demanda.');\r\n    DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();\r\nEND;<\/pre>\n<p style=\"text-align: justify;\">Com o comando acima, podemos criar as categorias na base de dados. O comando acima cria todas as categorias, mas pode-se optar por criar somente as utilizadas e este deve ser executado em cada base de dados do ambiente. As categorias existentes na base de dados podem ser obtidas atrav\u00e9s da tabela \u201cdba_rsrc_categories\u201d.<\/p>\n<p style=\"text-align: justify;\">O mapeamento entre categorias e <em>consumer groups<\/em> \u00e9 realizado atrav\u00e9s da fun\u00e7\u00e3o UPDATE_CONSUMER_GROUP do pacote DBMS_RESOURCE_MANAGER (pode ser utilizado CREATE_CONSUMER_GROUP caso o <em>consumer group <\/em>esteja sendo criado). O mapeamento pode ser verificado atrav\u00e9s da tabela \u201cdba_rsrc_consumer_groups\u201d e pela coluna \u201ccategory\u201d.<\/p>\n<p style=\"text-align: justify;\">Para o DB01 do cen\u00e1rio ter\u00edamos:<\/p>\n<pre>BEGIN\r\n    DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();\r\n    DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(consumer_group =&gt; 'WEB', new_category =&gt; 'ALTA');\r\n    DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(consumer_group =&gt; 'DESKTOP', new_category =&gt; 'BAIXA');\r\n    DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(consumer_group =&gt; 'BATCH', new_category =&gt; 'BAIXA');\r\n    DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(consumer_group =&gt; 'LINK', new_category =&gt; 'MEDIA_ALTA');\r\n    DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();\r\nEND;<\/pre>\n<p style=\"text-align: justify;\">Para o banco DB02 ter\u00edamos:<\/p>\n<pre>BEGIN\r\n    DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();\r\n    DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(consumer_group =&gt; 'WEB', new_category =&gt; 'MEDIA');\r\n    DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(consumer_group =&gt; 'DESKTOP', new_category =&gt; 'ALTA');\r\n    DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();\r\nEND;<\/pre>\n<p style=\"text-align: justify;\">Assim, todo e qualquer I\/O que saia das bases DB01 ou DB02 recebe um selo\/marca\u00e7\u00e3o a qual pode ser identificada e tratada pelo software do Exadata. Agora podendo ser mensurada, tratada e enfileirada como um recurso pelo IORM independente da base de dados de origem.<\/p>\n<p style=\"text-align: justify;\">Sem o uso de categorias a \u00fanica granularidade existente seria por base de dados, em alguns casos esta granularidade por base de dados \u00e9 interessante, mas para outros n\u00e3o. Em casos de consolida\u00e7\u00e3o de bases de dados, ou aquelas que apresentam diversos servi\u00e7os\/cargas de trabalho uma granularidade mais fina \u00e9 desejada. Com o uso de categorias \u00e9 poss\u00edvel verificar quanto de I\/O est\u00e1 sendo utilizado e conseq\u00fcentemente quanto demandam um <em>consumer group<\/em> e um servi\u00e7o de uma base de dados. Tamb\u00e9m com o uso de categorias \u00e9 poss\u00edvel agrupar e priorizar as cargas de trabalho independente da base de origem.<\/p>\n<p style=\"text-align: justify;\">Um plano de recursos do IORM para o cen\u00e1rio proposto poderia ser:<\/p>\n<pre>ALTER IORMPLAN   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n   catPlan=( (name=ALTA, level=1, allocation=70),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n             (name=MEDIA_ALTA, level=2, allocation=60),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n             (name=MEDIA, level=3, allocation=50),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n             (name=BAIXA, level=4, allocation=80),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n             (name=OTHER, level=5, allocation=100) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-\r\n             ),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n    dbPlan=( (name=DB01, level=1, allocation=60),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n             (name=DB02, level=2, allocation=90),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n             (name=OTHER, level=3, allocation=100, flashCache=OFF)&nbsp;&nbsp;&nbsp;&nbsp; -\r\n             ),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\nobjective=low_latency<\/pre>\n<p style=\"text-align: justify;\">Como pode ser observado no plano acima, a divis\u00e3o \u00e9 feita por n\u00edveis como o <em>resource manager <\/em>do banco de dados, onde podem ser especificados at\u00e9 8 n\u00edveis com defini\u00e7\u00f5es de&nbsp;<em>allocation<\/em> ou <em>limit<\/em>. No caso do <em>limit<\/em> ele deve ser utilizado com cuidado, pois pode acabar impedindo que recursos n\u00e3o utilizados por outros bancos ou categorias sejam utilizados.<\/p>\n<p style=\"text-align: justify;\">Por exemplo, em um cen\u00e1rio onde o I\/O est\u00e1 saturado por categorias que n\u00e3o sejam dos dois primeiros n\u00edveis, e tiv\u00e9ssemos limitado a categoria MEDIA para 50% ao inv\u00e9s de utilizar <em>allocation<\/em>. Neste caso, pode ocorrer que recursos que tenham sobrado dos n\u00edveis anteriores n\u00e3o sejam utilizados pela categoria MEDIA e esta fique limitada com 50% sendo o excedente direcionado ao pr\u00f3ximo n\u00edvel. Com o uso de <em>allocation<\/em>, esta restri\u00e7\u00e3o n\u00e3o existe e a categoria poderia alocar mais do que foi definido.<\/p>\n<p style=\"text-align: justify;\">Tomando como exemplo o plano do exemplo, em caso de uma satura\u00e7\u00e3o do I\/O (entenda-se como satura\u00e7\u00e3o 100% de uso) o IORM come\u00e7aria a aplicar com mais rigor as regras definidas no plano. Algumas requisi\u00e7\u00f5es poderiam ser processadas imediatamente enquanto outras de n\u00edveis menos priorit\u00e1rios, ou que j\u00e1 tivessem extrapolado sua aloca\u00e7\u00e3o, poderiam ser enfileiradas.<\/p>\n<p style=\"text-align: justify;\">Assim, do total de requisi\u00e7\u00f5es de I\/O dispon\u00edveis, elas seriam divididas primeiramente entre as categorias do <em>catplan <\/em>e o valor de cada categoria seria dividido entre o <em>dbplan<\/em>. Pela defini\u00e7\u00e3o do <em>resource manager<\/em> o primeiro n\u00edvel receberia e dividiria o I\/O pelos seus consumidores, o que n\u00e3o foi alocado mais a sobra (n\u00e3o utilizado pelos consumidores do n\u00edvel) seriam repassados ao pr\u00f3ximo n\u00edvel e assim sucessivamente at\u00e9 o \u00faltimo n\u00edvel.<\/p>\n<p style=\"text-align: justify;\">Segundo o plano acima, 70% seria alocado para a categoria ALTA, o que n\u00e3o foi alocado (30%) juntamente com&nbsp;o que n\u00e3o foi utilizado seriam destinados ao n\u00edvel 2. Destes 70% da categoria ALTA, 60% seriam destinados ao DB01 (primeiro n\u00edvel), os 40% restantes mais o que n\u00e3o foi utilizado seria alocado (em 90%) pelo banco DB02. Somente ap\u00f3s o fim do que n\u00e3o foi utilizado pelo <em>dbPlan<\/em> o excedente seria disponibilizado para o pr\u00f3ximo n\u00edvel das categorias (isso seria considerado a sobra do n\u00edvel da categoria ALTA), assim primeiramente h\u00e1 uma libera\u00e7\u00e3o de recursos para o <em>catplan<\/em> que divide entre seus consumidores com base &nbsp;nas porcentagens do <em>dbplan<\/em>. Mesmo a exist\u00eancia do OTHERS no <em>dbplan<\/em> com 100% n\u00e3o impede ou aloca esta sobra, visto que nenhuma outra base tem esta categoria associada, e se outro banco existisse ele deveria estar especificado no plano.<\/p>\n<p style=\"text-align: justify;\">Pela defini\u00e7\u00e3o do IORM e <em>resource manager<\/em> do banco de dados a divis\u00e3o de I\/O ser\u00e1 primeiramente dentro do n\u00edvel e a sobra ser\u00e1 enviada ao pr\u00f3ximo n\u00edvel. Por exemplo, no plano abaixo existem duas categorias no n\u00edvel 2, o I\/O seria dividido entre a MEDIA_ALTA e MEDIA, mas o que n\u00e3o foi utilizado pela categoria MEDIA_ALTA (por exemplo) n\u00e3o seria repassado para a categoria MEDIA, ele seria repassado para o pr\u00f3ximo n\u00edvel.<\/p>\n<pre>ALTER IORMPLAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n    catPlan=( (name=ALTA, level=1, allocation=60),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n              (name=MEDIA_ALTA, level=2, allocation=50),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n              (name=MEDIA, level=2, allocation=40),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n              (name=BAIXA, level=3, allocation=80),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n              (name=OTHER, level=4, allocation=100)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -\r\n            )<\/pre>\n<p style=\"text-align: justify;\">\u00c9 importante resaltar dois aspectos no plano do IORM e daquele existente no banco de dados. A primeira \u00e9 com o coringa OTHER, ele serve para que qualquer outro I\/O que seja n\u00e3o&nbsp;categorizado ou oriundo de banco de dados possa ser controlado. Preferencialmente deve ser o n\u00edvel com menor prioridade e ser \u00fanico no n\u00edvel, assim n\u00e3o existir\u00e1 sobra de recursos. Por exemplo, tudo o que for origin\u00e1rio do servi\u00e7o SUPORTE ser\u00e1 direcionado a categoria OTHER pelo IORM.<\/p>\n<p style=\"text-align: justify;\">O segundo ponto \u00e9 com o valor de aloca\u00e7\u00e3o dos recursos, tanto de I\/O quanto CPU. Recomenda-se que n\u00e3o seja alocado 100% em um \u00fanico n\u00edvel (que n\u00e3o seja o \u00faltimo), isso permitir\u00e1 que os n\u00edveis posteriores possam receber recursos. &nbsp;Os valores alocados devem refletir a demanda da carga de trabalho. No Exadata estamos falando de um ambiente que pode entregar mais do que 20.000 IOPS, ent\u00e3o uma aloca\u00e7\u00e3o de 50% \u00e9 uma fatia alta. Al\u00e9m disso, quando categorias s\u00e3o utilizadas, os recursos e aloca\u00e7\u00f5es s\u00e3o referentes \u00e0 carga de trabalho exclusivos da categoria e n\u00e3o da base inteira.<\/p>\n<p style=\"text-align: justify;\">Algumas defini\u00e7\u00f5es adicionais podem ser especificadas no plano do IORM, o par\u00e2metro flasCache habilita ou n\u00e3o o uso do flash para as bases de dados. O flash pode ser desligado tanto para armazenamento de dados (flashCache) quanto para o uso na escrita de redo (flashLog). Assim, evita-se que bancos menos priorit\u00e1rios aloquem espa\u00e7o na flash.<\/p>\n<p style=\"text-align: justify;\">Al\u00e9m disso, pode-se especificar o \u201cmodo de otimiza\u00e7\u00e3o\u201d que o IORM ir\u00e1 seguir. O par\u00e2metro \u201cobjective\u201d pode ser definido como:<\/p>\n<ul style=\"text-align: justify;\">\n<li><em>low_latency<\/em>: este modo \u00e9 dedicado a bases OLTP onde a lat\u00eancia no acesso aos discos deve ser a menor poss\u00edvel. Em detrimento, o IORM faz um balanceamento no uso do disco evitando um consumo excessivo por <em>large I\/O<\/em>.<\/li>\n<li><em>balanced<\/em>: modo balanceado entre OLTP e DSS, utilizado no caso de cargas de trabalhos mistas destes. Neste, o IORM permite um uso maior de <em>large I\/O<\/em>, aumentando o <em>throughput<\/em>.<\/li>\n<li><em>high_throughput<\/em>: Utilizado em cargas de trabalho exclusivamente DSS, onde o uso de <em>large I\/O<\/em> \u00e9 maioria.<\/li>\n<li><em>auto<\/em>: neste modo o IORM analisa as requisi\u00e7\u00f5es e faz o ajuste autom\u00e1tico entre os modos para OLTP e DSS.<\/li>\n<li><em>off<\/em>: modo padr\u00e3o e nenhuma otimiza\u00e7\u00e3o \u00e9 realizada.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Para contextualizar, <em>large I\/O <\/em>s\u00e3o requisi\u00e7\u00f5es que acessam 128KB ou mais por vez. Em cargas de trabalho que s\u00e3o basicamente OLTP o uso de <em>small I\/O<\/em> (menos de 128KB por requisi\u00e7\u00e3o) \u00e9 o que ocorre em sua maioria. Este tipo de carga \u00e9 mais suscet\u00edvel a lat\u00eancia no acesso ao disco, necessitando de um acesso r\u00e1pido. Em cargas de trabalho DSS, o uso de <em>large I\/O<\/em> \u00e9 maioria e s\u00e3o mais suscet\u00edveis ao <em>throughput<\/em> de processamento, necessitam uma maior capacidade para entrega de I\/O do que baixa lat\u00eancia.<\/p>\n<p style=\"text-align: justify;\">Nos exemplos de planos de recursos acima, somente alguns aspectos foram demonstrados. Existem outras abordagens que podem ser seguidas, como por exemplo, a defini\u00e7\u00e3o somente do <em>dbplan<\/em> ou <em>catplan<\/em>. O IORM \u00e9 um assunto extenso, mas os exemplos tentaram abordar uma forma mais avan\u00e7ada de uso.<\/p>\n<p style=\"text-align: justify;\">Como pode ser observado, o uso do <em>catplan<\/em> em conjunto com o <em>dbplan<\/em> apresenta diversas vantagens. Podemos ter um controle maior sobre todo o caminho, desde a requisi\u00e7\u00e3o do usu\u00e1rio, at\u00e9 o I\/O. Com o IORM podemos responder a algumas quest\u00f5es do dia a dia com maior facilidade, por exemplo, quanto cada servi\u00e7o ou aplicativo do banco de dados gasta em IOPS, lat\u00eancia, espera e afins?<\/p>\n<p style=\"text-align: justify;\">A manuten\u00e7\u00e3o e o monitoramente constante do IORM e do <em>resource manager<\/em> do banco de dados s\u00e3o necess\u00e1rios. Como sabemos a carga de trabalho sobre o banco de dados pode ser din\u00e2mica e o plano de recursos necessitarem de ajustes. Para o monitoramento do IORM s\u00e3o utilizadas m\u00e9tricas do storage do Exadata.<\/p>\n<p style=\"text-align: justify;\">Por fim, qual o storage tem este controle sobre o I\/O sem a necessidade de altera\u00e7\u00e3o na aplica\u00e7\u00e3o? At\u00e9 o momento n\u00e3o foi necess\u00e1ria nenhuma altera\u00e7\u00e3o na base de dados (tablespaces ou \u00edndices) ou no aplicativo, somente a string de conex\u00e3o.&nbsp; Como j\u00e1 exposto pela Oracle, Exadata n\u00e3o \u00e9 s\u00f3 hardware, \u00e9 software tamb\u00e9m.<\/p>\n<p style=\"text-align: justify;\">No pr\u00f3ximo post falarei sobre o monitoramento, as m\u00e9tricas do IORM e algumas novidades das \u00faltimas vers\u00f5es.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao falar de IORM, deve-se lembrar que ele \u00e9 somente uma parte do processo. Como j\u00e1 citei em posts anteriores, o IORM \u00e9 um resource manager semelhante ao encontrado no banco de dados, sendo chamado de interdatabase enquanto o resource manager do banco de dados \u00e9 chamado de intradatabase. O IORM deve ser somente uma [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6,8,5,9],"tags":[],"class_list":["post-19","post","type-post","status-publish","format-standard","hentry","category-exadata","category-iorm","category-oracle","category-storage-server"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>IORM - Parte III - Fernando Simon<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IORM - Parte III - Fernando Simon\" \/>\n<meta property=\"og:description\" content=\"Ao falar de IORM, deve-se lembrar que ele \u00e9 somente uma parte do processo. Como j\u00e1 citei em posts anteriores, o IORM \u00e9 um resource manager semelhante ao encontrado no banco de dados, sendo chamado de interdatabase enquanto o resource manager do banco de dados \u00e9 chamado de intradatabase. O IORM deve ser somente uma [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/\" \/>\n<meta property=\"og:site_name\" content=\"Fernando Simon\" \/>\n<meta property=\"article:published_time\" content=\"2012-04-20T03:13:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-09-13T23:27:54+00:00\" \/>\n<meta name=\"author\" content=\"Simon\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/\"},\"author\":{\"name\":\"Simon\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9\"},\"headline\":\"IORM &#8211; Parte III\",\"datePublished\":\"2012-04-20T03:13:26+00:00\",\"dateModified\":\"2019-09-13T23:27:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/\"},\"wordCount\":2677,\"commentCount\":2,\"articleSection\":[\"Exadata\",\"IORM\",\"Oracle\",\"Storage Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/\",\"url\":\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/\",\"name\":\"IORM - Parte III - Fernando Simon\",\"isPartOf\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#website\"},\"datePublished\":\"2012-04-20T03:13:26+00:00\",\"dateModified\":\"2019-09-13T23:27:54+00:00\",\"author\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.fernandosimon.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IORM &#8211; Parte III\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#website\",\"url\":\"https:\/\/www.fernandosimon.com\/blog\/\",\"name\":\"Fernando Simon\",\"description\":\"Have you hugged your backup today?\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.fernandosimon.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9\",\"name\":\"Simon\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g\",\"caption\":\"Simon\"},\"sameAs\":[\"http:\/\/www.fernandosimon.com\"],\"url\":\"https:\/\/www.fernandosimon.com\/blog\/author\/simon\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"IORM - Parte III - Fernando Simon","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/","og_locale":"en_US","og_type":"article","og_title":"IORM - Parte III - Fernando Simon","og_description":"Ao falar de IORM, deve-se lembrar que ele \u00e9 somente uma parte do processo. Como j\u00e1 citei em posts anteriores, o IORM \u00e9 um resource manager semelhante ao encontrado no banco de dados, sendo chamado de interdatabase enquanto o resource manager do banco de dados \u00e9 chamado de intradatabase. O IORM deve ser somente uma [&hellip;]","og_url":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/","og_site_name":"Fernando Simon","article_published_time":"2012-04-20T03:13:26+00:00","article_modified_time":"2019-09-13T23:27:54+00:00","author":"Simon","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#article","isPartOf":{"@id":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/"},"author":{"name":"Simon","@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9"},"headline":"IORM &#8211; Parte III","datePublished":"2012-04-20T03:13:26+00:00","dateModified":"2019-09-13T23:27:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/"},"wordCount":2677,"commentCount":2,"articleSection":["Exadata","IORM","Oracle","Storage Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/","url":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/","name":"IORM - Parte III - Fernando Simon","isPartOf":{"@id":"https:\/\/www.fernandosimon.com\/blog\/#website"},"datePublished":"2012-04-20T03:13:26+00:00","dateModified":"2019-09-13T23:27:54+00:00","author":{"@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9"},"breadcrumb":{"@id":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.fernandosimon.com\/blog\/iorm-parte-iii\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.fernandosimon.com\/blog\/"},{"@type":"ListItem","position":2,"name":"IORM &#8211; Parte III"}]},{"@type":"WebSite","@id":"https:\/\/www.fernandosimon.com\/blog\/#website","url":"https:\/\/www.fernandosimon.com\/blog\/","name":"Fernando Simon","description":"Have you hugged your backup today?","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.fernandosimon.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9","name":"Simon","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g","caption":"Simon"},"sameAs":["http:\/\/www.fernandosimon.com"],"url":"https:\/\/www.fernandosimon.com\/blog\/author\/simon\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5ofTp-j","_links":{"self":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/posts\/19","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/comments?post=19"}],"version-history":[{"count":0,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/posts\/19\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/media?parent=19"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/categories?post=19"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/tags?post=19"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}