# PostgreSQL Configuration for Foxhunt HFT Trading System # Optimized for high-performance trading workloads #============================================================================ # CONNECTION SETTINGS #============================================================================ listen_addresses = '*' port = 5432 max_connections = 200 superuser_reserved_connections = 3 #============================================================================ # RESOURCE USAGE #============================================================================ shared_buffers = 256MB # 25% of available RAM (1GB container) huge_pages = try temp_buffers = 8MB max_prepared_transactions = 200 work_mem = 4MB maintenance_work_mem = 64MB autovacuum_work_mem = -1 max_stack_depth = 2MB dynamic_shared_memory_type = posix #============================================================================ # WRITE AHEAD LOG (WAL) - Critical for HFT performance #============================================================================ wal_level = replica fsync = on synchronous_commit = on wal_sync_method = fdatasync full_page_writes = on wal_compression = on wal_buffers = 16MB wal_writer_delay = 200ms commit_delay = 0 commit_siblings = 5 # Checkpoints - Balance between performance and recovery checkpoint_segments = 32 # PostgreSQL < 9.5 max_wal_size = 1GB # PostgreSQL >= 9.5 min_wal_size = 80MB checkpoint_completion_target = 0.9 checkpoint_timeout = 5min checkpoint_warning = 30s #============================================================================ # ARCHIVING - For point-in-time recovery #============================================================================ archive_mode = on archive_command = 'cp %p /var/lib/postgresql/archive/%f' archive_timeout = 0 #============================================================================ # REPLICATION - For high availability #============================================================================ max_wal_senders = 3 wal_keep_segments = 100 # PostgreSQL < 13 wal_keep_size = 1GB # PostgreSQL >= 13 hot_standby = on hot_standby_feedback = off #============================================================================ # QUERY TUNING #============================================================================ random_page_cost = 1.1 # For SSD storage seq_page_cost = 1.0 cpu_tuple_cost = 0.01 cpu_index_tuple_cost = 0.005 cpu_operator_cost = 0.0025 effective_cache_size = 1GB # Available OS cache default_statistics_target = 100 #============================================================================ # PLANNER SETTINGS #============================================================================ enable_hashagg = on enable_hashjoin = on enable_indexscan = on enable_indexonlyscan = on enable_material = on enable_mergejoin = on enable_nestloop = on enable_seqscan = on enable_sort = on enable_tidscan = on #============================================================================ # ERROR REPORTING AND LOGGING #============================================================================ log_destination = 'stderr' logging_collector = off # Docker handles logging log_directory = '/var/log/postgresql' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_file_mode = 0600 log_truncate_on_rotation = off log_rotation_age = 1d log_rotation_size = 100MB # What to log log_min_messages = warning log_min_error_statement = error log_min_duration_statement = 1000 # Log queries longer than 1 second log_checkpoints = on log_connections = on log_disconnections = on log_lock_waits = on log_statement = 'none' # 'all' for debugging log_temp_files = 10MB log_timezone = 'UTC' #============================================================================ # RUNTIME STATISTICS #============================================================================ track_activities = on track_counts = on track_io_timing = on track_functions = none track_activity_query_size = 1024 stats_temp_directory = '/var/run/postgresql/stats_temp' # Shared preload libraries shared_preload_libraries = 'pg_stat_statements' #============================================================================ # AUTOVACUUM - Critical for maintaining performance #============================================================================ autovacuum = on log_autovacuum_min_duration = 0 autovacuum_max_workers = 3 autovacuum_naptime = 1min autovacuum_vacuum_threshold = 50 autovacuum_analyze_threshold = 50 autovacuum_vacuum_scale_factor = 0.2 autovacuum_analyze_scale_factor = 0.1 autovacuum_freeze_max_age = 200000000 autovacuum_multixact_freeze_max_age = 400000000 autovacuum_vacuum_cost_delay = 20ms autovacuum_vacuum_cost_limit = -1 #============================================================================ # CLIENT CONNECTION DEFAULTS #============================================================================ search_path = '"$user", public' default_tablespace = '' temp_tablespaces = '' check_function_bodies = on default_transaction_isolation = 'read committed' default_transaction_read_only = off default_transaction_deferrable = off session_replication_role = 'origin' statement_timeout = 0 lock_timeout = 0 idle_in_transaction_session_timeout = 0 vacuum_freeze_min_age = 50000000 vacuum_freeze_table_age = 150000000 vacuum_multixact_freeze_min_age = 5000000 vacuum_multixact_freeze_table_age = 150000000 bytea_output = 'hex' xmlbinary = 'base64' xmloption = 'content' gin_fuzzy_search_limit = 0 gin_pending_list_limit = 4MB #============================================================================ # LOCALE AND FORMATTING #============================================================================ datestyle = 'iso, mdy' intervalstyle = 'postgres' timezone = 'UTC' timezone_abbreviations = 'Default' extra_float_digits = 0 client_encoding = 'UTF8' lc_messages = 'en_US.utf8' lc_monetary = 'en_US.utf8' lc_numeric = 'en_US.utf8' lc_time = 'en_US.utf8' #============================================================================ # CUSTOM SETTINGS FOR HFT #============================================================================ # Optimize for trading workloads join_collapse_limit = 8 from_collapse_limit = 8 geqo = on geqo_threshold = 12 geqo_effort = 5 geqo_pool_size = 0 geqo_generations = 0 geqo_selection_bias = 2.0 geqo_seed = 0.0 # Background writer tuning bgwriter_delay = 200ms bgwriter_lru_maxpages = 100 bgwriter_lru_multiplier = 2.0 bgwriter_flush_after = 512kB # WAL writer tuning wal_writer_flush_after = 1MB # Synchronous replication (if using streaming replication) synchronous_standby_names = '' # Parallel query settings max_parallel_workers_per_gather = 2 max_parallel_workers = 8 parallel_tuple_cost = 0.1 parallel_setup_cost = 1000.0 min_parallel_table_scan_size = 8MB min_parallel_index_scan_size = 512kB