Docker : le sixième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger). 

On passe donc à l’étape de l’installation de HAProxy, l’installation cible est la suivante (il va falloir que j’améliore mon server.c (que l’on va appeler server2.c) afin d’avoir une connexion avec la base de donnée):

Capture d’écran 2016-04-20 à 14.47.21Voici un nouveau server2.c , mais avant cela il faut installer le RPM qui permet de faire de dev :

[root@localhost ~]# yum install postgresql-devel

Pour compiler il va falloir appeler la librairie pq (pour postgresql), cela donne donc :

[root@localhost ~]# gcc -o server2 server2.c -lpq

J’ai donc ajouter dans le programme :
-un bout de code afin de voir quel est l’interface locale
-un bout de code afin de voir quel est l’ip locale.
-un bout de code pour couper la communication via QUIT, EXIT, CLOSE.
-un bout de code pour se connecter à la base de donnée.
-un bout de code pour avoir des informations via le telnet.

Le source :

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include "libpq-fe.h"

#define MYPORT 80
#define BACKLOG 5
#define MAXCLIENTS 5
#define MAXDATASIZE 100

int
main (void)
{
  int sockfd = -1, new_fd, numbytes, highest = 0, i;
  int clients[MAXCLIENTS];
  char buffer[MAXDATASIZE];
  char localip[MAXDATASIZE];
  struct sockaddr_in my_addr, their_addr;
  socklen_t sin_size;
  struct timeval tv;
  fd_set readfds;
  const char *conninfo;
  PGconn *conn;
  PGresult *res;
  FILE *f;
  char line[100], *p, *c;
  const char *google_dns_server = "8.8.8.8";
  int dns_port = 53;
  struct sockaddr_in serv;
  int sock = socket (AF_INET, SOCK_DGRAM, 0);

  f = fopen ("/proc/net/route", "r");

  while (fgets (line, 100, f))
    {
      p = strtok (line, " \t");
      c = strtok (NULL, " \t");

      if (p != NULL && c != NULL)
	{
	  if (strcmp (c, "00000000") == 0)
	    {
	      printf ("Default interface is : %s \n", p);
	      break;
	    }
	}
    }

  if (sock < 0)
    {
      perror ("Socket error");
    }

  memset (&serv, 0, sizeof (serv));
  serv.sin_family = AF_INET;
  serv.sin_addr.s_addr = inet_addr (google_dns_server);
  serv.sin_port = htons (dns_port);

  int err = connect (sock, (const struct sockaddr *) &serv, sizeof (serv));

  struct sockaddr_in name;
  socklen_t namelen = sizeof (name);
  err = getsockname (sock, (struct sockaddr *) &name, &namelen);

  const char *p2 = inet_ntop (AF_INET, &name.sin_addr, localip, 100);

  if (p2 != NULL)
    {
      printf ("Local ip is : %s \n", localip);
    }
  else
    {
      //Some error
      printf ("Error number : %d . Error message : %s \n", errno,
	      strerror (errno));
      strcpy (localip, "Error");
    }

  close (sock);

  conninfo =
    "hostaddr=127.0.0.1 port=5432 dbname=postgres user=postgres password=password";

  if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {
      perror ("socket");
      exit (-1);
    }
  my_addr.sin_family = AF_INET;
  my_addr.sin_port = htons (MYPORT);
  my_addr.sin_addr.s_addr = INADDR_ANY;
  bzero (&(my_addr.sin_zero), 8);

  if (bind (sockfd, (struct sockaddr *) &my_addr, sizeof (struct sockaddr)) ==
      -1)
    {
      perror ("bind");
      exit (-1);
    }
  if (listen (sockfd, BACKLOG) == -1)
    {
      perror ("listen");
      exit (-1);
    }
  bzero (clients, sizeof (clients));
  highest = sockfd;
  while (1)
    {
      sin_size = sizeof (struct sockaddr_in);
      tv.tv_sec = 0;
      tv.tv_usec = 250000;
      FD_ZERO (&readfds);
      for (i = 0; i < MAXCLIENTS; i++) { if (clients[i] != 0) { FD_SET (clients[i], &readfds); } } FD_SET (sockfd, &readfds); if (select (highest + 1, &readfds, NULL, NULL, &tv) >= 0)
	{
	  if (FD_ISSET (sockfd, &readfds))
	    {
	      if ((new_fd =
		   accept (sockfd, (struct sockaddr *) &their_addr,
			   &sin_size)) == -1)
		{
		  perror ("ACCEPT");
		  continue;
		}
	      for (i = 0; i < MAXCLIENTS; i++) { if (clients[i] == 0) { clients[i] = new_fd; break; } } if (i != MAXCLIENTS) { if (new_fd > highest)
		    {
		      highest = clients[i];
		    }
		  printf ("Connexion received from %s (slot %i) ",
			  inet_ntoa (their_addr.sin_addr), i);
		  send (new_fd, "\nHELLO\n", 7, MSG_NOSIGNAL);
		}
	      else
		{
		  send (new_fd, "\nTOO MANY CLIENT\n", 17, MSG_NOSIGNAL);
		  close (new_fd);
		}
	    }
	  for (i = 0; i < MAXCLIENTS; i++)
	    {
	      if (FD_ISSET (clients[i], &readfds))
		{
		  if ((numbytes =
		       recv (clients[i], buffer, MAXDATASIZE, 0)) <= 0)
		    {
		      printf ("Connexion lost from slot %i", i);
		      close (clients[i]);
		      clients[i] = 0;
		    }
		  else
		    {
		      buffer[numbytes] = '\0';
		      printf ("Received from slot %i : %s", i, buffer);
		      if (strncmp (buffer, "POSTGRES", 6) == 0)
			{
			  conn = PQconnectdb (conninfo);
			  if (PQstatus (conn) != CONNECTION_OK)
			    {
			      fprintf (stderr,
				       "Connection to database failed: %s",
				       PQerrorMessage (conn));
			      send (new_fd, "\nDB KO\n", 7, MSG_NOSIGNAL);
			    }
			  else
			    {
			      send (new_fd, "\nDB OK\n", 7, MSG_NOSIGNAL);
			      /* INSERT CLIENT IP and timestamp */
			    }
			  PQfinish (conn);
			}
		      if ((strncmp (buffer, "QUIT", 4) == 0))
			{
			  printf ("Connexion QUIT from slot %i", i);
			  close (clients[i]);
			  clients[i] = 0;
			}
		      if ((strncmp (buffer, "EXIT", 4) == 0))
			{
			  printf ("Connexion EXIT from slot %i", i);
			  close (clients[i]);
			  clients[i] = 0;
			}
		      if ((strncmp (buffer, "CLOSE", 5) == 0))
			{
			  printf ("Connexion CLOSE from slot %i", i);
			  close (clients[i]);
			  clients[i] = 0;
			}
		      if ((strncmp (buffer, "INTERFACE", 9) == 0))
			{
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			  send (new_fd, localip, strlen (localip),
				MSG_NOSIGNAL);
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			}
		      if ((strncmp (buffer, "IP", 2) == 0))
			{
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			  send (new_fd, p, strlen (p), MSG_NOSIGNAL);
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			}
                      if ((strncmp (buffer, "DBCNX", 2) == 0))
                        {
                          send (new_fd, "\n", 1, MSG_NOSIGNAL);
                          send (new_fd, conninfo, strlen (conninfo), MSG_NOSIGNAL);
                          send (new_fd, "\n", 1, MSG_NOSIGNAL);
                        }
		    }
		}
	    }
	}
      else
	{
	  perror ("SELECT");
	  continue;
	}
    }
  return 0;
}

Un petit test, sur un terminal je lance mon ./server2 :

