상황에
따라 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
답변
하드웨어 업그레이드를 수행하는 경우 디스크 수는 성능의 핵심입니까?
그렇습니다. 심지어 SAS조차도 하드 디스크로서 이동하는데 시간이 걸리는 헤드가 있습니다.
엄청난 업그레이드를 원하십니까?
SAS 디스크를 죽이고 SATA로 이동하십시오. Samsung 843T와 같은 엔터프라이즈 급 SATA SSD를 연결하십시오.
결과? 드라이브 당 약 60.000 (즉, 6 만) IOPS를 수행 할 수 있습니다.
이것이 SSD가 DB 공간에서 킬러이며 SAS 드라이브보다 훨씬 저렴한 이유입니다. Phyiscal 회전 디스크는 디스크의 IOPS 기능을 따라 잡을 수 없습니다.
SAS 디스크는 시작하기에 평범한 선택이었습니다 (많은 IOPS를 얻기에는 너무 큼) 더 높은 사용 데이터베이스 (더 작은 디스크는 훨씬 더 많은 IOPS를 의미 함)의 경우 SSD는 결국 게임 체인저입니다.
소프트웨어 / 커널에 대하여. 적절한 데이터베이스는 많은 IOPS를 수행하고 버퍼를 플러시합니다. 기본 ACID 조건을 보장하려면 로그 파일을 작성해야합니다. 당신이 할 수있는 유일한 커널 조정은 트랜잭션 무결성을 무효화 할 것입니다-부분적으로 당신은 그것으로 벗어날 수 있습니다. 후기 입 모드의 Raid 컨트롤러는이를 수행합니다 (쓰기가 아닌 경우에도 쓰기가 플러시 된 것으로 확인 됨). 그러나 BBU는 정전이 발생한 날을 안전하다고 가정하기 때문에 그렇게 할 수 있습니다. 커널에서 더 높은 일을하면 부작용으로 살 수 있다는 것을 더 잘 알 수 있습니다.
결국 데이터베이스에는 IOPS가 필요하며 여기에 다른 설정과 비교하여 설정이 얼마나 작은 지 놀랄 수 있습니다. 필요한 IOPS를 얻기 위해 100 개 이상의 디스크가있는 데이터 배를 보았습니다. 그러나 실제로 오늘날 SSD를 구매하고 크기를 늘리십시오. IOPS 기능이 뛰어 나기 때문에 SAS 드라이브로이 게임과 싸우는 것은 의미가 없습니다.
그렇습니다. IOPS 번호는 하드웨어에 나쁘지 않습니다. 내가 기대하는 것 내에서.
답변
여유 공간이 있으면 pg_xlog를 자체 컨트롤러의 별도 RAID 1 드라이브 쌍에 배터리 백업 RAM이 기록 된 상태로 기록하십시오. 다른 모든 것이 SSD에있는 동안 pg_xlog에 회전 녹을 사용해야하는 경우에도 마찬가지입니다.
SSD를 사용하는 경우 정전시 모든 캐시 된 데이터를 유지할 수있는 수퍼 커패시터 또는 기타 수단이 있는지 확인하십시오.
일반적으로 스핀들 수가 많을수록 더 많은 I / O 대역폭을 의미합니다.
답변
Linux에서 실행 중이라고 가정하면 디스크 IO 스케줄러를 설정하십시오.
과거 경험에서 noop으로 전환하면 상당히 빠른 속도를 낼 수 있습니다 (특히 SSD의 경우).
가동 중지 시간없이 IO 스케줄러를 즉시 변경할 수 있습니다.
즉. echo noop> / sys / block // queue / scheduler
자세한 내용은 http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/ 를 참조하십시오.