Por motivos de segurança e para racionalizar melhor os recursos computacionais, o instalador do Oracle Database geralmente pede a definição de alguns limites ao usuário de S.O que rodará o software. Dentro disso, um dos limites impostos é o de número de processos que podem ser abertos. É um conceito simples, mas vamos demonstrar a implementação dessa regra em 2 S.Os diferentes.
Oracle Linux
Versão:
[root@oel7 ~]# cat /etc/*release*
Oracle Linux Server release 7.7
NAME="Oracle Linux Server"
VERSION="7.7"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.7"
PRETTY_NAME="Oracle Linux Server 7.7"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:7:7:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"
ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7"
ORACLE_BUGZILLA_PRODUCT_VERSION=7.7
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=7.7
Red Hat Enterprise Linux Server release 7.7 (Maipo)
Oracle Linux Server release 7.7
cpe:/o:oracle:linux:7:7:server
Criando um usuário novo para os testes:
[root@oel7 ~]# useradd swiv
[root@oel7 ~]# passwd swiv
Changing password for user swiv.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@oel7 ~]#
É possível validar que nesta VM de laboratório, já existia 2 arquivos de limits (para os usuários oracle e grid). Criando mais um para nosso novo usuário:
[root@oel7 etc]# cd security/limits.d/
[root@oel7 limits.d]# ll
total 12
-rw-r--r--. 1 root root 191 Jan 28 2018 20-nproc.conf
-rw-r--r--. 1 root root 1185 Apr 25 2020 grid-database-preinstall-19c.conf
-rw-r--r--. 1 root root 1205 Apr 24 2020 oracle-database-preinstall-19c.conf
[root@oel7 limits.d]# touch swiv.conf
[root@oel7 limits.d]#
Definindo um limite dentro do arquivo:
[root@oel7 limits.d]# cat swiv.conf
swiv soft nproc 2
swiv hard nproc 3
[root@oel7 limits.d]#
Conectando com o usuário já é possivel notar que por termos definido uma quantidade insuficiente (possivelmente pelo S.O abrir outros processos filhos para controle), é reportada a mensagem de fork:
Definindo novos parâmetros:
[root@oel7 limits.d]# cat swiv.conf
swiv soft nproc 200
swiv hard nproc 300
[root@oel7 limits.d]#
Agora é possível conectar sem mensagens de erro:
Outra maneira de fazer esta limitação é editando o arquivo “/etc/security/limits.conf”. Para testá-lo, vou remover o swiv.conf e proceder com o novo teste:
[root@oel7 limits.d]# pwd
/etc/security/limits.d
[root@oel7 limits.d]# rm -rf swiv.conf
[root@oel7 limits.d]# cd ..
[root@oel7 security]# cat limits.conf | grep swiv
swiv soft nproc 2
swiv hard nproc 3
[root@oel7 security]#
Vemos que a limitação é executada na tentativa de login:
Oracle Solaris
Versão do S.O:
root@solariSWIV:~# cat /etc/*release*
NAME="Oracle Solaris"
PRETTY_NAME="Oracle Solaris 11.4"
CPE_NAME="cpe:/o:oracle:solaris:11:4"
ID=solaris
VERSION=11.4
VERSION_ID=11.4
BUILD_ID=11.4.0.0.1.15.0
HOME_URL="https://www.oracle.com/solaris/"
SUPPORT_URL="https://support.oracle.com/"
Oracle Solaris 11.4 X86
Copyright (c) 1983, 2018, Oracle and/or its affiliates. All rights reserved.
Assembled 16 August 2018
Criando usuário de teste e definindo senha:
root@solariSWIV:~# useradd swiv
root@solariSWIV:~# passwd swiv
New Password:
Re-enter new Password:
passwd: password successfully changed for swiv
Ao logar com o novo usuário, é possível notar um limite já definido:
Agora vamos tentar delimitar utilizando o arquivo “/etc/system”. Em minhas investigaçoes, cheguei à conclusão que este parâmetro vale para o S.O como um todo (ou seja, não consigo limitar por usuário). Além disso, um restart é necessário. Sendo assim, o que vou fazer é apenas para fins didáticos, não deve ser executado em ambiente corporativo.
root@solariSWIV:~# id swiv
uid=100(swiv) gid=10(staff)
root@solariSWIV:~# cat /etc/system | grep maxusers
* set maxusers=40
set maxusers = 500
root@solariSWIV:~#
Reinciando o S.O e depois, conectado com o novo usuário, vamos executar o comando abaixo para atingir o limite imposto acima:
root@solariSWIV:~# reboot
uid=100(swiv) gid=10(staff)
-bash-4.4$ : () { :|:& };:
[1] 1353
-bash-4.4$
-bash-4.4$ -bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
Consideração 1: É possível nas versões mais recentes do Oracle Solaris definir alguns limites utilizando o “Resource Control”. Em resumo, cria-se uma abstração lógica chamada “projects”, onde pode-se associar com os grupos. E a limitação é feita na camada de projets, e herdada para os grupos e usuários que o compõem. Porém, os parâmetros para este tipo de cenário não contemplam a quantidade máxima de processos.
Consideração 2: Engajei muito tempo neste cenário do Oracle Solaris, mas ainda não estou plenamente convicto que estou com o entendimento pleno. Caso tenha falhado em alguma informação, e tenha algum colega com alguma consideração, eu agradeceria!