[root@localhost ~]# ./server2
Default interface is : enp0s3 
Local ip is : 192.168.10.159 
Connexion received from 127.0.0.1 (slot 0) Received from slot 0 : IP
Received from slot 0 : INTERFACE
Received from slot 0 : DB
Received from slot 0 : POSTGRES
Received from slot 0 : QUIT

Et sur l’autre terminal je fais mon telnet :

Capture d’écran 2016-04-20 à 15.37.53

Maintenant il faut faire le Dockerfile de notre nouvelle application de test.

[root@localhost ~]# cat Dockerfile
FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
COPY ./server2 /sbin/server2
RUN dnf install postgresql -y
# Le port en ecoute 
EXPOSE 80 
# Pour lancer postgres 
CMD ["/sbin/server2"]

[root@localhost ~]# docker build -t my-server2 .
Sending build context to Docker daemon 81.41 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> bb6bc55cbbfc
Step 3 : COPY ./server2 /sbin/server2
 ---> Using cache
 ---> 9dc98bb8714f
Step 4 : RUN dnf install postgresql -y
 ---> Running in 6ecdbee5cb9d

Last metadata expiration check performed 0:00:40 ago on Fri Apr 15 02:43:33 2016.
Dependencies resolved.
================================================================================
 Package                Arch          Version              Repository      Size
================================================================================
Installing:
 postgresql             x86_64        9.4.7-1.fc23         updates        1.1 M
 postgresql-libs        x86_64        9.4.7-1.fc23         updates        240 k

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 1.3 M
Installed size: 4.4 M
Downloading Packages:

--------------------------------------------------------------------------------
Total                                           5.7 kB/s | 1.3 MB     04:02     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : postgresql-libs-9.4.7-1.fc23.x86_64                         1/2 
  Installing  : postgresql-9.4.7-1.fc23.x86_64                              2/2 
  Verifying   : postgresql-9.4.7-1.fc23.x86_64                              1/2 
  Verifying   : postgresql-libs-9.4.7-1.fc23.x86_64                         2/2 

Installed:
  postgresql.x86_64 9.4.7-1.fc23       postgresql-libs.x86_64 9.4.7-1.fc23      

Complete!
 ---> db3219dbae87
Removing intermediate container 6ecdbee5cb9d
Step 5 : EXPOSE 80
 ---> Running in 46227ce25198
 ---> 0ed57fe27084
Removing intermediate container 46227ce25198
Step 6 : CMD /sbin/server2
 ---> Running in 1da4a2133df3
 ---> 2b02e0bc8c6e
Removing intermediate container 1da4a2133df3
Successfully built 2b02e0bc8c6e

Et maintenant le moment de vérité, on fait le test de notre server2 :

[root@localhost ~]# docker run -p 80:80 --name my-server2.1 -d my-server2
d7d4cb51000828388a09e5648e5b92094e5a17298d799b63b41d9511129b6211
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
IP

eth0
INTERFACE

172.17.0.3
POSTGRES

DB KO
DBCNX

hostaddr=127.0.0.1 port=5432 dbname=postgres user=postgres password=password
QUIT
Connection closed by foreign host.

C’est l’échec, et c’est normal 🙁 … on essaye de se connecter en local, alors que le local c’est le conteneur !. Il faut donc se connecter à distance c’est à dire d’un conteneur à l’autre.

Je vais donc essayer d’utiliser la commande link :

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2fc533c55725        postgres            "/docker-entrypoint.s"   7 hours ago         Up 7 hours          0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker run -p 80:80 --link postgres2:postgres2 --name my-server2.2 -d my-server2
1c35469315b9de3d720ee963cfffe010a8efc069ee027c4e6c7bff119ea8865e
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1c35469315b9        my-server2          "/sbin/server2"          18 seconds ago      Up 17 seconds       0.0.0.0:80->80/tcp       my-server2.2
2fc533c55725        postgres            "/docker-entrypoint.s"   7 hours ago         Up 7 hours          0.0.0.0:5432->5432/tcp   postgres2

Je regarde toutes les variables des deux containers afin de faire les modifications sur mon programme.

[root@localhost ~]# docker exec 2fc533c55725 env
PATH=/usr/lib/postgresql/9.5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=2fc533c55725
POSTGRES_PASSWORD=password
GOSU_VERSION=1.7
LANG=en_US.utf8
PG_MAJOR=9.5
PG_VERSION=9.5.2-1.pgdg80+1
PGDATA=/var/lib/postgresql/data
HOME=/root
[root@localhost ~]# docker exec 1c35469315b9 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=1c35469315b9
POSTGRES2_PORT=tcp://172.17.0.2:5432
POSTGRES2_PORT_5432_TCP=tcp://172.17.0.2:5432
POSTGRES2_PORT_5432_TCP_ADDR=172.17.0.2
POSTGRES2_PORT_5432_TCP_PORT=5432
POSTGRES2_PORT_5432_TCP_PROTO=tcp
POSTGRES2_NAME=/my-server2.2/postgres2
POSTGRES2_ENV_POSTGRES_PASSWORD=password
POSTGRES2_ENV_GOSU_VERSION=1.7
POSTGRES2_ENV_LANG=en_US.utf8
POSTGRES2_ENV_PG_MAJOR=9.5
POSTGRES2_ENV_PG_VERSION=9.5.2-1.pgdg80+1
POSTGRES2_ENV_PGDATA=/var/lib/postgresql/data
HOME=/root

On va faire notre server3.c, on a une seule ligne à modifier :

  /* Avant :
  conninfo =
    "hostaddr=127.0.0.1 port=5432 dbname=postgres user=postgres password=password";
     Après 
   */
   conninfo =
    "hostaddr=$POSTGRES2_PORT_5432_TCP_ADDR port=$POSTGRES2_PORT_5432_TCP_PORT user=postgres password=$POSTGRES2_ENV_POSTGRES_PASSWORD";

Ensuite modification du Dockerfile, puis build, … le résultat :

