Lomadee, uma nova espécie na web. A maior plataforma de afiliados da América Latina.

sexta-feira, março 01, 2013

Ajustando o Linux para Asterisk

O Asterisk, assim como qualquer outro processo no Linux (e basicamente em qualquer Unix/Unix-like) estará limitado pelas definições de limites do sistema hospedeiro, sejam elas de nível global ou de usuário.

Um dado usuário, que para este artigo será asterisk, terá alguns limites definidos de forma global ao sistema (seja via builtin, seja via /etc/security/limits.conf, seja via /etc/sysctl.conf). Cabe ao proponente a administrador ou especialista conhecer estes limites e ajustá-los de acordo com a necessidade do sistema em questão.

Exemplo em um sistema Debian 6.0.7 sem tunning:

$ id asterisk
uid=111(asterisk) gid=116(asterisk) groups=20(dialout),29(audio),116(asterisk)

File Descriptors in Kernel Memory
$ /sbin/sysctl fs.file-nr
fs.file-nr = 1664       0       1646085 (alocados/pré-alocação/máximo)

Max Files
$ /sbin/syscrl fs.file-max
fs.file-max = 1646085

$ ulimit -Ha (hard limits)
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

O limite em open files é baixo para um sistema que planeja processar muitas chamadas, e deve ser ajustado.

$ ulimit -Sa (soft limits)
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

O soft limite está igual ao hard limit para open files. Será que posso digitar o comando que me foi indicado como a solução dos meus problemas?

$ ulimit -n 32768
-bash: ulimit: open files: cannot modify limit: Operation not permitted

Não! Olhe no ulimit -Hn que você verá que o limite máximo está igual ao soft limit. O administrador de sistemas/especialista pode editar o /etc/security/limits.conf e acrescentar duas linhas que irão elevar os limites para o usuário em questão:

asterisk        soft    nofile  1024
asterisk        hard    nofile  32768

No Debian, é necessário editar o arquivo /etc/pam.d/common-session e /etc/pam.d/common-session-noninteractive e adicionar a linha abaixo, para que sejam carregados para o usuário quando este iniciar uma sessão no sistema (seja ela interativa ou não)

session required pam_limits.so

Iniciando uma nova sessão com o usuário asterisk, estes serão os resultados:

$ ulimit -Ha (hard limit, só o sys-admin muda)
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 32768
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Veja que o limite a nível global agora é maior, mas como está o limite do usuário?

$ ulimit -Sa (soft limit, o próprio user muda)
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Não atende às necessidades ainda, será que agora é possível alterar?

$ ulimit -n 10240

Sim! Pois o limite global foi alterado e o usuário pode mudar até aquele máximo global. Vamos ver como ficou:

$ ulimit -Sa

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Os exemplos acima são apenas algumas áreas que podem ser melhoradas. Vamos fazer algo relativo ao sistema agora, começando por checar o número máximo para fs.file-max:

$ /sbin/sysctl fs.file-max
fs.file-max = 1646085

E como está o uso? O comando abaixo, retornará a quantidade em uso, a pré-alocada e a máxima, apresentada no comando anterior:

$ /sbin/sysctl fs.file-nr
fs.file-nr = 1568       0       1646085

Experimente aumentar o número máximo de arquivos abertos:

# sysctl -w fs.file-max

Quando chegar em um valor seguro, aplique editando o /etc/sysctl.conf e alterar/adicionar a linha com fs.file-max

fs.file-max =

Execute em seguida:

# sysctl -p

E quanto a conexões de rede?

Experimente com a otimização da memória do TCP/IP a ser usada em setsockopt()

net.ipv4.tcp_rmem
net.ipv4.tcp_wmem

Portas para novas conexões:

net.ipv4.ip_local_port_range =

Aumente os valores de auto-tune em:

net.core.rmem_max
net.core.wmem_max
net.core.netdev_max_backlog
net.ipv4.tcp_window_scaling = 1

Se for ter muitos processos:

kernel.pid_max

Posteriormente, novos pontos de melhoria serão apresentados.

2 comentários:

fabiosammy disse...

Valeu cara, não estou acostumado a trabalhar com o sysctl, tem alguma dica de onde posso procurar informações sobre um "how to", ou o que cada parâmetro significa? Principalmente relacionado a VOIP, sempre trabalhei com TCP/IP no procolo HTTP, mas comecei agora com VOIP.

Alexandre Alencar disse...

Na própria manpage do sysctl e syctl.conf você encontrará maiores detalhes sobre cada um dos parâmetros.