1

我的 postgresql 服务器非常慢。特别是当我在不同的线程中同时执行多个查询时,有时会导致 postgresql 服务器在 5 到 15 秒内无响应。我想知道我是否在 postgresql.conf 中犯了错误。

我的专用服务器有 2 个内核和 4 GB 内存,以及一个标准 SATA-2 磁盘。postgres db(8.4版)中有6gb的数据,同时连接了几百个用户。我正在使用 JDBC 访问 postgress,同时运行 1 到 10 个访问数据库的线程。我的服务器是 debian lenny。Cpu 没有 100% 使用,内存也没有。

感谢您提供任何帮助。

    # -----------------------------
    # PostgreSQL configuration file
    # -----------------------------
    #
    # This file consists of lines of the form:
    #
    #   name = value
    #
    # (The "=" is optional.)  Whitespace may be used.  Comments are introduced with
    # "#" anywhere on a line.  The complete list of parameter names and allowed
    # values can be found in the PostgreSQL documentation.
    #
    # The commented-out settings shown in this file represent the default values.
    # Re-commenting a setting is NOT sufficient to revert it to the default value;
    # you need to reload the server.
    #
    # This file is read on server startup and when the server receives a SIGHUP
    # signal.  If you edit the file on a running system, you have to SIGHUP the
    # server for the changes to take effect, or use "pg_ctl reload".  Some
    # parameters, which are marked below, require a server shutdown and restart to
    # take effect.
    #
    # Any parameter can also be given as a command-line option to the server, e.g.,
    # "postgres -c log_connections=on".  Some parameters can be changed at run time
    # with the "SET" SQL command.
    #
    # Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
    #                MB = megabytes                     s   = seconds
    #                GB = gigabytes                     min = minutes
    #                                                   h   = hours
    #                                                   d   = days


    #------------------------------------------------------------------------------
    # FILE LOCATIONS
    #------------------------------------------------------------------------------

    # The default values of these variables are driven from the -D command-line
    # option or PGDATA environment variable, represented here as ConfigDir.

    data_directory = '/home/keyja/dbdata'       # use data in another directory
                        # (change requires restart)
    hba_file = '/etc/postgresql/8.4/main/pg_hba.conf'   # host-based authentication file
                        # (change requires restart)
    ident_file = '/etc/postgresql/8.4/main/pg_ident.conf'   # ident configuration file
                        # (change requires restart)

    # If external_pid_file is not explicitly set, no extra PID file is written.
    external_pid_file = '/var/run/postgresql/8.4-main.pid'      # write an extra PID file
                        # (change requires restart)


    #------------------------------------------------------------------------------
    # CONNECTIONS AND AUTHENTICATION
    #------------------------------------------------------------------------------

    # - Connection Settings -

    listen_addresses = '*'      # what IP address(es) to listen on;
                        # comma-separated list of addresses;
                        # defaults to 'localhost', '*' = all
                        # (change requires restart)
    port = 5432             # (change requires restart)
    max_connections = 100           # (change requires restart)
    # Note:  Increasing max_connections costs ~400 bytes of shared memory per 
    # connection slot, plus lock space (see max_locks_per_transaction).
    #superuser_reserved_connections = 3 # (change requires restart)
    unix_socket_directory = '/var/run/postgresql'       # (change requires restart)
    #unix_socket_group = ''         # (change requires restart)
    #unix_socket_permissions = 0777     # begin with 0 to use octal notation
                        # (change requires restart)
    #bonjour_name = ''          # defaults to the computer name
                        # (change requires restart)

    # - Security and Authentication -

    #authentication_timeout = 1min      # 1s-600s
    ssl = true              # (change requires restart)
    #ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'  # allowed SSL ciphers
                        # (change requires restart)
    #ssl_renegotiation_limit = 512MB    # amount of data between renegotiations
    #password_encryption = on
    #db_user_namespace = off

    # Kerberos and GSSAPI
    #krb_server_keyfile = ''
    #krb_srvname = 'postgres'       # (Kerberos only)
    #krb_caseins_users = off

    # - TCP Keepalives -
    # see "man 7 tcp" for details

    #tcp_keepalives_idle = 0        # TCP_KEEPIDLE, in seconds;
                        # 0 selects the system default
    #tcp_keepalives_interval = 0        # TCP_KEEPINTVL, in seconds;
                        # 0 selects the system default
    #tcp_keepalives_count = 0       # TCP_KEEPCNT;
                        # 0 selects the system default


    #------------------------------------------------------------------------------
    # RESOURCE USAGE (except WAL)
    #------------------------------------------------------------------------------

    # - Memory -

    shared_buffers = 1024MB         # min 128kB
                        # (change requires restart)
    #temp_buffers = 8MB         # min 800kB
    #max_prepared_transactions = 0      # zero disables the feature
                        # (change requires restart)
    # Note:  Increasing max_prepared_transactions costs ~600 bytes of shared memory
    # per transaction slot, plus lock space (see max_locks_per_transaction).
    # It is not advisable to set max_prepared_transactions nonzero unless you
    # actively intend to use prepared transactions.
    work_mem = 100MB                # min 64kB
    maintenance_work_mem = 160MB        # min 1MB
    #max_stack_depth = 2MB          # min 100kB

    # - Kernel Resource Usage -

    #max_files_per_process = 1000       # min 25
                        # (change requires restart)
    #shared_preload_libraries = ''      # (change requires restart)

    # - Cost-Based Vacuum Delay -

    #vacuum_cost_delay = 0ms        # 0-100 milliseconds
    #vacuum_cost_page_hit = 1       # 0-10000 credits
    #vacuum_cost_page_miss = 10     # 0-10000 credits
    #vacuum_cost_page_dirty = 20        # 0-10000 credits
    #vacuum_cost_limit = 200        # 1-10000 credits

    # - Background Writer -

    #bgwriter_delay = 200ms         # 10-10000ms between rounds
    #bgwriter_lru_maxpages = 100        # 0-1000 max buffers written/round
    #bgwriter_lru_multiplier = 2.0      # 0-10.0 multipler on buffers scanned/round

    # - Asynchronous Behavior -

    #effective_io_concurrency = 1       # 1-1000. 0 disables prefetching


    #------------------------------------------------------------------------------
    # WRITE AHEAD LOG
    #------------------------------------------------------------------------------

    # - Settings -

    fsync = off             # turns forced synchronization on or off
    #synchronous_commit = on        # immediate fsync at commit
    #wal_sync_method = fsync        # the default is the first option 
                        # supported by the operating system:
                        #   open_datasync
                        #   fdatasync (default on Linux)
                        #   fsync
                        #   fsync_writethrough
                        #   open_sync
    full_page_writes = off          # recover from partial page writes
    #wal_buffers = 64kB         # min 32kB
                        # (change requires restart)
    #wal_writer_delay = 200ms       # 1-10000 milliseconds

    #commit_delay = 0           # range 0-100000, in microseconds
    #commit_siblings = 5            # range 1-1000

    # - Checkpoints -

    checkpoint_segments = 20        # in logfile segments, min 1, 16MB each
    #checkpoint_timeout = 5min      # range 30s-1h
    checkpoint_completion_target = 0.9  # checkpoint target duration, 0.0 - 1.0
    #checkpoint_warning = 30s       # 0 disables

    # - Archiving -

    #archive_mode = off     # allows archiving to be done
                    # (change requires restart)
    #archive_command = ''       # command to use to archive a logfile segment
    #archive_timeout = 0        # force a logfile segment switch after this
                    # number of seconds; 0 disables


    #------------------------------------------------------------------------------
    # QUERY TUNING
    #------------------------------------------------------------------------------

    # - Planner Method Configuration -

    #enable_bitmapscan = on
    #enable_hashagg = on
    #enable_hashjoin = on
    #enable_indexscan = on
    #enable_mergejoin = on
    #enable_nestloop = on
    #enable_seqscan = on
    #enable_sort = on
    #enable_tidscan = on

    # - Planner Cost Constants -

    #seq_page_cost = 1.0            # measured on an arbitrary scale
    #random_page_cost = 4.0         # same scale as above
    #cpu_tuple_cost = 0.01          # same scale as above
    #cpu_index_tuple_cost = 0.005       # same scale as above
    #cpu_operator_cost = 0.0025     # same scale as above
    effective_cache_size = 256MB

    # - Genetic Query Optimizer -

    #geqo = on
    #geqo_threshold = 12
    #geqo_effort = 5            # range 1-10
    #geqo_pool_size = 0         # selects default based on effort
    #geqo_generations = 0           # selects default based on effort
    #geqo_selection_bias = 2.0      # range 1.5-2.0

    # - Other Planner Options -

    #default_statistics_target = 100    # range 1-10000
    #constraint_exclusion = partition   # on, off, or partition
    #cursor_tuple_fraction = 0.1        # range 0.0-1.0
    #from_collapse_limit = 8
    #join_collapse_limit = 8        # 1 disables collapsing of explicit 
                        # JOIN clauses


    #------------------------------------------------------------------------------
    # ERROR REPORTING AND LOGGING
    #------------------------------------------------------------------------------

    # - Where to Log -

    log_destination = 'stderr'      # Valid values are combinations of
                        # stderr, csvlog, syslog and eventlog,
                        # depending on platform.  csvlog
                        # requires logging_collector to be on.

    # This is used when logging to stderr:
    logging_collector = ON      # Enable capturing of stderr and csvlog
                        # into log files. Required to be on for
                        # csvlogs.
                        # (change requires restart)

    # These are only used if logging_collector is on:
    log_directory = 'pg_log'        # directory where log files are written,
                        # can be absolute or relative to PGDATA
    log_filename = 'postgresql_%A.log'  # log file name pattern,
                        # can include strftime() escapes
    log_truncate_on_rotation = on       # If on, an existing log file of the
                        # same name as the new log file will be
                        # truncated rather than appended to.
                        # But such truncation only occurs on
                        # time-driven rotation, not on restarts
                        # or size-driven rotation.  Default is
                        # off, meaning append to existing files
                        # in all cases.
    log_rotation_age = 1d           # Automatic rotation of logfiles will
                        # happen after that time.  0 disables.
    #log_rotation_size = 10MB       # Automatic rotation of logfiles will 
                        # happen after that much log output.
                        # 0 disables.

    # These are relevant when logging to syslog:
    #syslog_facility = 'LOCAL0'
    #syslog_ident = 'postgres'

    silent_mode = on            # Run server silently.
                        # DO NOT USE without syslog or
                        # logging_collector
                        # (change requires restart)


    # - When to Log -

    #client_min_messages = notice       # values in order of decreasing detail:
                        #   debug5
                        #   debug4
                        #   debug3
                        #   debug2
                        #   debug1
                        #   log
                        #   notice
                        #   warning
                        #   error

    #log_min_messages = warning     # values in order of decreasing detail:
                        #   debug5
                        #   debug4
                        #   debug3
                        #   debug2
                        #   debug1
                        #   info
                        #   notice
                        #   warning
                        #   error
                        #   log
                        #   fatal
                        #   panic

    #log_error_verbosity = default      # terse, default, or verbose messages

    #log_min_error_statement = error    # values in order of decreasing detail:
                        #   debug5
                        #   debug4
                        #   debug3
                        #   debug2
                        #   debug1
                        #   info
                        #   notice
                        #   warning
                        #   error
                        #   log
                        #   fatal
                        #   panic (effectively off)

    log_min_duration_statement = 1000   # -1 is disabled, 0 logs all statements
                        # and their durations, > 0 logs only
                        # statements running at least this number
                        # of milliseconds


    # - What to Log -

    #debug_print_parse = off
    #debug_print_rewritten = off
    #debug_print_plan = off
    #debug_pretty_print = on
    #log_checkpoints = off
    #log_connections = off
    #log_disconnections = off
    log_duration = off
    #log_hostname = off
    log_line_prefix = '%t [%p]: [%l-1] '            # special values:
                        #   %u = user name
                        #   %d = database name
                        #   %r = remote host and port
                        #   %h = remote host
                        #   %p = process ID
                        #   %t = timestamp without milliseconds
                        #   %m = timestamp with milliseconds
                        #   %i = command tag
                        #   %c = session ID
                        #   %l = session line number
                        #   %s = session start timestamp
                        #   %v = virtual transaction ID
                        #   %x = transaction ID (0 if none)
                        #   %q = stop here in non-session
                        #        processes
                        #   %% = '%'
                        # e.g. '<%u%%%d> '
    #log_lock_waits = off           # log lock waits >= deadlock_timeout
    log_statement = 'all'           # none, ddl, mod, all
    #log_temp_files = -1            # log temporary files equal or larger
                        # than the specified size in kilobytes;
                        # -1 disables, 0 logs all temp files
    #log_timezone = unknown         # actually, defaults to TZ environment
                        # setting


    #------------------------------------------------------------------------------
    # RUNTIME STATISTICS
    #------------------------------------------------------------------------------

    # - Query/Index Statistics Collector -

    #track_activities = on
    track_counts = on
    #track_functions = none         # none, pl, all
    #track_activity_query_size = 1024
    #update_process_title = on
    #stats_temp_directory = 'pg_stat_tmp'


    # - Statistics Monitoring -

    #log_parser_stats = off
    #log_planner_stats = off
    #log_executor_stats = off
    #log_statement_stats = off


    #------------------------------------------------------------------------------
    # AUTOVACUUM PARAMETERS
    #------------------------------------------------------------------------------

    autovacuum = on         # Enable autovacuum subprocess?  'on' 
                        # requires track_counts to also be on.
    log_autovacuum_min_duration = -1    # -1 disables, 0 logs all actions and
                        # their durations, > 0 logs only
                        # actions running at least this number
                        # of milliseconds.
    autovacuum_max_workers = 3      # max number of autovacuum subprocesses
    autovacuum_naptime = 1min       # time between autovacuum runs
    autovacuum_vacuum_threshold = 50    # min number of row updates before
                        # vacuum
    autovacuum_analyze_threshold = 50   # min number of row updates before 
                        # analyze
    autovacuum_vacuum_scale_factor = 0.2    # fraction of table size before vacuum
    autovacuum_analyze_scale_factor = 0.1   # fraction of table size before analyze
    autovacuum_freeze_max_age = 200000000   # maximum XID age before forced vacuum
                        # (change requires restart)
    autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for
                        # autovacuum, in milliseconds;
                        # -1 means use vacuum_cost_delay
    autovacuum_vacuum_cost_limit = -1   # default vacuum cost limit for
                        # autovacuum, -1 means use
                        # vacuum_cost_limit


    #------------------------------------------------------------------------------
    # CLIENT CONNECTION DEFAULTS
    #------------------------------------------------------------------------------

    # - Statement Behavior -

    #search_path = '"$user",public'     # schema names
    #default_tablespace = ''        # a tablespace name, '' uses the default
    #temp_tablespaces = ''          # a list of tablespace names, '' uses
                        # only default tablespace
    #check_function_bodies = on
    #default_transaction_isolation = 'read committed'
    #default_transaction_read_only = off
    #session_replication_role = 'origin'
    #statement_timeout = 0          # in milliseconds, 0 is disabled
    #vacuum_freeze_min_age = 50000000
    #vacuum_freeze_table_age = 150000000
    #xmlbinary = 'base64'
    #xmloption = 'content'

    # - Locale and Formatting -

    datestyle = 'iso, dmy'
    #intervalstyle = 'postgres'
    #timezone = unknown         # actually, defaults to TZ environment
                        # setting
    #timezone_abbreviations = 'Default'     # Select the set of available time zone
                        # abbreviations.  Currently, there are
                        #   Default
                        #   Australia
                        #   India
                        # You can create your own file in
                        # share/timezonesets/.
    #extra_float_digits = 0         # min -15, max 2
    #client_encoding = sql_ascii        # actually, defaults to database
                        # encoding

    # These settings are initialized by initdb, but they can be changed.
    lc_messages = 'en_GB'           # locale for system error message
                        # strings
    lc_monetary = 'en_GB'           # locale for monetary formatting
    lc_numeric = 'en_GB'            # locale for number formatting
    lc_time = 'en_GB'               # locale for time formatting

    # default configuration for text search
    default_text_search_config = 'pg_catalog.english'

    # - Other Defaults -

    #dynamic_library_path = '$libdir'
    #local_preload_libraries = ''


    #------------------------------------------------------------------------------
    # LOCK MANAGEMENT
    #------------------------------------------------------------------------------

    #deadlock_timeout = 1s
    #max_locks_per_transaction = 64     # min 10
                        # (change requires restart)
    # Note:  Each lock table slot uses ~270 bytes of shared memory, and there are
    # max_locks_per_transaction * (max_connections + max_prepared_transactions)
    # lock table slots.


    #------------------------------------------------------------------------------
    # VERSION/PLATFORM COMPATIBILITY
    #------------------------------------------------------------------------------

    # - Previous PostgreSQL Versions -

    #add_missing_from = off
    #array_nulls = on
    #backslash_quote = safe_encoding    # on, off, or safe_encoding
    #default_with_oids = off
    #escape_string_warning = on
    #regex_flavor = advanced        # advanced, extended, or basic
    #sql_inheritance = on
    #standard_conforming_strings = off
    #synchronize_seqscans = on

    # - Other Platforms and Clients -

    #transform_null_equals = off


    #------------------------------------------------------------------------------
    # CUSTOMIZED OPTIONS
    #------------------------------------------------------------------------------

    #custom_variable_classes = ''       # list of custom variable class names