[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
DB

hostaddr=$POSTGRES2_PORT_5432_TCP_ADDR port=$POSTGRES2_PORT_5432_TCP_PORT user=postgres password=$POSTGRES2_ENV_POSTGRES_PASSWORD
POSTGRES

DB KO
QUIT
Connection closed by foreign host.

Cela aurait été trop simple 😉 Donc on va utiliser un fonction pour faire cela, on va utiliser la fonction getenv. Les modifications dans server4.c

char conninfo[MAXDATASIZE];
...
  sprintf(conninfo,"hostaddr=%s port=%s user=postgres password=%s",getenv("POSTGRES2_PORT_5432_TCP_ADDR"), getenv("POSTGRES2_PORT_5432_TCP_PORT"), getenv("POSTGRES2_ENV_POSTGRES_PASSWORD"));

Je pourrais même faire mieux en faisant en sorte que cela marche en local et dans le container.

  printf("POSTGRES2_PORT_5432_TCP_ADDR : %s \n", getenv("POSTGRES2_PORT_5432_TCP_ADDR"));

  if(getenv("POSTGRES2_PORT_5432_TCP_ADDR") == NULL) {
  sprintf(conninfo,"hostaddr=%s port=%s user=postgres password=%s","127.0.0.1", "5432", "postgres");
 } else {
  sprintf(conninfo,"hostaddr=%s port=%s user=postgres password=%s",getenv("POSTGRES2_PORT_5432_TCP_ADDR"), getenv("POSTGRES2_PORT_5432_TCP_PORT"), getenv("POSTGRES2_ENV_POSTGRES_PASSWORD"));
  }

Le test … le stress en cas de nouvel échec 🙂 .

[root@localhost ~]# docker build -t my-server4 .
Sending build context to Docker daemon   129 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> bb6bc55cbbfc
Step 3 : COPY ./server4 /sbin/server4
 ---> 85cb6ab4dcea
Removing intermediate container 0f75d8dd2e32
Step 4 : RUN dnf install postgresql -y
 ---> Running in 3025055c6cfb
Last metadata expiration check performed 0:02:35 ago on Fri Apr 15 04:38:45 2016.
Dependencies resolved.
================================================================================
 Package                Arch          Version              Repository      Size
================================================================================
Installing:
 postgresql             x86_64        9.4.7-1.fc23         updates        1.1 M
 postgresql-libs        x86_64        9.4.7-1.fc23         updates        240 k

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 1.3 M
Installed size: 4.4 M
Downloading Packages:
--------------------------------------------------------------------------------
Total                                           501 kB/s | 1.3 MB     00:02     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : postgresql-libs-9.4.7-1.fc23.x86_64                         1/2 
  Installing  : postgresql-9.4.7-1.fc23.x86_64                              2/2 
  Verifying   : postgresql-9.4.7-1.fc23.x86_64                              1/2 
  Verifying   : postgresql-libs-9.4.7-1.fc23.x86_64                         2/2 

Installed:
  postgresql.x86_64 9.4.7-1.fc23       postgresql-libs.x86_64 9.4.7-1.fc23      

Complete!
 ---> 9541c83ce007
Removing intermediate container 3025055c6cfb
Step 5 : EXPOSE 80
 ---> Running in 1ae2a911c314
 ---> 944016c4027e
Removing intermediate container 1ae2a911c314
Step 6 : CMD /sbin/server4
 ---> Running in 7ca20a5578e2
 ---> 4f8c8c3fc2e5
Removing intermediate container 7ca20a5578e2
Successfully built 4f8c8c3fc2e5
[root@localhost ~]# docker run -p 80:80 --link postgres2:postgres2 --name my-server4.1 -d my-server4
08c524d398afb37c4568399d9d1f7325feb1954a4ac1593dc68684aa36b65e45
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
DBCNX

hostaddr=172.17.0.2 port=5432 user=postgres password=password
IP

eth0
INTERFACE

172.17.0.3
POSTGRES

DB OK
QUIT
Connection closed by foreign host.

J’ai donc mon programme qui fait bien ce que je veux, maintenant il va falloir passer à HAProxy. A force de repousser je vais finir par ne pas mettre les pieds dedans. La notion de lien (option -link) était importante à connaitre afin de pouvoir faire un dialogue entre containers.

Docker : le quatrième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger). 

Je commence donc par faire table rase de toutes les images, a force de jouer je ne sais plus ou j’en suis 😉

[root@localhost ~]# docker rmi $(docker images -q)
[root@localhost ~]# docker rm $(docker ps -a -q)
Error response from daemon: conflict: unable to delete 0f3af79d8673 (cannot be forced) - image is being used by running container f33064cbf168
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            latest              0f3af79d8673        9 days ago          265.7 MB

Visiblement ils (les containers) n’étaient pas tous arrêtés .

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            latest              0f3af79d8673        9 days ago          265.7 MB
[root@localhost ~]# docker stop $( docker ps -a -q)
f33064cbf168
[root@localhost ~]# docker rm $(docker ps -a -q)
f33064cbf168
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            latest              0f3af79d8673        9 days ago          265.7 MB

Maintenant je fais « mon installation » classique de PostgreSQL dans le Dockfile.

[root@localhost ~]# cat Dockerfile
FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
RUN dnf install postgresql -y 
RUN dnf install postgresql-server postgresql-contrib -y 
# Modification de la configuration 
#RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf 
RUN echo "local 		all		all 			trust" > /var/lib/pgsql/data/pg_hba.conf
RUN echo "host 		all 		all 	127.0.0.1/32 	trust" >> /var/lib/pgsql/data/pg_hba.conf
RUN echo "host 		all 		all 	::1/128 	trust" >> /var/lib/pgsql/data/pg_hba.conf

#RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf 
#RUN echo "tcpip_socket = true" >> /var/lib/pgsql/data/postgresql.conf 

RUN echo "tcpip_socket = true          #" > /var/lib/pgsql/data/postgresql.conf
RUN echo "max_connections = 124        #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "sort_mem = 2048              #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "shared_buffers = 1024        #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "debug_level = 0              #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "debug_print_query = false     #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "debug_print_parse = false     #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "debug_print_rewritten = false #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "debug_print_plan = false      #" >> /var/lib/pgsql/data/postgresql.conf
RUN echo "debug_pretty_print = false    #" >> /var/lib/pgsql/data/postgresql.conf

USER postgres
ENV PGDATA /var/lib/pgsql/data
#Comment lancer PostgreSQL pour créer les utilisateurs ?
#RUN /etc/init.d/postgresql start ...
#RUN /etc/rc.d/init.d/postgresql start ...
#RUN service postgres start ...
RUN systemctl start postgres.service &&\ psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&\ createdb -O docker docker 
#RUN initdb --data-checksums 
# Le port en ecoute 
EXPOSE 5432 
# Ajout des volumes pour faire un backup 
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/pgsql"] 
# Pour lancer postgres 
CMD ["/var/lib/pgsql/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/var/lib/pgsql/data/postgresql.conf"]

Quand je lance la création :

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 17.41 kB
...
Step 20 : RUN systemctl start postgres.service &&    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&    createdb -O docker docker
 ---> Running in c2b02a1f1bca
Failed to get D-Bus connection: Operation not permitted
The command '/bin/sh -c systemctl start postgres.service &&    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&    createdb -O docker docker' returned a non-zero code: 1

ou alors cette erreur :

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 17.41 kB
...
Step 20 : RUN /etc/init.d/postgresql start &&    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&    createdb -O docker docker
 ---> Running in 4dfdeb08e3f3
/bin/sh: /etc/init.d/postgresql: No such file or directory
The command '/bin/sh -c /etc/init.d/postgresql start &&    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&    createdb -O docker docker' returned a non-zero code: 127

ou encore :

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 17.41 kB
...
Step 20 : RUN service postgres start &&    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&    createdb -O docker docker
 ---> Running in 9a3bfd9a664f
/bin/sh: service: command not found
The command '/bin/sh -c service postgres start &&    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&    createdb -O docker docker' returned a non-zero code: 127

Je laisse donc tomber provisoirement l’ajout d’un utilisateur Docker et la création de la db Docker dans le Dockerfile 🙁 .

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> bb6bc55cbbfc
Step 3 : RUN dnf install postgresql -y
 ---> Using cache
 ---> 9b581b9c8425
Step 4 : RUN dnf install postgresql-server postgresql-contrib -y
 ---> Using cache
 ---> ed6bccd45fd3
Step 5 : RUN echo "local 		all		all 			trust" > /var/lib/pgsql/data/pg_hba.conf
 ---> Using cache
 ---> 8a3ea8273f9e
Step 6 : RUN echo "host 		all 		all 	127.0.0.1/32 	trust" >> /var/lib/pgsql/data/pg_hba.conf
 ---> Using cache
 ---> fc65b9c9661e
Step 7 : RUN echo "host 		all 		all 	::1/128 	trust" >> /var/lib/pgsql/data/pg_hba.conf
 ---> Using cache
 ---> 6c9ab1b370d6
Step 8 : RUN echo "tcpip_socket = true          #" > /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> ac205ea5bbf7
Step 9 : RUN echo "max_connections = 124        #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 975e0845fdbb
Step 10 : RUN echo "sort_mem = 2048              #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 23ab63545319
Step 11 : RUN echo "shared_buffers = 1024        #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 327533e655c4
Step 12 : RUN echo "debug_level = 0              #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 7e51ec7dd6cb
Step 13 : RUN echo "debug_print_query = false     #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 0b8663d1fe21
Step 14 : RUN echo "debug_print_parse = false     #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 82879441164c
Step 15 : RUN echo "debug_print_rewritten = false #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 3bd7eb375391
Step 16 : RUN echo "debug_print_plan = false      #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> b269cdf8abf3
Step 17 : RUN echo "debug_pretty_print = false    #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 8bad41390294
Step 18 : RUN echo "listen_addresses='*'          #" >> /var/lib/pgsql/data/postgresql.conf
 ---> Running in f53205205b0b
 ---> 896e6064081e
