IO cực kỳ chậm với các truy vấn đơn giản PostgreQuery 8.4.4 trên Centos 5.5


10

Mẫu IO lạ và cực kỳ chậm mà tôi thấy là đây (đầu ra của 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

Tôi không biết tại sao việc sử dụng đĩa và chờ đợi lại quá cao và tốc độ đọc / ghi rất thấp. Lý do cho điều này là gì?

Bảng được truy vấn đơn giản chỉ có một số cột varchar, một trong số đó là last_name, được lập chỉ mục (thực sự lower(last_name)được lập chỉ mục). Bản thân truy vấn rất đơn giản:

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

Đây là đầu ra giải thích:

                                           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)

Cũng lưu ý rằng cơ sở dữ liệu là trên auto_vacuum, vì vậy không có phân tích / chân không rõ ràng nào được thực hiện.


Bạn đã tùy chỉnh postgresql.conf của bạn? Nếu CentOS có các giá trị mặc định tương tự như RHEL 5.x, bạn sẽ có ít bộ nhớ cho các postgres, điều này có thể buộc rất nhiều IO đĩa. Làm thế nào lớn là các hàng trên bảng này?
Thiago Figueiro

Bảng phù hợp với bộ nhớ, rõ ràng là chỉ số; nó được phân vùng theo cách đó Và postgresql.conf đã được tùy chỉnh một cách thích hợp (shared_buffers, hiệu quả_cache_size, v.v.). Ngay cả khi đây không phải là trường hợp, tôi sẽ không mong đợi hiệu suất suy thoái như vậy.
ehsanul

Câu trả lời:


5

Thực tế là thiết bị của bạn /dev/xvdb1ngụ ý rằng bạn đang chạy theo Xen. Bộ nhớ của bạn được cấu hình như thế nào? Có cạnh tranh cho các thiết bị cơ bản, và như thế nào iostatnhìn vào đó ?

Trừ khi bạn có thể loại bỏ điều đó rất có thể, đó là nơi tôi sẽ chỉ ra kẻ quay vòng quay cuồng của sự đổ lỗi hiệu suất kém.

Về cơ bản, cách tiếp cận tổng thể để giải quyết vấn đề hiệu năng như thế này là suy nghĩ về tất cả các lớp có thể xảy ra tắc nghẽn, và sau đó đưa ra các thử nghiệm để loại bỏ từng vấn đề cho đến khi bạn tách biệt vấn đề.


Không có tranh chấp. Mặc dù bạn đúng rằng đây là một máy chủ ảo, nhưng đĩa cứng đã được dành riêng cho máy chủ này và tôi chỉ chạy một truy vấn cơ sở dữ liệu tại một thời điểm mà không có hoạt động máy chủ chuyên sâu nào khác. Lưu trữ chỉ là một đĩa SATA quay duy nhất. Lưu ý rằng tôi có một vài máy chủ / cơ sở dữ liệu (riêng biệt) khác có cùng thiết lập, nhưng hoạt động nhanh với IO thấp, như mong đợi, được đưa ra các truy vấn / lập chỉ mục tương tự.
ehsanul

Bạn có thể chạy iostattrên đĩa từ dom0 chỉ để xem hình ảnh có giống nhau không? Bạn có thể làm một số điểm chuẩn đĩa cơ bản khác từ cả hai cấp độ? Điều đó ít nhất sẽ giúp thu hẹp nơi để tìm tiếp theo.
mattdm

Chắc chắn rồi. Tại sao bạn mong đợi một sự khác biệt dựa trên nơi iostatđược chạy từ đâu? Có nên quan trọng? Bây giờ tôi không có quyền truy cập trực tiếp vào dom0, mặc dù tôi có thể lấy nó. Trong khi đó, tôi sẽ cố gắng fiođể điểm chuẩn.
ehsanul

3
vì một điều: ảnh chụp nhanh có thể tạo ra tình huống như vậy
Hubert Kario

