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