Stress Test de Oracle + AIX JFS2: JFS2 Cache, JFS2 Direct I/O ou JFS2 Concurrent I/O?

Adoro testar, pois sou daqueles que só acredita vendo. E acho que os DBAs devem ser assim.

Este teste foi realizado em um servidor IBM novíssimo, rodando AIX 5.3, em um Storage se última linha, e Oracle 9.2.0.8.
O teste foi feito em um ambiente real, pois deve basear a decisão sobre como será a utilização deste ambiente em produção.

Para executar este teste, utilizei esta sequência de comandos em um arquivo .sql.

CREATE TABLE T AS SELECT * FROM DBA_SOURCE;

SET TIMING ON

ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
INSERT INTO T SELECT * FROM T;
COMMIT;
SELECT TO_CHAR(SUM(BYTES)) FROM DBA_SEGMENTS WHERE OWNER = ‘SYS’ AND SEGMENT_NAME = ‘T’;
ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;

ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
INSERT INTO T SELECT * FROM T;
COMMIT;
SELECT TO_CHAR(SUM(BYTES)) FROM DBA_SEGMENTS WHERE OWNER = ‘SYS’ AND SEGMENT_NAME = ‘T’;
ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;

ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
INSERT INTO T SELECT * FROM T;
COMMIT;
SELECT TO_CHAR(SUM(BYTES)) FROM DBA_SEGMENTS WHERE OWNER = ‘SYS’ AND SEGMENT_NAME = ‘T’;
ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;

ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
INSERT INTO T SELECT * FROM T;
COMMIT;
SELECT TO_CHAR(SUM(BYTES)) FROM DBA_SEGMENTS WHERE OWNER = ‘SYS’ AND SEGMENT_NAME = ‘T’;
ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;

ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
INSERT INTO T SELECT * FROM T;

COMMIT;
SELECT TO_CHAR(SUM(BYTES)) FROM DBA_SEGMENTS WHERE OWNER = ‘SYS’ AND SEGMENT_NAME = ‘T’;
ALTER SESSION SET EVENTS = ‘IMMEDIATE TRACE NAME FLUSH_CACHE’;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T;

Reparem no comando ALTER SESSION feito para esvaziar o db_cache_size do Oracle, para que uma sequência de testes não influenciasse positivamente a próxima.

Vejam que executei a sequência se INSERT e SELECTs 5 vezes, de forma que a tabela T sempre crescia, começando com apenas 800MB, e terminando com 7GB. Utilizei um db_cache_size de 512MB, relativamente pequeno, pois o propósito é medir a velocidade dos filesystems.

Executei este arquivos 3 veses: uma com o JFS2 com as opções default (ou seja, com Caché de dados do JFS2), outra com o JFS2 com Direct I/O, e outra com JFS2 com Concurrent I/O – uma evolução do Direct I/O. Adicionalmente, em todos os testes foi utilizado também Asynchronous I/O.
Após uma sequência, eu desligava a instância do Oracle, desmontava o filesystem, e o remontava com a opção do próximo teste.

prd05 /> umount /prddb9i
prd05 /> mount -o cio /prddb9i

Para utilizar estas opções, é necessário deixar o parâmetro do Oracle filesystemio_options em SET_ALL. Não há problemas em deixar este parâmetro com o valor SET_ALL se o DIO ou CIO não estiverem em uso no filesystem, pois o Oracle tentará utilizar as features, e se elas não existirem, não há problemas.

O resultado foi muito interessante.

Em gravações, a análise é fácil: o CIO é, nos tempos individuais e total, 3 vezes mais rápido que o JFS2 com suas configurações Default.
Nas leituras, embora no tempo total o CIO ganhe, ele só ganha quando os dados não estão no Caché do Oracle, ou seja, são lidos diretamente do disco.

Como a maioria das operações do nosso ambiente são de leitura, e seu Buffer Caché Hit Ratio (esse é um dos poucos casos onde o BCHR é útil, este tipo de decisão) é de 90% (parece alto, mas um índice bom é >96%), não vale a pena utilizarmos CIO ou DIO do JFS2 neste ambiente.

Resultado dos INSERTs

Resultado dos SELECTs

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.