6 votos

Cómo cambiar la pila límites de profundidad en /etc/security/limits.d/ y que los cambios se aplican a los servicios en el arranque

Mi sistema

  • Serie de Ubuntu 14.04.5 (x86_64) Servidores, mantenerse actualizado
  • Mi aplicación tengo que aumentar la profundidad de la pila para postgres
  • He creado un archivo en /etc/security/limits.d/myapplication.conf
  • El myapplication.conf archivo tiene la línea: * - stack 131072
  • Tenga en cuenta que 131072KB == 128MB
  • Después de hacer esta myapplication.conf archivo, mi ulimit -s devuelve: 131072
  • Luego he editado mi /etc/postgresql/9.3/main/postgresql.conf archivo y añadir la línea: max_stack_depth = 126MB




Mi problema

Durante el arranque, aparece el siguiente mensaje:

 * 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] 

Esto a su vez hace que mi servicio de aplicación a continuación, se producirá, como yo dependo de mis bases de datos. Después del arranque, si puedo iniciar el servicio de postgres, está bien:

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

Mi conjetura es que los efectos de /etc/security/limits.d/myapplication.conf sólo se aplican en una fase durante el arranque que después cuando mi sistema intenta iniciar postgres. Así, tal vez, una solución obvia es cambiar sólo cuando empiezo a postgres, que está bien y puedo manejar eso.


Mi Pregunta

Lo que es una manera de cambiar el kernel de la pila de profundidad, de tal manera que sólo tengo que hacer un mínimo de alteraciones a mis servidores?

Quiero algo tan limpia como sea posible. Quiero resistir a las actualizaciones y, preferentemente, ser aplicable a otras distros. Puedo administrar mis cosas a través de Ansible juega, así que prefiero escribir un juego limpio para esto.

Puede ser simplemente que cambiar el orden de inicio de mis servicios es la mejor resolución. Alguien sabe de otras opciones adecuadas?


Ejecuta las Actualizaciones de cosas que he probado

Aquí está mi lista de algunas de las cosas que he probado, sin éxito.

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

  • postgres - stack 131072
  • * - stack 131072 root - stack 131072

1voto

Jonatham Puntos 31

Hasta que alguien me puede dar una solución limpia, esto es lo que he encontrado, y es una mierda. Yo no voy a aceptar esto como LA respuesta a mi pregunta, pero aquí está (gags). Al menos funciona.


De fondo

Parece que los cambios en /etc/security/limits.* nunca el impacto de los servicios, sino más bien cosas de ser ejecutados a partir de la cáscara. Así, ese tipo de hace mis cambios en /etc/security/limits.* bastante sin sentido. (insertar maldiciones aquí). Ahora he eliminado mi /etc/security/limits.d/myapplication.conf.


Cambiar el Tamaño de la Pila límites para postgres

Esto es una basura de solución. La odio.

He editado mi "/usr/share/postgresql-común/init.d-funciones", específicamente el start() de la función, 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 he añadido el ulimit línea. Es repugnante para mí para modificar este archivo porque me esperan para ser perpetuamente cambiado a través de actualizaciones. Al menos tengo un Ansible la regla a aplicar es que existe.


Mi Ansible solución

Aquí está el Ansible tarea he creado para aplicar esta configuración a cambiar para mí:

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

Este Ansible los resultados de la tarea en la función de esta apariencia:

...
# 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
       ...


De la Nota: Upstart Servicios de Ignorar /etc/security/limits

Parece que /etc/security/limits.* es ignorred por Upstart, que Ubuntu 14.04 usos. Mi solicitud de servicio que realmente utiliza advenedizo y uno puede insertar una línea para advenedizo que se parece a:

limit stack <softlimit> <hardlimit>

Ubuntu cambia a systemd después 14.04, por lo que este advenedizo tid-poco se desvanecen en la irrelevancia.

Esto no es relevante para mi pregunta, porque en 14.04, postgresql no es manejado por upstart.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: