6 votes

Obtention de l'erreur Too many Open files pour Postgres

Sur le serveur Ubuntu 14.04, dans une application JAVA, nous obtenons l'erreur Too many Open files pour Postgres (avec Postgresql 9.5).

Nous définissons ce qui suit dans /etc/security/limits.conf

* soft nofile 16384
* hard nofile 16384
root soft nofile 16384
root hard  nofile 16384
postgres soft nofile 16384
postgres hard  nofile 16384

Définissez également les éléments suivants dans /etc/sysctl.conf

kern.maxfiles=20480
kern.maxfilesperproc=18000

Veuillez également consulter les résultats suivants lors de l'exécution en tant qu'utilisateur Postgres :

-> ulimit -Hn
16384

-> ulimit -Sn
16384

-> cat /proc/sys/fs/file-max
100268

Après avoir redémarré le serveur et vérifié le ulimit pour Postgres, il est de 100268. Mais en vérifiant la limite pour les fichiers ouverts sous le processus Postgres, elle est toujours de 1024 et 4096.

# cat /proc/1072/limits

Max open files            1024                 4096                 files

Lorsque nous avons redémarré les services postgres, il a été changé en

#cat /proc/1759/limits
Max open files            16384                16384                files

Mais il semble qu'il ne soit pas affecté car nous obtenons toujours l'erreur "Too many Open files".

De plus, dans le serveur, les répertoires /etc/security/limits.d/ et /etc/security/conf.d/ sont vides. Quelqu'un peut-il me guider ?

7voto

mscharstrom Points 1

@dilyin Merci pour la mise à jour.

Nous avons mis à jour la valeur de ulimit dans le script de démarrage de PostgreSQL mais le problème est toujours là.

Nous avons finalement résolu le problème en réduisant max_files_per_process à 200 au lieu de 1000 par défaut. Ce paramètre est en postgresql.conf et cela définit le nombre maximum de fichiers ouverts simultanément autorisés pour chaque sous-processus du serveur.

4voto

Dmitry Ilyin Points 573

Ah... Le problème connu.

En général, les gens commencent à modifier le fichier "/etc/security/limits.conf", mais oublient que ce fichier ne s'applique qu'aux utilisateurs activement connectés via le système pam.

Si vous démarrez la base de données manuellement en utilisant le script init script, le processus de la base de données héritera de vos limites modifiées, mais si la base de données est démarrée au démarrage ou démarrée par quelque chose comme systemd, elle ne le fera pas.

Il existe des fichiers "/etc/defaults/$service pour Debian et "/etc/sysconfig/$service pour RedHat. Ces fichiers sont sourcés par le init script avant que le démon ne soit lancé. Ajoutez ulimit -s unlimited ou quelque chose comme ça dans ces fichiers. Les limites seront appliquées dans l'init script script et affecteront le processus de la base de données.

Les maxfiles du noyau doivent également être définis.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X