업데이트 (소프트웨어 및 하드웨어)에서 대량 I / O를 위해 데이터베이스를 최적화하는 방법


20

상황에 따라 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

(1). 열이 색인화되지 않은 경우 HOT를 활용할 수 있습니다 ( git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/… 참조 ). (2). postgresql.org/docs/9.2/static/wal-async-commit.htmlsynchronous_commit = off 에서 문서를 읽은 후으로 시도하십시오 . (삼). 구성은 어떻게 생겼습니까? 예 : 이 쿼리의 결과 :SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');
bma

@bma 다음과 같은 경고를 추가하겠습니다 synchronous_commit. '비동기 커밋은 데이터베이스가 충돌하면 최신 트랜잭션이 손실 될 수있는 비용으로 트랜잭션을보다 빠르게 완료 할 수있는 옵션입니다.'
dezso

@ dezso 내가 언급 한 문서 섹션에 대해 더 분명해야했습니다. 설명해 주셔서 감사합니다. 내가 제기 한 이유는 (하이버 네이트를 사용하는) 부하가 큰 서버 중 하나가 어려움을 겪고 있었기 때문에 비동기 커밋으로 전환하기로 결정하고 부하의 40 %가 사실상 사라졌기 때문입니다. 대부분의 시스템에는 권장되지 않지만 경우에 따라 서버 업그레이드와 응용 프로그램 변경 사이의 시간을 구매할 수 있습니다.
bma

답변:


10

하드웨어 업그레이드를 수행하는 경우 디스크 수는 성능의 핵심입니까?

그렇습니다. 심지어 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 번호는 하드웨어에 나쁘지 않습니다. 내가 기대하는 것 내에서.


6

여유 공간이 있으면 pg_xlog를 자체 컨트롤러의 별도 RAID 1 드라이브 쌍에 배터리 백업 RAM이 기록 된 상태로 기록하십시오. 다른 모든 것이 SSD에있는 동안 pg_xlog에 회전 녹을 사용해야하는 경우에도 마찬가지입니다.

SSD를 사용하는 경우 정전시 모든 캐시 된 데이터를 유지할 수있는 수퍼 커패시터 또는 기타 수단이 있는지 확인하십시오.

일반적으로 스핀들 수가 많을수록 더 많은 I / O 대역폭을 의미합니다.


불행히도 나는 레이드 컨트롤러에 4 개의 HDD 슬롯 만 있습니다. 다른 모든 디스크가 SSD 인 경우 왜 pg_xlog를 별도의 어레이에 배치합니까?
Niels Kristian

2
@NielsKristian 저는 대부분의 시스템에서 트랜잭션 로그가 디스크에서 가장 많이 쓰여진 것이라고 말할 때 맞습니다. 또한 쓰기는 기본적으로 데이터 쓰기와 병렬로 수행됩니다. 헤드가 pg_xlog 또는 데이터 폴더에 있으므로 HDD를 사용하여 두 가지를 동시에 수행 할 수 없습니다. (심각한 단순화 경고!) 두 작업을 분리하면 IO 부담이 두 개의 독립적 인 디스크 / 어레이로 나뉩니다.
dezso

2
액세스는 거의 순차적 때문에 @dezso는 말뿐만 아니라, 하드 드라이브, 그래서 시간을 추구 WAL 전용 스토리지에 대한 확인이다는 최소한 ..
kgrittn

1

Linux에서 실행 중이라고 가정하면 디스크 IO 스케줄러를 설정하십시오.

과거 경험에서 noop으로 전환하면 상당히 빠른 속도를 낼 수 있습니다 (특히 SSD의 경우).

가동 중지 시간없이 IO 스케줄러를 즉시 변경할 수 있습니다.

즉. echo noop> / sys / block // queue / scheduler

자세한 내용은 http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/ 를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.