Stress Test de Oracle + AIX JFS2: JFS2 Cache, JFS2 Direct I/O ou JFS2 Concurrent I/O?
segunda-feira, dezembro 14th, 2009Adoro 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