Removing intermediate container f53205205b0b
Step 19 : USER postgres
 ---> Running in 3d4aa9d10075
 ---> 77f821b4582f
Removing intermediate container 3d4aa9d10075
Step 20 : ENV PGDATA /var/lib/pgsql/data
 ---> Running in 1d25c9d8ee02
 ---> 86584da17774
Removing intermediate container 1d25c9d8ee02
Step 21 : EXPOSE 5432
 ---> Running in 0c2d98c939de
 ---> 60baae86afc9
Removing intermediate container 0c2d98c939de
Step 22 : VOLUME /etc/postgresql /var/log/postgresql /var/lib/pgsql
 ---> Running in d6f248e4b0f6
 ---> 3a00e74a6f0f
Removing intermediate container d6f248e4b0f6
Step 23 : CMD /var/lib/pgsql/bin/postgres -D /var/lib/pgsql/data -c config_file=/var/lib/pgsql/data/postgresql.conf
 ---> Running in 46016d0af473
 ---> 4b31f92a3ed5
Removing intermediate container 46016d0af473
Successfully built 4b31f92a3ed5
[root@localhost ~]# docker run -p 5432:5432 --name postgres2 -e POSTGRES_PASSWORD=password -d postgres
2fc533c557259f65236a97e1e4eb7123867d4c0e0cae784a620cc9c96e55c168
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2fc533c55725        postgres            "/docker-entrypoint.s"   24 seconds ago      Up 24 seconds       0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# psql -h localhost -p 5432 -u postgres
psql : option invalide -- 'u'
Essayez « psql --help » pour plus d'informations.
[root@localhost ~]# psql -h localhost -p 5432 -d postgres
Mot de passe : 
psql: FATAL:  password authentication failed for user "root"

[root@localhost ~]# adduser postgres
[root@localhost ~]# su postgres
[postgres@localhost root]$ cd
[postgres@localhost ~]$ psql -h localhost -p 5432 -d postgres
Mot de passe : 
psql (9.2.15, serveur 9.5.2)
ATTENTION : psql version 9.2, version du serveur 9.5.
         Certaines fonctionnalités de psql pourraient ne pas fonctionner.
Saisissez « help » pour l'aide.

postgres=# 

J’ai donc ajouter l’utilisateur postgres en local afin d’avoir l’accès à PostgreSQL. J’aurai pu aussi utiliser l’option -U pour préciser l’utilisateur à psql.

[postgres@localhost ~]$ psql -h localhost -p 5432 -d postgres -U postgres
Mot de passe pour l'utilisateur postgres : 
psql (9.2.15, serveur 9.5.2)
ATTENTION : psql version 9.2, version du serveur 9.5.
         Certaines fonctionnalités de psql pourraient ne pas fonctionner.
Saisissez « help » pour l'aide.

postgres=# create database Docker;
CREATE DATABASE
postgres=# CREATE USER Docker WITH PASSWORD 'Docker';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE Docker to Docker;
GRANT

Maintenant on va développer un serveur pour voir s’il est possible de lancer des containers dynamiquement. On va limiter ce server à 5 clients maximums et on va essayer de lancer un nouveau conteneur quand les 5 clients seront occupés.

Le source de server.c:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 
#include <sys/wait.h> 
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h> 

#define MYPORT 80  
#define BACKLOG 5   
#define MAXCLIENTS 5
#define MAXDATASIZE 100

int main(void)
{
   int sockfd = -1,new_fd,numbytes,highest = 0,i;
   int clients[MAXCLIENTS];
   char buffer[MAXDATASIZE] ;

   struct sockaddr_in my_addr,their_addr;
   socklen_t sin_size;
   struct timeval tv;
   fd_set readfds;

   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
     perror("SOCKET");
     exit(-1);
   }
   my_addr.sin_family = AF_INET;        
   my_addr.sin_port = htons(MYPORT);   
   my_addr.sin_addr.s_addr = INADDR_ANY; 
   bzero(&(my_addr.sin_zero), 8);

   if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
      perror("BIND");
      exit(-1);
   }
   if (listen(sockfd, BACKLOG) == -1) {
      perror("LISTEN");
      exit(-1);
   }
   bzero(clients,sizeof(clients));
   highest = sockfd ;
   while(1) {
      sin_size = sizeof(struct sockaddr_in);      
      tv.tv_sec = 0;
      tv.tv_usec = 250000;
      FD_ZERO(&readfds);
      for ( i = 0 ; i < MAXCLIENTS ; i ++ ) { if ( clients[i] != 0 ) { FD_SET(clients[i],&readfds); } } FD_SET(sockfd,&readfds); if (select(highest+1, &readfds, NULL, NULL, &tv) >=0 ) {
         if (FD_ISSET(sockfd, &readfds)) {
            if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
               perror("ACCEPT");
               continue;
            } 
            for( i = 0 ; i < MAXCLIENTS ; i ++ ) { if ( clients[i] == 0 ) { clients[i] = new_fd ; break; } } if ( i != MAXCLIENTS ) { if ( new_fd > highest ) {
                  highest = clients[i] ;
               }
               printf("Connexion received from %s (slot %i) ",inet_ntoa(their_addr.sin_addr),i);
               send(new_fd,"PING",4,MSG_NOSIGNAL);
            }     
            else {
               send(new_fd, "TOO MANY CLIENT",15,MSG_NOSIGNAL); 
               close(new_fd);   
            }
         }
         for ( i = 0 ; i < MAXCLIENTS ; i ++ ) {
            if ( FD_ISSET(clients[i],&readfds) ) {
               if ( (numbytes=recv(clients[i],buffer,MAXDATASIZE,0)) <= 0 ) {
                  printf("Connexion lost from slot %i",i);  
                  close(clients[i]);
                  clients[i] = 0 ;
               }
               else {
                  buffer[numbytes] = '\0';
                  printf("Received from slot %i : %s",i,buffer); 
               }
            }
         }
      } 
      else {
         perror("select");
         continue;
      }
   }
   return 0;
}

On compile :

[root@localhost ~]# yum install gcc
...
[root@localhost ~]# gcc -o server server.c

On lance et on fait un petit test :