3
Bạn đã đúng mattdm, đã có sự tranh chấp, hiển thị trên dom0. Đó là một vấn đề về giao tiếp, ông chủ của tôi đã đưa một phần đĩa cứng cho một máy chủ khác dưới sự quản lý của người khác mà tôi không biết. Tôi có ấn tượng rằng nó được dành riêng, bởi vì đó là cách chúng tôi luôn thiết lập nó. Tôi đoán đó là lý do tại sao việc kiểm tra lại các giả định của bạn luôn quan trọng. Cảm ơn!
ehsanul

1

Dưới đây là một số gợi ý, theo thứ tự ngẫu nhiên nhiều hay ít:

  1. Autovacum không được bật theo mặc định trong CentOS. Có nhiều cài đặt bạn phải đặt để kích hoạt nó. Kiểm tra lại để quá trình trống thực sự chạy. Thật dễ dàng để bỏ lỡ một trong các cài đặt cần thiết.

  2. Lưu ý rằng bạn phải thực hiện bước lọc thứ hai cho truy vấn đó, có thể tốn kém tùy thuộc vào những gì bạn nhận lại. Tôi sẽ xem xét một chỉ số như:

    TẠO INDEX Consumer_m_lower_last ON Consumer_m (thấp hơn (last_name));

    Cái nào sẽ phù hợp với truy vấn của bạn và loại bỏ Recheck.

  3. Ngoài ra, như mattdm chỉ ra, bạn không thể tin tưởng vào iuler trong môi trường ảo hóa.

  4. Bạn có thể nên kiểm tra http://lonesysadmin.net/2008/02/21/elevatornoop/ nếu bạn gặp vấn đề về IO trong môi trường XEN. Cài đặt thang máy có thể có tác động, nhưng không lớn như vậy.

  5. Là đĩa bên dưới sử dụng ảnh chụp nhanh LVM? Mặc dù điều này rất hữu ích từ góc độ quản lý, nó có thể giết chết hiệu suất IO. Điều này đúng cả nếu thiết bị khối mà bạn sử dụng là ảnh chụp nhanh và nếu ảnh chụp nhanh đã được chụp từ thiết bị khối.


Cảm ơn những lời đề nghị. Chỉ mục thực sự ở mức thấp hơn (last_name), mặc dù tôi đã bỏ "thấp hơn" từ tên của chỉ mục. Vì vậy, tôi không biết tại sao có một cuộc kiểm tra lại đang diễn ra ở đó. /Trên thực tế, đĩa được gắn trên đang sử dụng ảnh chụp nhanh LVM, nhưng không phải là đĩa được lưu trữ trên cơ sở dữ liệu. Vì vậy, tôi không nghĩ rằng đó là nó. Tôi sẽ xem xét các đề nghị khác của bạn mặc dù!
ehsanul

1

Tôi nghi ngờ đây là một vấn đề với PostgreSQL và nhiều khả năng chỉ là sự cố với Disk IO. Như các ý kiến ​​từ một câu trả lời khác đề cập, nếu đó là vấn đề IO của đĩa, bạn thực sự nên đo từ Dom0 để bạn có được hình ảnh về mọi thứ đang xảy ra.

Tôi đã có một vấn đề rất giống một lúc trước và hóa ra đó là một vấn đề với bộ điều khiển đĩa. Truy cập đĩa rất chậm đã khiến hệ thống bị nghẽn cổ chai trong khi chờ IO đĩa (xuất hiện ở mức trung bình tải rất cao và thời gian chờ, nhưng cũng khiến các quá trình chờ đĩa tiêu thụ nhiều CPU hơn so với cách khác. đã không nhận ra bộ điều khiển đúng cách và rơi vào bộ điều khiển IDE trường cũ thay vì bộ điều khiển sata nhanh.

Cách khắc phục là khởi động với

hda=noprobe hda=none 

ở cuối chuỗi kernel trong /etc/grub.conf. (Tất nhiên, thêm tất cả các đĩa bạn có, ala: hdc=noprobe, hdc=none, hdd=...)


Cảm ơn, nhưng hóa ra nó là một cái gì đó sillier nhiều trong trường hợp này. Bỏ phiếu dù thế nào đi nữa.
ehsanul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.