Como alterar os limites de profundidade da pilha em /etc/security/limits.d/ e fazer as alterações se aplicarem aos serviços na inicialização

5

Meu sistema

  • Série de Servidores Ubuntu 14.04.5 (x86_64), mantida atualizada
  • Meu aplicativo é necessário Eu aumento a profundidade da pilha para postgres
  • Eu criei um arquivo em /etc/security/limits.d/myapplication.conf
  • O arquivo myapplication.conf tem a linha: * - stack 131072
  • Observe que 131072KB == 128MB
  • Ao criar este arquivo myapplication.conf , meu ulimit -s retorna: 131072
  • Eu então editei meu arquivo /etc/postgresql/9.3/main/postgresql.conf e anexei a linha: max_stack_depth = 126MB


Meu problema

Durante a inicialização, a seguinte mensagem aparece:

 * The PostgreSQL server failed to start. Please check the log output:
2018-01-24 09:27:53 MST LOG:  invalid value for parameter "max_stack_depth": 129024
2018-01-24 09:27:53 MST DETAIL:  "max_stack_depth" must not exceed 7680kB.
2018-01-24 09:27:53 MST HINT:  Increase the platform's stack depth limit via "ulimit -s" or local equivalent.
2018-01-24 09:27:53 MST FATAL:  configuration file "/etc/postgresql/9.3/main/postgresql.conf" contains errors
 * Starting Mount network filesystems                                    [ OK ]
 * Starting PostgreSQL 9.3 database server        * Stopping Mount networ[ OK ]systems
                                                                                             [fail] 

Isso, por sua vez, faz com que meu serviço de aplicativo falhe, pois dependo dos meus bancos de dados. Após a inicialização, se eu iniciar o serviço postgres, tudo bem:

dev@wipn:~$ sudo service postgresql start
 * Starting PostgreSQL 9.3 database server                                                                                                                                                                                                                                                                             [ OK ] 
dev@wipn:~$ 

Meu palpite é que os efeitos de /etc/security/limits.d/myapplication.conf só são aplicados em um estágio durante a inicialização, após o sistema tentar iniciar o postgres. Então, talvez uma solução óbvia seja apenas mudar quando eu começar o postgres, tudo bem e eu posso lidar com isso.


Minha pergunta

Qual é a maneira de mudar a profundidade da pilha do kernel, de forma que eu precise fazer apenas alterações mínimas em meus servidores?

Eu quero algo o mais limpo possível. Eu quero que ele suporte atualizações e, de preferência, seja aplicável a outras distros. Eu gerencio minhas coisas através de jogadas Ansible, então eu prefiro escrever uma jogada limpa para isso.

Pode ser simplesmente o caso de alterar a ordem de início dos meus serviços como a melhor resolução. Alguém aí sabe de outras opções adequadas?


Atualizações em execução de coisas que tentei

Aqui está minha lista de execução de algumas das coisas que tentei, sem sucesso.

Em /etc/security/limits.d/myapplication.conf :

  • postgres - stack 131072
  • * - stack 131072 root - stack 131072
por James T Snell 24.01.2018 / 18:03

1 resposta

0

Até que alguém possa me dar uma solução limpa, é isso que eu tenho, e é uma droga. Eu não vou aceitar isso como a resposta à minha pergunta, mas aqui está (gags). Pelo menos funciona.


Histórico

Parece que as alterações em / etc / security / limits. * nunca afetam os serviços, mas sim as coisas sendo executadas no shell. Então, isso faz com que minhas alterações em / etc / security / limits. * sejam completamente sem sentido. ( insira o cussing aqui ). Eu já deletei meu /etc/security/limits.d/myapplication.conf .


Alterando os limites de tamanho de pilha para postgres

Esta é uma solução de lixo. Eu odeio isso.

Eu editei meu "/usr/share/postgresql-common/init.d-functions", especificamente a função start () , para aparecer como:

...
# start all clusters of version $1
# output according to Debian Policy for init scripts
start() {
    ulimit -s 131072    #JTS: To avoid Issue #XYZ 

    # create socket directory
    if [ -d /var/run/postgresql ]; then
        chmod 2775 /var/run/postgresql
    else
    ...

Obviamente, adicionei a linha ulimit. É nojento para mim modificar esse arquivo porque espero que ele seja constantemente alterado por atualizações. Pelo menos eu tenho uma regra Ansible para impor que existe.


Minha solução Ansible

Aqui está a tarefa Ansible que criei para impor essa alteração de configuração:

- blockinfile:
    dest: /usr/share/postgresql-common/init.d-functions
    block: |
          ulimit -s 131072
    backup: yes
    insertafter: '^start\(\) \{'
    state: present

Esta tarefa Ansible resulta na função com esta aparência:

...
# start all clusters of version $1
# output according to Debian Policy for init scripts
start() {
# BEGIN ANSIBLE MANAGED BLOCK
ulimit -s 131072
# END ANSIBLE MANAGED BLOCK
    # create socket directory
    if [ -d /var/run/postgresql ]; then
       ...


Nota: Serviços Upstart Ignorar / etc / security / limits

Parece que / etc / security / limits. * é ignorado pelo Upstart, que o Ubuntu 14.04 usa. Meu serviço de aplicativo realmente usa upstart e pode-se inserir uma linha para o upstart que se parece com:

limit stack <softlimit> <hardlimit>

O Ubuntu mudou para o systemd depois de 14.04, então este arriscado tid-bit irá se tornar irrelevante.

Isso não é relevante para minha pergunta, porque em 14.04, postgresql não é gerenciado por upstart.

    
por 26.01.2018 / 01:15