사용량이 많은 시간 동안 데이터베이스 서버에 대한 트래픽을 처리하는 데 문제가 있습니다. 우리는 하드웨어를 개선하기 위해 노력하고 있지만 ( 이 측면에 대한이 질문 참조 ) 풀링 구성 및 서버 조정 작업도 원합니다.
우리가 작업하고있는 애플리케이션은 스마트 폰을위한 턴 기반 멀티 플레이어 게임입니다. 백엔드는 레일스 로 유니콘 과 PostgreSQL 9.1 을 데이터베이스로 구성합니다. 현재 6 억 명의 등록 된 사용자가 있으며 게임 상태가 데이터베이스에 저장되므로 몇 초마다 수천 번의 쓰기가 수행됩니다. 우리는 PgBadger를 사용하여 PostgreSQL 의 로그 파일을 분석했으며 중요한 시간 동안 많은 것을 얻습니다.
FATAL: remaining connection slots are reserved for non-replication superuser connections
이 문제를 해결하는 순진한 해결책 은 postgresql.conf 에서 max_connections (현재 100) 를 늘리는 것 입니다. 나는 이것이 옳지 않을 수도 있음을 나타내는 http://wiki.postgresql.org/wiki/Number_Of_Database_Connections 를 읽었습니다 . 앞에서 언급 한 기사에서 max_connections와 pool size 사이의 스위트 스팟을 찾는 것을 언급했습니다 .
이 스위트 스팟을 찾기 위해 무엇을 할 수 있습니까? max_connections 및 풀 크기 의 다른 값에 대한 I / O 성능을 측정 할 수있는 유용한 도구가 있습니까?
현재 설정은 4 개의 게임 서버이며 각 서버에는 16 명의 유니콘 작업자가 있고 수영장 크기는 5입니다.
우리가 사용하는 기본이 아닌 postgres 설정은 다음과 같습니다.
version | PostgreSQL 9.1.5 on x86_64-unknown-linux-gnu,compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
checkpoint_completion_target | 0.9
checkpoint_segments | 60
checkpoint_timeout | 6min
client_encoding | UTF8
effective_cache_size | 2GB
lc_collate | en_US.UTF-8
lc_ctype | en_US.UTF-8
log_destination | csvlog
log_directory | pg_log
log_filename | postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix | %t
log_min_duration_statement | 200ms
log_rotation_age | 1d
log_rotation_size | 10MB
logging_collector | on
max_connections | 100
max_stack_depth | 2MB
server_encoding | UTF8
shared_buffers | 1GB
ssl | on
TimeZone | localtime
wal_buffers | 16MB
work_mem | 8MB
INSERT? 스키마는 어떻습니까-파티션되어 있습니까? 무엇 explain analyze몇 가지 예제 쿼리는? 검문소는 얼마나 자주, 얼마나 걸립니까? 검사 점 로깅 옵션을 참조하십시오. 그리고 진지하게, PostgreSQL 버전은 무엇입니까? (업데이트 : 여기에 하드웨어를 나열한 것 같습니다 : dba.stackexchange.com/questions/28061/… )
synchronous_commit = off
synchronous_commit = off하고commit_delay있습니까?