Centos 5.5의 간단한 PostgreSQL 8.4.4 쿼리로 매우 느린 IO


10

내가보고있는 이상하고 매우 느린 IO 패턴은 다음과 같습니다 (출력 iostat -dxk 1 /dev/xvdb1).

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.99  0.99     7.92     3.96    12.00     1.96 2206.00 502.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.99  0.00     3.96     0.00     8.00     0.99 2220.00 1004.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     1.00    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.99  0.99  0.00     7.92     0.00    16.00     1.14 2148.00 1004.00  99.41

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     2.01    0.00   0.00 100.40

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb1             0.00     0.00  1.00  1.00     4.00     8.00    12.00     2.01 1874.00 502.00 100.40

디스크 사용률 및 대기가 왜 그렇게 높으며 읽기 / 쓰기 속도가 너무 낮은 지 모르겠습니다. 그 이유는 무엇입니까?

쿼리되는 테이블에는 단순히 여러 개의 varchar 열만 있으며 그 중 하나는 last_name이며 인덱스 lower(last_name)는 실제로 인덱스됩니다. 쿼리 자체는 간단합니다.

SELECT * FROM consumer_m WHERE lower(last_name) = 'hoque';

Explain 출력은 다음과 같습니다.

                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on consumer_m  (cost=2243.90..274163.41 rows=113152 width=164)
   Recheck Cond: (lower((last_name)::text) = 'hoque'::text)
   ->  Bitmap Index Scan on consumer_m_last_name_index  (cost=0.00..2215.61 rows=113152 width=0)
         Index Cond: (lower((last_name)::text) = 'hoque'::text)

또한 데이터베이스가 auto_vacuum에 있으므로 명시적인 진공 / 분석이 수행되지 않았습니다.


postgresql.conf를 사용자 정의 했습니까? CentOS의 기본값이 RHEL 5.x와 동일한 경우 postgres에 대한 메모리가 부족하여 디스크 IO가 많이 발생할 수 있습니다. 이 테이블의 행이 얼마나 큽니까?
Thiago Figueiro

테이블은 분명히 인덱스와 마찬가지로 메모리에 적합합니다. 그런 식으로 분할되었습니다. 그리고 postgresql.conf는 적절히 사용자 정의되었습니다 (shared_buffers, effective_cache_size 등). 그렇지 않은 경우에도 이러한 성능 저하를 기대하지 않습니다.
ehsanul

답변:


5

장치가 /dev/xvdb1Xen에서 실행되고 있음을 의미합니다. 스토리지는 어떻게 구성되어 있습니까? 기본 장치가 경합인가, 어떻게 수행 iostat에 모습을 ?

가능한 한 그것을 제거 할 수 없다면, 그 곳에서 성능 비난의 소용돌이 치는 회 전자를 가리킬 것입니다.

기본적으로 이와 같은 성능 문제를 풀기위한 전반적인 접근 방식은 병목 현상이 발생할 수있는 모든 계층에 대해 생각한 다음 문제를 격리 할 때까지 각 계층을 제거하기위한 테스트를 고안하는 것입니다.


경합이 없습니다. 이것이 가상 서버라는 것은 옳지 만 하드 디스크는이 서버에 전적으로 전용되어 있으며 다른 서버 작업없이 한 번에 하나의 데이터베이스 쿼리 만 실행하고 있습니다. 스토리지는 회전하는 단일 SATA 디스크입니다. 거의 동일한 설정을 가진 두 개의 다른 (별도의) 서버 / 데이터베이스가 있지만 비슷한 쿼리 / 인덱싱이 주어지면 예상대로 낮은 IO로 빠르게 작동합니다.
ehsanul

iostat그림이 비슷한 지 확인하기 위해 dom0에서 디스크 를 실행할 수 있습니까 ? 두 수준에서 다른 기본 디스크 벤치 마크를 수행 할 수 있습니까? 그것은 적어도 다음에 볼 곳을 좁히는 데 도움이 될 것입니다.
mattdm