4

1 回答 1

4

数百个用户同时连接

最大连接数 = 100

你在使用连接池吗?如果是这样,是哪一个,它是如何配置的?

我正在使用 JDBC 访问 postgress,同时运行 1 到 10 个访问数据库的线程。

... 或者您的 Java 应用程序是否有效地处理了连接池?如果是这样,10 是其数据库连接的硬限制吗?

2 个内核和 4 GB 内存,以及一个标准 SATA-2 磁盘

多少并发查询往往会导致问题?你没有很多资源可以分享。您可能应该将活动数据库事务限制为大约 5 个。

共享缓冲区 = 1024MB
工作内存 = 100MB

由于每个连接可以为每个计划节点分配work_mem一次空间,因此不需要很多并发查询就可以完全降低性能。

fsync = 关闭
full_page_writes = 关闭

通过这些设置,你告诉 PostgreSQL 如果操作系统、硬件或虚拟机崩溃,丢失数据库中的所有数据是可以的——你要么不关心数据库中的数据,要么你愿意去您最新的已知良好备份。如果您关闭这些on并关闭,synchronous_commit您的性能将几乎相同,但您不会在操作系统崩溃时冒不可恢复的数据库损坏的风险;只是在提交事务时,数据实际上可能不会在短时间内持久化,通常不到一秒。

8.4版

从那以后的每个版本都包括对检查点处理的改进,这可能会降低您描述的问题类型的频率和严重性。你应该考虑升级。

于 2012-08-17T15:54:43.613 回答