Skip to main content

Command Palette

Search for a command to run...

Como resolver o erro bash: fork: retry: Resource temporarily unavailable durante o I O Calibrate

Updated
3 min read
Como resolver o erro bash: fork: retry: Resource temporarily unavailable durante o I O Calibrate

Durante a execução do I/O Calibrate no Oracle 19.25 com Oracle Enterprise Linux 9 (OEL9), obtive a seguinte mensagem após o procedimento ter sido executado por 12 minutos.

SET SERVEROUTPUT ON
DECLARE
lat  INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat);
DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
DBMS_OUTPUT.PUT_LINE ('latency  = ' || lat);
DBMS_OUTPUT.PUT_LINE ('max_mbps = ' || mbps);
END;
/

Após aproximadamente 12 minutos, o erro abaixo passou a aparecer em qualquer comando executado no bash do Linux.

-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable

Inicialmente, considerei a hipótese de que a quantidade de processos tivesse excedido os limites configurados, porém, ao executar o comando:

[oracle@node1 limits.d]$ ps -ef | grep oracle | wc -l 
2413

Ok, em processos Oracle so tenho 2413 ativos, porque esta acontecendo isso…????

Mas outra coisa me chamou atenção no vmstat durante a execução/problema.

root@node1 ~]# vmstat 1 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1 16449      0 418050816 226100 6115824    0    0  5457    16   58   56  1  1 60 37  0
 6 16446      0 418047904 226108 6116228    0    0 344089    89 132928 425784  3  2  0 95  0
 3 16454      0 418043136 226108 6116152    0    0 346177   634 119197 404523  2  2  0 95  0
 2 16455      0 418041888 226116 6116144    0    0 347153   236 82672 351030  0  2  0 98  0
 0 16442      0 418049952 226116 6116172    0    0 347193     2 82877 350616  0  2  0 98  0
 0 1293      0 418054656 226116 6116176    0    0 113793    13 64679 255913  0  2  0 98  0
 7 16440      0 417885696 226124 6116204    0    0 483856   622 149115 526313 11  4  2 83  0
 5 16443      0 417884416 226124 6116204    0    0 351673   633 140787 529131  6  3  0 91  0
 9 16441      0 417879456 226132 6116248    0    0 353833   322 141966 534006  6  3  0 91  0
 6 16448      0 417879200 226132 6116260    0    0 355265     2 142702 534330  6  3  0 90  0
 1 16451      0 417878208 226132 6116264    0    0 364186     2 147385 547224  7  3  0 90  0

Na saída do comando vmstat, o campo b, localizado sob a seção procs, representa o número de processos ou threads bloqueados que estão aguardando a conclusão de operações de I/O. No caso em análise, esse comportamento foi observado durante a execução do I/O Calibrate do Oracle, que realiza testes intensivos de leitura e escrita no storage para medir desempenho.

Em determinado momento, o valor do campo b atingiu 16.451 threads bloqueadas, indicando que milhares de threads do Oracle estavam simultaneamente em espera por I/O. Após ultrapassar a marca de 16.000, o ambiente começou a apresentar falhas, evidenciando um possível gargalo no subsistema de I/O. Depois de uma análise detalhada, identifiquei a causa raiz do problema…

 cat /etc/security/limits.d/oracle-database-preinstall-19c.conf

# oracle-database-preinstall-19c setting for nproc soft limit is 16384
oracle   soft   nproc    16384

# oracle-database-preinstall-19c setting for nproc hard limit is 16384
oracle   hard   nproc    16384

Pronto, aí estava o problema. No arquivo oracle-database-preinstall-19c.conf, o valor padrão é 16384, e durante o processo foram alocados 16451, ocasionando o erro de “fork”.

Diante disso, alterei os limites soft e hard para 32384, e o problema não voltou a ocorrer durante a execução do I/O Calibrate.

# refer orabug15971421 for more info.
oracle   soft   nproc    32384

# oracle-database-preinstall-19c setting for nproc hard limit is 16384
oracle   hard   nproc    32384

Pra garantir a aplicação eu reiniciei os hosts em modo rolling, apois o incremento dos valores o erro -bash: fork: retry: Resource temporarily unavailable nao ocorreu mais.

É isso pessoal, qualquer coisa só me chamar no LinkedIn 🙂