확실한. 출처 iostat가 어디 인지에 따라 왜 불일치가 예상 됩니까? 중요한가요? 실제로는 dom0에 직접 액세스 할 수는 없지만 얻을 수는 있습니다. fio그 동안 벤치마킹을 시도 합니다.
ehsanul

3
한 가지 : 스냅 샷으로 이러한 상황을 만들 수 있습니다
Hubert Kario

3
당신은 바로 mattdm이었고, dom0에 나타나는 경합이있었습니다. 의사 소통의 문제였습니다. 상사는 내 지식없이 다른 사람의 관리하에 다른 서버에 하드 디스크의 일부를 제공했습니다. 나는 그것이 우리가 항상 그것을 설정 한 방식이기 때문에 헌신적이라는 인상을 받았습니다. 나는 그것이 당신의 가정을 다시 확인하는 것이 항상 중요한 이유라고 생각합니다. 감사!
ehsanul

1

다음은 임의 순서로 제안됩니다.

  1. CentOS에서는 Autovacum이 기본적으로 켜져 있지 않습니다. 활성화하려면 여러 설정을해야합니다. vacum 프로세스가 실제로 실행되도록 다시 확인하십시오. 필요한 설정 중 하나를 놓치기 쉽습니다.

  2. 해당 검색어에 대해 두 번째 필터 단계를 수행해야하며,이 정보에 따라 비용이 많이들 수 있습니다. 나는 다음과 같은 색인을 고려할 것이다.

    인덱스 INDEX consumer_m_lower_last ON consumer_m (lower (last_name));

    쿼리와 일치하고 다시 검사를 제거합니다.

  3. 또한 mattdm이 지적했듯이 가상화 된 환경에서 iostat를 신뢰할 수 없습니다.

  4. XEN 환경에서 IO 문제가있는 경우 http://lonesysadmin.net/2008/02/21/elevatornoop/을 확인해야 합니다. 엘리베이터 설정은 영향을 줄 수 있지만이 정도는 아닙니다.

  5. 기본 디스크가 LVM 스냅 샷을 사용합니까? 관리 측면에서 매우 유용하지만 IO 성능을 저하시킬 수 있습니다. 사용중인 블록 장치가 스냅 샷이고 블록 장치의 스냅 샷이 생성 된 경우에도 마찬가지입니다.


제안 해 주셔서 감사합니다. 색인의 이름에서 "낮은"항목을 생략했지만 색인은 실제로 더 낮은 (last_name)입니다. 그래서 왜 재검사가 진행되는지 모르겠습니다. 마운트 된 디스크 /는 실제로 LVM 스냅 샷을 사용하고 있지만 데이터베이스가 저장된 스냅 샷은 아닙니다. 그래서 나는 그렇게 생각하지 않습니다. 그래도 다른 제안을 살펴볼 것입니다!
ehsanul

1

이것이 PostgreSQL의 문제이며 의심 할 여지없이 디스크 IO의 문제 일 것입니다. 다른 답변의 의견에서 언급했듯이 디스크 IO 문제 인 경우 Dom0에서 실제로 측정하여 발생하는 모든 것을 파악해야합니다.

나는 아주 비슷한 문제가 있었고 디스크 컨트롤러에 문제가있는 것으로 나타났습니다. 디스크 액세스 속도가 너무 느려 디스크 IO를 기다리는 동안 시스템 병목 현상이 발생했습니다 (로드 평균 및 대기 시간이 매우 높음) 컨트롤러를 제대로 인식하지 못하고 빠른 SATA 컨트롤러 대신 구식 IDE 컨트롤러로 되돌아갔습니다.

수정은 함께 부팅했다

hda=noprobe hda=none 

/etc/grub.conf의 커널 문자열 끝에서 (물론, 당신이 가지고있는 모든 디스크를 추가하십시오 : hdc=noprobe, hdc=none, hdd=...)


고마워, 그러나이 경우에는 훨씬 더 어리석은 것으로 밝혀졌습니다. 어쨌든 투표하십시오.
ehsanul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.