[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

PING

Attention il faut deux shell pour faire le test du telnet, un qui lance le ./server et l’autre qui fait le telnet.

Maintenant on va essayer de faire un conteneur de cette superbe application 😉 On va faire cela sur une base de Fédora.

[root@localhost ~]# docker build -t my-server .
Sending build context to Docker daemon 37.38 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> bb6bc55cbbfc
Step 3 : COPY ./server /sbin/server
 ---> 47dae6f4617a
Removing intermediate container adc5565dac13
Step 4 : EXPOSE 80
 ---> Running in 16c1c17c481b
 ---> 80328c54f6b4
Removing intermediate container 16c1c17c481b
Step 5 : CMD /sbin/server
 ---> Running in 621a41123e73
 ---> fea70bdfa97c
Removing intermediate container 621a41123e73
Successfully built fea70bdfa97c
[root@localhost ~]# cat Dockerfile
FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
COPY ./server /sbin/server
# Le port en ecoute 
EXPOSE 80 
# Pour lancer postgres 
CMD ["/sbin/server"]

Ensuite on lance le container, et si j’essaye de lancer sur ce même port on voit qu’il y a une erreur :

[root@localhost ~]# docker run -p 80:80 --name my-server3 -d my-server 
9cf698cacc2e1e43d67c83b1b4c72e17f190559722e90517dca6095e9513a426
[root@localhost ~]# docker run -p 80:80 --name my-server4 -d my-server 
d40fe77df35aad7cec0e35d934a1dd73395eba40727f5367a529429c21264741
docker: Error response from daemon: driver failed programming external connectivity on endpoint my-server4 (11fe895fc0c58deab22b2cde63fb1f72cd58b1c21178a114897a699ec2e9e627): Bind for 0.0.0.0:80 failed: port is already allocated.

[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

PING

La prochaine étape serait de mettre HAproxy devant mon server sur le port 80. Pour ensuite faire du balancing sur plusieurs de mes servers.

Capture d’écran 2016-04-19 à 08.01.48

PostgreSQL : Maximum de connexion en simultanés

Jusqu’à présent la limite était dû à ce paramètre du noyau:

  • cat /proc/sys/kernel/shmmax

Il fallait donc modifier le kernel avec la commande suivante :

  • sysctl -w kernel.shmmax=valeur

ou encore :

  • sysctl -p /etc/sysctl.conf

La règle de calcul étant : shmmax = 250 Ko + 8.2 Ko * shared_buffers + 14.2 Ko * max_connections.

Autre information, la commande suivante permet de voir le nombre de connexion en temps réel : « SELECT * FROM pg_catalog.pg_stat_activity; »

Pour voir le nombre de connexion max, il suffit de faire cela :

SELECT current_setting(‘max_connections’); 

ou encore

SHOW all;

Voici donc un petit historique sur quelques versions de linux, je n’ai pas la prétention de dire que ma configuration est optimale. Je veux juste indiquer la limite que j’ai trouvé pour chaque OS et chaque configuration :

Redhat 7.2 32 bits :

Redhat 8.0 32 bits :

Voici un premier exemple de configuration :

[root@Redhat8]# uname -a
Linux Redhat8.0 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux
[root@Redhat8]# rpm -qa | grep postgresql
postgresql-server-7.2.2-1
postgresql-libs-7.2.2-1
postgresql-7.2.2-1
postgresql-devel-7.2.2-1
[root@Redhat8]# ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 7168
virtual memory        (kbytes, -v) unlimited
[root@Redhat8]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@Redhat8]# cat /var/lib/pgsql/data/postgresql.conf
tcpip_socket = true          #
max_connections = 496        #
sort_mem = 16384              #
shared_buffers = 2048        #
wal_buffers = 256            #
debug_level = 0              #
debug_print_query = false
debug_print_parse = false
debug_print_rewritten = false
debug_print_plan = false
debug_pretty_print = false
deadlock_timeout = 600   #
vacuum_mem = 36864   #

A noter :

# show max_connections;
NOTICE:  max_connections is 496
SHOW VARIABLE
# show shared_buffers;
NOTICE:  shared_buffers is 2048
SHOW VARIABLE

Fédora 9 32 bits :

[root@FC9 ~]# uname -a
Linux FC9 2.6.25-14.fc9.i686 #1 SMP Thu May 1 06:28:41 EDT 2008 i686 i686 i386 GNU/Linux
[root@FC9 ~]# rpm -qa | grep postgresql
postgresql-libs-8.3.1-1.fc9.i386
postgresql-python-8.3.1-1.fc9.i386
postgresql-8.3.1-1.fc9.i386
postgresql-server-8.3.1-1.fc9.i386
postgresql-devel-8.3.1-1.fc9.i386
[root@FC9 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 65536
max locked memory       (kbytes, -l) 32
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) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@FC9 ~]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@FC9 ~]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 200
shared_buffers = 4MB
temp_buffers = 8MB
work_mem = 16MB
maintenance_work_mem = 4MB
wal_buffers = 8MB
checkpoint_segments = 128
effective_cache_size = 128MB
cpu_tuple_cost = 0.0030
cpu_index_tuple_cost = 0.0010
cpu_operator_cost = 0.0005
fsync = off
checkpoint_timeout = 1h
port = 5432                             # (change requires restart)
logging_collector = off                  # Enable capturing of stder and csvlog
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'                     # locale for system error message
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.english'

Fédora 14 32 bits :

Voici les informations sur l’OS, voici un exemple de configuration :

[root@Fedora14]# uname -a
Linux Fedora14 2.6.35.6-48.fc14.i686 #1 SMP Fri Oct 22 15:34:36 UTC 2010 i686 i686 i386 GNU/Linux
[root@Fedora14]# rpm -qa | grep "postgresql"
postgresql-devel-8.4.5-1.fc14.i686
postgresql-plperl-8.4.5-1.fc14.i686
postgresql-libs-8.4.5-1.fc14.i686
postgresql-8.4.5-1.fc14.i686
postgresql-server-8.4.5-1.fc14.i686
[root@Fedora14]# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 25000
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 8000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 20000
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@Fedora14]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@Fedora14]# ipcs -l
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
 
------ Messages Limits --------
max queues system wide = 1397
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
[root@Fedora14]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 201  #
temp_buffers = 2000    #
work_mem=200MB         #
wal_buffers = 2500     #
port = 5432            #
logging_collector = on #

Si on essaye de mettre 202 dans le fichier postgresql.conf alors celui-ci refuse de se lancer. La limite semble être à 201 connexions en simultanées.

A noter que si je regarde la paramètre shared_buffers :

# show max_connections;
max_connections
-----------------
201
(1 row)
# show shared_buffers;
shared_buffers
----------------
8MB
(1 row)

Si je diminue la taille de shared_buffers, je peux alors augmenter le nombre de connexion en simultanée :

[root@Fedora14 xatm]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 437
temp_buffers = 2000
shared_buffers = 4MB
work_mem=200MB
wal_buffers = 2500
port = 5432
logging_collector = on #

Fédora 17 32 bits :

[root@FC17 ~]# uname -a
Linux FC17 3.3.4-5.fc17.i686 #1 SMP Mon May 7 17:45:26 UTC 2012 i686 i686 i386 GNU/Linux
[root@FC17 ~]# rpm -qa | grep postgresql
postgresql-server-9.1.9-1.fc17.i686
postgresql-9.1.9-1.fc17.i686
postgresql-devel-9.1.9-1.fc17.i686
postgresql-libs-9.1.9-1.fc17.i686
[root@FC17 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 23753
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) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@FC17 ~]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@FC17 ~]# ipcs -l
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
 
------ Messages Limits --------
max queues system wide = 1684
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
[root@FC17 ~]# cat /var/lib/pgsql/data/postgresql.conf
port = 5432                             # (change requires restart)
max_connections = 935                   # (change requires restart)
shared_buffers = 4MB                   # min 128kB
logging_collector = on                  # Enable capturing of stderr and csvlog
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'                     # locale for system error message
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.english'

Voici la liste complète des paramètres :

show all;
              name               |               setting               |                                                          description
