상황에 따라 postgresql 9.2 데이터베이스가 항상 많이 업데이트되었습니다. 따라서 시스템은 I / O 바운드이며 현재 다른 업그레이드를 고려하고 있습니다. 개선을 시작할 위치에 대한 지침이 필요합니다.
다음은 지난 3 개월 동안 상황이 어떻게 보이는지 보여줍니다.
보다시피, 업데이트 작업은 대부분의 디스크 사용률을 설명합니다. 다음은 상황이보다 상세한 3 시간 창에서 어떻게 보이는지에 대한 또 다른 그림입니다.
보시다시피 최대 쓰기 속도는 약 20MB / s입니다.
소프트웨어
서버가 ubuntu 12.04 및 postgresql 9.2를 실행 중입니다. 업데이트 유형은 일반적으로 ID로 식별되는 개별 행에서 소규모로 업데이트됩니다. 예 UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id
. 가능한 한 인덱스를 제거하고 최적화했으며 서버 구성 (리눅스 커널과 postgres conf 모두)도 매우 최적화되었습니다.
하드웨어이 하드웨어는 RAID 10 어레이에 32GB ECC 램, 4x 600GB 15.000 rpm SAS 디스크가있는 전용 서버이며 BBU가있는 LSI RAID 컨트롤러와 Intel Xeon E3-1245 Quadcore 프로세서로 제어됩니다.
질문
- 그래프에서 볼 수있는 성능이이 구경의 시스템에 적합합니까 (읽기 / 쓰기)?
- 따라서 하드웨어 업그레이드에 중점을 두거나 소프트웨어에 대해 더 자세히 조사해야합니까 (커널 조정, conf, 쿼리 등)?
- 하드웨어 업그레이드를 수행하는 경우 디스크 수는 성능의 핵심입니까?
------------------------------최신 정보------------------- ----------------
이제 이전 15k SAS 디스크 대신 4 개의 인텔 520 SSD로 데이터베이스 서버를 업그레이드했습니다. 같은 RAID 컨트롤러를 사용하고 있습니다. 다음과 같이 피크 I / O 성능이 약 6-10 배 향상되었음을 알 수 있듯이 상황이 상당히 개선되었습니다. 그러나 새 SSD의 답변과 I / O 기능에 따라 20-50 배 정도 개선 될 것으로 기대했습니다. 여기 또 다른 질문이 있습니다.
새 질문 현재 구성에 시스템의 I / O 성능을 제한하는 요소가 있습니까 (병목 현상이있는 위치)?
내 구성 :
/etc/postgresql/9.2/main/postgresql.conf
data_directory = '/var/lib/postgresql/9.2/main'
hba_file = '/etc/postgresql/9.2/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.2/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.2-main.pid'
listen_addresses = '192.168.0.4, localhost'
port = 5432
unix_socket_directory = '/var/run/postgresql'
wal_level = hot_standby
synchronous_commit = on
checkpoint_timeout = 10min
archive_mode = on
archive_command = 'rsync -a %p postgres@192.168.0.2:/var/lib/postgresql/9.2/wals/%f </dev/null'
max_wal_senders = 1
wal_keep_segments = 32
hot_standby = on
log_line_prefix = '%t '
datestyle = 'iso, mdy'
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'
default_statistics_target = 100
maintenance_work_mem = 1920MB
checkpoint_completion_target = 0.7
effective_cache_size = 22GB
work_mem = 160MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 7680MB
max_connections = 400
/etc/sysctl.conf
# sysctl config
#net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
# ipv6 settings (no autoconfiguration)
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_dad=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_dad=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra_rtr_pref=0
net.ipv6.conf.all.accept_ra_pinfo=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=0
# Updated according to postgresql tuning
vm.dirty_ratio = 10
vm.dirty_background_ratio = 1
vm.swappiness = 0
vm.overcommit_memory = 2
kernel.sched_autogroup_enabled = 0
kernel.sched_migration_cost = 50000000
/etc/sysctl.d/30-postgresql-shm.conf
# Shared memory settings for PostgreSQL
# Note that if another program uses shared memory as well, you will have to
# coordinate the size settings between the two.
# Maximum size of shared memory segment in bytes
#kernel.shmmax = 33554432
# Maximum total size of shared memory in pages (normally 4096 bytes)
#kernel.shmall = 2097152
kernel.shmmax = 8589934592
kernel.shmall = 17179869184
# Updated according to postgresql tuning
출력 MegaCli64 -LDInfo -LAll -aAll
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name :
RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0
Size : 446.125 GB
Sector Size : 512
Is VD emulated : No
Mirror Data : 446.125 GB
State : Optimal
Strip Size : 64 KB
Number Of Drives per span:2
Span Depth : 2
Default Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy : Disk's Default
Encryption Type : None
Is VD Cached: No
synchronous_commit
. '비동기 커밋은 데이터베이스가 충돌하면 최신 트랜잭션이 손실 될 수있는 비용으로 트랜잭션을보다 빠르게 완료 할 수있는 옵션입니다.'
synchronous_commit = off
에서 문서를 읽은 후으로 시도하십시오 . (삼). 구성은 어떻게 생겼습니까? 예 : 이 쿼리의 결과 :SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');