---------------------------------+-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------
allow_system_table_mods         | off                                 | Allows modifications of the structure of system tables.
application_name                | psql                                | Sets the application name to be reported in statistics and logs.
archive_command                 | (disabled)                          | Sets the shell command that will be called to archive a WAL file.
archive_mode                    | off                                 | Allows archiving of WAL files using archive_command.
archive_timeout                 | 0                                   | Forces a switch to the next xlog file if a new file has not been started within N seconds.
array_nulls                     | on                                  | Enable input of NULL elements in arrays.
authentication_timeout          | 1min                                | Sets the maximum allowed time to complete client authentication.
autovacuum                      | on                                  | Starts the autovacuum subprocess.
autovacuum_analyze_scale_factor | 0.1                                 | Number of tuple inserts, updates or deletes prior to analyze as a fraction of reltuples.
autovacuum_analyze_threshold    | 50                                  | Minimum number of tuple inserts, updates or deletes prior to analyze.
autovacuum_freeze_max_age       | 200000000                           | Age at which to autovacuum a table to prevent transaction ID wraparound.
autovacuum_max_workers          | 3                                   | Sets the maximum number of simultaneously running autovacuum worker processes.
autovacuum_naptime              | 1min                                | Time to sleep between autovacuum runs.
autovacuum_vacuum_cost_delay    | 20ms                                | Vacuum cost delay in milliseconds, for autovacuum.
autovacuum_vacuum_cost_limit    | -1                                  | Vacuum cost amount available before napping, for autovacuum.
autovacuum_vacuum_scale_factor  | 0.2                                 | Number of tuple updates or deletes prior to vacuum as a fraction of reltuples.
autovacuum_vacuum_threshold     | 50                                  | Minimum number of tuple updates or deletes prior to vacuum.
backslash_quote                 | safe_encoding                       | Sets whether "\'" is allowed in string literals.
bgwriter_delay                  | 200ms                               | Background writer sleep time between rounds.
bgwriter_lru_maxpages           | 100                                 | Background writer maximum number of LRU pages to flush per round.
bgwriter_lru_multiplier         | 2                                   | Multiple of the average buffer usage to free per round.
block_size                      | 8192                                | Shows the size of a disk block.
bonjour                         | off                                 | Enables advertising the server via Bonjour.
bonjour_name                    |                                     | Sets the Bonjour service name.
bytea_output                    | hex                                 | Sets the output format for bytea.
check_function_bodies           | on                                  | Check function bodies during CREATE FUNCTION.
checkpoint_completion_target    | 0.5                                 | Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval.
checkpoint_segments             | 3                                   | Sets the maximum distance in log segments between automatic WAL checkpoints.
checkpoint_timeout              | 5min                                | Sets the maximum time between automatic WAL checkpoints.
checkpoint_warning              | 30s                                 | Enables warnings if checkpoint segments are filled more frequently than this.
client_encoding                 | UTF8                                | Sets the client's character set encoding.
client_min_messages             | notice                              | Sets the message levels that are sent to the client.
commit_delay                    | 0                                   | Sets the delay in microseconds between transaction commit and flushing WAL to disk.
commit_siblings                 | 5                                   | Sets the minimum concurrent open transactions before performing commit_delay.
config_file                     | /var/lib/pgsql/data/postgresql.conf | Sets the server's main configuration file.
constraint_exclusion            | partition                           | Enables the planner to use constraints to optimize queries.
cpu_index_tuple_cost            | 0.005                               | Sets the planner's estimate of the cost of processing each index entry during an index scan.
cpu_operator_cost               | 0.0025                              | Sets the planner's estimate of the cost of processing each operator or function call.
cpu_tuple_cost                  | 0.01                                | Sets the planner's estimate of the cost of processing each tuple (row).
cursor_tuple_fraction           | 0.1                                 | Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved.
custom_variable_classes         |                                     | Sets the list of known custom variable classes.
data_directory                  | /var/lib/pgsql/data                 | Sets the server's data directory.
DateStyle                       | ISO, MDY                            | Sets the display format for date and time values.
db_user_namespace               | off                                 | Enables per-database user names.
deadlock_timeout                | 1s                                  | Sets the time to wait on a lock before checking for deadlock.
debug_assertions                | off                                 | Turns on various assertion checks.
debug_pretty_print              | on                                  | Indents parse and plan tree displays.
debug_print_parse               | off                                 | Logs each query's parse tree.
debug_print_plan                | off                                 | Logs each query's execution plan.
debug_print_rewritten           | off                                 | Logs each query's rewritten parse tree.
default_statistics_target       | 100                                 | Sets the default statistics target.
default_tablespace              |                                     | Sets the default tablespace to create tables and indexes in.
default_text_search_config      | pg_catalog.english                  | Sets default text search configuration.
default_transaction_deferrable  | off                                 | Sets the default deferrable status of new transactions.
default_transaction_isolation   | read committed                      | Sets the transaction isolation level of each new transaction.
default_transaction_read_only   | off                                 | Sets the default read-only status of new transactions.
default_with_oids               | off                                 | Create new tables with OIDs by default.
dynamic_library_path            | $libdir                             | Sets the path for dynamically loadable modules.
effective_cache_size            | 128MB                               | Sets the planner's assumption about the size of the disk cache.
effective_io_concurrency        | 1                                   | Number of simultaneous requests that can be handled efficiently by the disk subsystem.
enable_bitmapscan               | on                                  | Enables the planner's use of bitmap-scan plans.
enable_hashagg                  | on                                  | Enables the planner's use of hashed aggregation plans.
enable_hashjoin                 | on                                  | Enables the planner's use of hash join plans.
enable_indexscan                | on                                  | Enables the planner's use of index-scan plans.
enable_material                 | on                                  | Enables the planner's use of materialization.
enable_mergejoin                | on                                  | Enables the planner's use of merge join plans.
enable_nestloop                 | on                                  | Enables the planner's use of nested-loop join plans.
enable_seqscan                  | on                                  | Enables the planner's use of sequential-scan plans.
enable_sort                     | on                                  | Enables the planner's use of explicit sort steps.
enable_tidscan                  | on                                  | Enables the planner's use of TID scan plans.
escape_string_warning           | on                                  | Warn about backslash escapes in ordinary string literals.
exit_on_error                   | off                                 | Terminate session on any error.
external_pid_file               |                                     | Writes the postmaster PID to the specified file.
extra_float_digits              | 0                                   | Sets the number of digits displayed for floating-point values.
from_collapse_limit             | 8                                   | Sets the FROM-list size beyond which subqueries are not collapsed.
fsync                           | on                                  | Forces synchronization of updates to disk.
full_page_writes                | on                                  | Writes full pages to WAL when first modified after a checkpoint.
geqo                            | on                                  | Enables genetic query optimization.
geqo_effort                     | 5                                   | GEQO: effort is used to set the default for other GEQO parameters.
geqo_generations                | 0                                   | GEQO: number of iterations of the algorithm.
geqo_pool_size                  | 0                                   | GEQO: number of individuals in the population.
geqo_seed                       | 0                                   | GEQO: seed for random path selection.
geqo_selection_bias             | 2                                   | GEQO: selective pressure within the population.
geqo_threshold                  | 12                                  | Sets the threshold of FROM items beyond which GEQO is used.
gin_fuzzy_search_limit          | 0                                   | Sets the maximum allowed result for exact search by GIN.
hba_file                        | /var/lib/pgsql/data/pg_hba.conf     | Sets the server's "hba" configuration file.
hot_standby                     | off                                 | Allows connections and queries during recovery.
hot_standby_feedback            | off                                 | Allows feedback from a hot standby to the primary that will avoid query conflicts.
ident_file                      | /var/lib/pgsql/data/pg_ident.conf   | Sets the server's "ident" configuration file.
ignore_system_indexes           | off                                 | Disables reading from system indexes.
integer_datetimes               | on                                  | Datetimes are integer based.
IntervalStyle                   | postgres                            | Sets the display format for interval values.
join_collapse_limit             | 8                                   | Sets the FROM-list size beyond which JOIN constructs are not flattened.
krb_caseins_users               | off                                 | Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive.
krb_server_keyfile              | FILE:/etc/krb5.keytab               | Sets the location of the Kerberos server key file.
krb_srvname                     | postgres                            | Sets the name of the Kerberos service.
lc_collate                      | en_US.UTF-8                         | Shows the collation order locale.
lc_ctype                        | en_US.UTF-8                         | Shows the character classification and case conversion locale.
lc_messages                     | en_US.UTF-8                         | Sets the language in which messages are displayed.
lc_monetary                     | en_US.UTF-8                         | Sets the locale for formatting monetary amounts.
lc_numeric                      | en_US.UTF-8                         | Sets the locale for formatting numbers.
lc_time                         | en_US.UTF-8                         | Sets the locale for formatting date and time values.
listen_addresses                | localhost                           | Sets the host name or IP address(es) to listen to.
lo_compat_privileges            | off                                 | Enables backward compatibility mode for privilege checks on large objects.
local_preload_libraries         |                                     | Lists shared libraries to preload into each backend.
log_autovacuum_min_duration     | -1                                  | Sets the minimum execution time above which autovacuum actions will be logged.
log_checkpoints                 | off                                 | Logs each checkpoint.
log_connections                 | off                                 | Logs each successful connection.
log_destination                 | stderr                              | Sets the destination for server log output.
log_directory                   | pg_log                              | Sets the destination directory for log files.
log_disconnections              | off                                 | Logs end of a session, including duration.
log_duration                    | off                                 | Logs the duration of each completed SQL statement.
log_error_verbosity             | default                             | Sets the verbosity of logged messages.
log_executor_stats              | off                                 | Writes executor performance statistics to the server log.
log_file_mode                   | 0600                                | Sets the file permissions for log files.
log_filename                    | postgresql-%a.log                   | Sets the file name pattern for log files.
log_hostname                    | off                                 | Logs the host name in the connection logs.
log_line_prefix                 |                                     | Controls information prefixed to each log line.
log_lock_waits                  | off                                 | Logs long lock waits.
log_min_duration_statement      | -1                                  | Sets the minimum execution time above which statements will be logged.
log_min_error_statement         | error                               | Causes all statements generating error at or above this level to be logged.
log_min_messages                | warning                             | Sets the message levels that are logged.
log_parser_stats                | off                                 | Writes parser performance statistics to the server log.
log_planner_stats               | off                                 | Writes planner performance statistics to the server log.
log_rotation_age                | 1d                                  | Automatic log file rotation will occur after N minutes.
log_rotation_size               | 0                                   | Automatic log file rotation will occur after N kilobytes.
log_statement                   | none                                | Sets the type of statements logged.
log_statement_stats             | off                                 | Writes cumulative performance statistics to the server log.
log_temp_files                  | -1                                  | Log the use of temporary files larger than this number of kilobytes.
log_timezone                    | Europe/Paris                        | Sets the time zone to use in log messages.
log_truncate_on_rotation        | on                                  | Truncate existing log files of same name during log rotation.
logging_collector               | on                                  | Start a subprocess to capture stderr output and/or csvlogs into log files.
maintenance_work_mem            | 16MB                                | Sets the maximum memory to be used for maintenance operations.
max_connections                 | 935                                 | Sets the maximum number of concurrent connections.
max_files_per_process           | 1000                                | Sets the maximum number of simultaneously open files for each server process.
max_function_args               | 100                                 | Shows the maximum number of function arguments.
max_identifier_length           | 63                                  | Shows the maximum identifier length.
max_index_keys                  | 32                                  | Shows the maximum number of index keys.
max_locks_per_transaction       | 64                                  | Sets the maximum number of locks per transaction.
max_pred_locks_per_transaction  | 64                                  | Sets the maximum number of predicate locks per transaction.
max_prepared_transactions       | 0                                   | Sets the maximum number of simultaneously prepared transactions.
max_stack_depth                 | 2MB                                 | Sets the maximum stack depth, in kilobytes.
max_standby_archive_delay       | 30s                                 | Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data.
max_standby_streaming_delay     | 30s                                 | Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data.
max_wal_senders                 | 0                                   | Sets the maximum number of simultaneously running WAL sender processes.
password_encryption             | on                                  | Encrypt passwords.
port                            | 5432                                | Sets the TCP port the server listens on.
post_auth_delay                 | 0                                   | Waits N seconds on connection startup after authentication.
pre_auth_delay                  | 0                                   | Waits N seconds on connection startup before authentication.
quote_all_identifiers           | off                                 | When generating SQL fragments, quote all identifiers.
random_page_cost                | 4                                   | Sets the planner's estimate of the cost of a nonsequentially fetched disk page.
replication_timeout             | 1min                                | Sets the maximum time to wait for WAL replication.
restart_after_crash             | on                                  | Reinitialize server after backend crash.
search_path                     | "$user",public                      | Sets the schema search order for names that are not schema-qualified.
segment_size                    | 1GB                                 | Shows the number of pages per disk file.
seq_page_cost                   | 1                                   | Sets the planner's estimate of the cost of a sequentially fetched disk page.
server_encoding                 | UTF8                                | Sets the server (database) character set encoding.
server_version                  | 9.1.9                               | Shows the server version.
server_version_num              | 90109                               | Shows the server version as an integer.
session_replication_role        | origin                              | Sets the session's behavior for triggers and rewrite rules.
shared_buffers                  | 4MB                                 | Sets the number of shared memory buffers used by the server.
shared_preload_libraries        |                                     | Lists shared libraries to preload into server.
silent_mode                     | off                                 | Runs the server silently.
sql_inheritance                 | on                                  | Causes subtables to be included by default in various commands.
ssl                             | off                                 | Enables SSL connections.
ssl_ciphers                     | ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH   | Sets the list of allowed SSL ciphers.
ssl_renegotiation_limit         | 512MB                               | Set the amount of traffic to send and receive before renegotiating the encryption keys.
standard_conforming_strings     | on                                  | Causes '...' strings to treat backslashes literally.
statement_timeout               | 0                                   | Sets the maximum allowed duration of any statement.
stats_temp_directory            | pg_stat_tmp                         | Writes temporary statistics files to the specified directory.
superuser_reserved_connections  | 3                                   | Sets the number of connection slots reserved for superusers.
synchronize_seqscans            | on                                  | Enable synchronized sequential scans.
synchronous_commit              | on                                  | Sets the current transaction's synchronization level.
synchronous_standby_names       |                                     | List of names of potential synchronous standbys.
syslog_facility                 | local0                              | Sets the syslog "facility" to be used when syslog enabled.
syslog_ident                    | postgres                            | Sets the program name used to identify PostgreSQL messages in syslog.
tcp_keepalives_count            | 0                                   | Maximum number of TCP keepalive retransmits.
tcp_keepalives_idle             | 0                                   | Time between issuing TCP keepalives.
tcp_keepalives_interval         | 0                                   | Time between TCP keepalive retransmits.
temp_buffers                    | 8MB                                 | Sets the maximum number of temporary buffers used by each session.
temp_tablespaces                |                                     | Sets the tablespace(s) to use for temporary tables and sort files.
TimeZone                        | Europe/Paris                        | Sets the time zone for displaying and interpreting time stamps.
timezone_abbreviations          | Default                             | Selects a file of time zone abbreviations.
trace_notify                    | off                                 | Generates debugging output for LISTEN and NOTIFY.
trace_recovery_messages         | log                                 | Enables logging of recovery-related debugging information.
trace_sort                      | off                                 | Emit information about resource usage in sorting.
track_activities                | on                                  | Collects information about executing commands.
track_activity_query_size       | 1024                                | Sets the size reserved for pg_stat_activity.current_query, in bytes.
track_counts                    | on                                  | Collects statistics on database activity.
track_functions                 | none                                | Collects function-level statistics on database activity.
transaction_deferrable          | off                                 | Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures.
transaction_isolation           | read committed                      | Sets the current transaction's isolation level.
transaction_read_only           | off                                 | Sets the current transaction's read-only status.
transform_null_equals           | off                                 | Treats "expr=NULL" as "expr IS NULL".
unix_socket_directories         | /var/run/postgresql, /tmp           | Sets the directories where Unix-domain sockets will be created.
unix_socket_group               |                                     | Sets the owning group of the Unix-domain socket.
unix_socket_permissions         | 0777                                | Sets the access permissions of the Unix-domain socket.
update_process_title            | on                                  | Updates the process title to show the active SQL command.
vacuum_cost_delay               | 0                                   | Vacuum cost delay in milliseconds.
vacuum_cost_limit               | 200                                 | Vacuum cost amount available before napping.
vacuum_cost_page_dirty          | 20                                  | Vacuum cost for a page dirtied by vacuum.
vacuum_cost_page_hit            | 1                                   | Vacuum cost for a page found in the buffer cache.
vacuum_cost_page_miss           | 10                                  | Vacuum cost for a page not found in the buffer cache.
vacuum_defer_cleanup_age        | 0                                   | Number of transactions by which VACUUM and HOT cleanup should be deferred, if any.
vacuum_freeze_min_age           | 50000000                            | Minimum age at which VACUUM should freeze a table row.
vacuum_freeze_table_age         | 150000000                           | Age at which VACUUM should scan whole table to freeze tuples.
wal_block_size                  | 8192                                | Shows the block size in the write ahead log.
wal_buffers                     | 128kB                               | Sets the number of disk-page buffers in shared memory for WAL.
wal_keep_segments               | 0                                   | Sets the number of WAL files held for standby servers.
wal_level                       | minimal                             | Set the level of information written to the WAL.
wal_receiver_status_interval    | 10s                                 | Sets the maximum interval between WAL receiver status reports to the primary.
wal_segment_size                | 16MB                                | Shows the number of pages per write ahead log segment.
wal_sender_delay                | 1s                                  | WAL sender sleep time between WAL replications.
wal_sync_method                 | fdatasync                           | Selects the method used for forcing WAL updates to disk.
wal_writer_delay                | 200ms                               | WAL writer sleep time between WAL flushes.
work_mem                        | 1MB                                 | Sets the maximum memory to be used for query workspaces.
xmlbinary                       | base64                              | Sets how binary values are to be encoded in XML.
xmloption                       | content                             | Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments.
zero_damaged_pages              | off                                 | Continues processing past damaged page headers.

 

Fédora 17 64 bits :

Voici un exemple de configuration :

[root@fedora17-64b ~]# uname -a
Linux fedora17-64b 3.3.4-5.fc17.x86_64 #1 SMP Mon May 7 17:29:34 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@fedora17-64b ~]# rpm -qa | grep "postgresql"
postgresql-server-9.1.9-1.fc17.x86_64
postgresql-libs-9.1.9-1.fc17.x86_64
postgresql-devel-9.1.9-1.fc17.x86_64
postgresql-9.1.9-1.fc17.x86_64
[root@fedora17-64b ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31448
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) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@fedora17-64b ~]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@fedora17-64b ~]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 400
shared_buffers = 4MB
temp_buffers = 8MB
work_mem = 16MB
maintenance_work_mem = 4MB
wal_buffers = 8MB
checkpoint_segments = 128
effective_cache_size = 4MB
cpu_tuple_cost = 0.0030
cpu_index_tuple_cost = 0.0010
cpu_operator_cost = 0.0005
fsync = off
checkpoint_timeout = 1h
port = 5432                             # (change requires restart)
logging_collector = off                  # Enable capturing of stderr and csvlog
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'                     # locale for system error message
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.english'

La limite semble être a 421 connexions en simultanées. Ensuite dès que l’on dépasse on obtient cette erreur.

pg_ctl[6217]: FATAL:  could not create shared memory segment: Invalid argument
pg_ctl[6217]: DETAIL:  Failed system call was shmget(key=5432001, size=33898496, 03600).
pg_ctl[6217]: HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  ...connections.
pg_ctl[6217]: If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising t... called for.
pg_ctl[6217]: The PostgreSQL documentation contains more information about shared memory configuration.
pg_ctl[6217]: pg_ctl: could not start server

Si j’essaye de mettre le même fichier de configuration que la Fédora 17 32b, je n’arrive pas au même performance …

Oracle Linux 6.5 64 bits :

[root@ORACLE ~]# uname -a
Linux ORACLE 3.8.13-26.1.1.el6uek.x86_64 #2 SMP Thu Feb 13 19:42:43 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@ORACLE ~]# sysctl -a | grep "shm"
kernel.shm_rmid_forced = 0
kernel.shmall = 4294967296
kernel.shmmax = 68719476736
kernel.shmmni = 4096
vm.hugetlb_shm_group = 0
[root@ORACLE ~]# ipcs -l
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 67108864
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
 
------ Messages: Limits --------
max queues system wide = 15615
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536
[root@ORACLE ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62292
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) 62292
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@ORACLE ~]# rpm -qa | grep "postgresql"
postgresql-8.4.20-1.el6_5.x86_64
postgresql-devel-8.4.20-1.el6_5.x86_64
postgresql-libs-8.4.20-1.el6_5.x86_64
postgresql-server-8.4.20-1.el6_5.x86_64
[root@ORACLE ~]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 1975
temp_buffers = 2000
work_mem=200MB
wal_buffers = 2500
port = 5432
 
[root@ORACLE ~]# psql
psql (8.4.20)
Type "help" for help.
 
# show shared_buffers;
shared_buffers
----------------
8MB
(1 row)

A noter que le fichier /etc/sysctl.conf modifier la valeur shmall dans cette version de Linux.

[root@ORACLE ~]# grep "kernel." /etc/sysctl.conf
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

Oracle Linux 7.0 64 bits :

[root@Oracle7 ~]# uname -a
Linux Oracle7 3.8.13-35.3.1.el7uek.x86_64 #2 SMP Wed Jun 25 15:27:43 PDT 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@Oracle7 ~]# sysctl -a | grep "shm"
kernel.shm_rmid_forced = 0
kernel.shmall = 268435456
kernel.shmmax = 4294967295
kernel.shmmni = 4096
vm.hugetlb_shm_group = 0
[root@Oracle7 ~]# ipcs -l
 
------ Messages Limits --------
max queues system wide = 3488
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 1073741824
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
[root@Oracle7 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 13863
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) 13863
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@Oracle7 ~]# rpm -qa | grep postgresql
postgresql-server-9.2.7-1.el7.x86_64
postgresql-devel-9.2.7-1.el7.x86_64
postgresql-libs-9.2.7-1.el7.x86_64
postgresql-docs-9.2.7-1.el7.x86_64
postgresql-9.2.7-1.el7.x86_64
[root@Oracle7 ~]# cat /var/lib/pgsql/data/postgresql.conf 
port = 5432                             # (change requires restart)
max_connections = 1958                  # (change requires restart)
shared_buffers = 32MB                   # min 128kB
logging_collector = on                  # Enable capturing of stderr and csvlog
log_filename = 'postgresql-%a.log'      
log_truncate_on_rotation = on          
log_rotation_age = 1d                   
log_rotation_size = 0                   
log_timezone = 'Europe/Paris'
datestyle = 'iso, mdy'
timezone = 'Europe/Paris'
lc_messages = 'en_US.UTF-8'             
lc_monetary = 'en_US.UTF-8'                    
lc_numeric = 'en_US.UTF-8'                      
lc_time = 'en_US.UTF-8'                         
default_text_search_config = 'pg_catalog.english'

Le fichier /etc/sysctl.conf est vide.

En résumé :

 

OS max_connections (limite) shared_buffers kernel.shmmax
Redhat 7.2 32b ?  ?  ?
Redhat 8.0 32b 496 2048 33554432
Fédora 9.0 32b 253 4MB 33554432
Fédora 14.0 32b 201 8MB 33554432
Fédora 14.0 32b 437 4MB 33554432
Fédora 17.0 32b 935 ? 4MB 33554432
Fédora 17.0 64b 421 4MB 33554432
Oracle Linux 6.5 64b 1975  8MB 68719476736
Oracle Linux 7.0 64b 1958  32MB 4294967295

Les versions de Linux que j’ai utilisé dans l’ordre chronologique, depuis que je travaille sous Linux:

Pour plus d’information sur cette limitation voir les liens suivants :

http://docs.postgresqlfr.org/8.1/kernel-resources.html

https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling#Connection_Pooling_and_Acceleration

http://www.revsys.com/writings/postgresql-performance.html