IO ช้ามากพร้อม PostgreSQL แบบง่าย 8.4.4 ข้อความค้นหาบน Centos 5.5


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';

นี่คือผลลัพธ์ของการอธิบาย:

                                           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/xvdb1แสดงว่าคุณกำลังใช้งาน Xen อยู่ พื้นที่เก็บข้อมูลของคุณมีการกำหนดค่าอย่างไร? มีการต่อสู้สำหรับอุปกรณ์พื้นฐานและวิธีการที่ไม่iostatดูในที่ ?

ถ้าคุณไม่สามารถกำจัดสิ่งที่เป็นไปได้นั่นคือสิ่งที่ฉันจะชี้ให้เห็นถึงความผิดของตัวหมุนที่มีประสิทธิภาพต่ำ

โดยทั่วไปวิธีการโดยรวมในการแก้ปัญหาเรื่องประสิทธิภาพเช่นนี้คือการคิดเกี่ยวกับเลเยอร์ทั้งหมดที่เกิดปัญหาคอขวดจากนั้นจึงออกแบบการทดสอบเพื่อกำจัดแต่ละปัญหาจนกว่าคุณจะแยกแยะปัญหา


ไม่มีการช่วงชิง แม้ว่าคุณจะถูกต้องว่านี่เป็นเซิร์ฟเวอร์เสมือน แต่ฮาร์ดไดรฟ์ได้ทุ่มเทอย่างเต็มที่ให้กับเซิร์ฟเวอร์นี้และฉันใช้งานแบบสอบถามฐานข้อมูลครั้งละหนึ่งครั้งเท่านั้นโดยไม่มีการดำเนินการเซิร์ฟเวอร์อื่น ๆ ที่เก็บข้อมูลเป็นเพียงดิสก์ SATA ที่หมุนเพียงครั้งเดียว โปรดทราบว่าฉันมีเซิร์ฟเวอร์ / ฐานข้อมูล (แยกต่างหาก) อื่น ๆ ที่มีการตั้งค่าเดียวกันค่อนข้างมาก แต่ทำงานได้อย่างรวดเร็วด้วย IO ต่ำตามที่คาดไว้เนื่องจากมีข้อความค้นหา / ดัชนีที่คล้ายกัน
ehsanul

คุณสามารถเรียกใช้iostatบนดิสก์จาก dom0 เพื่อดูว่ารูปภาพคล้ายกันหรือไม่ คุณสามารถทำมาตรฐานดิสก์พื้นฐานอื่น ๆ จากทั้งสองระดับได้หรือไม่? อย่างน้อยก็จะช่วยให้แคบลงว่าจะดูที่ไหนต่อไป
mattdm

แน่ใจ เหตุใดคุณจึงคาดหวังความคลาดเคลื่อนตามตำแหน่งที่iostatเรียกใช้จากที่ใด มันควรจะสำคัญหรือไม่ ตอนนี้ฉันไม่สามารถเข้าถึง dom0 ได้โดยตรงแม้ว่าฉันจะได้รับ ฉันจะพยายามfioเปรียบเทียบในระหว่างนี้
ehsanul

3
สำหรับสิ่งหนึ่ง: ภาพรวมสามารถสร้างสถานการณ์เช่นนี้ได้
Hubert Kario

3
คุณเป็นคนที่ถูกต้องมีความขัดแย้งปรากฏขึ้นบน dom0 มันเป็นปัญหาของการสื่อสารเจ้านายของฉันมอบส่วนหนึ่งของฮาร์ดดิสก์ให้กับเซิร์ฟเวอร์อื่นภายใต้การจัดการของคนอื่นโดยที่ฉันไม่รู้ ฉันอยู่ภายใต้การแสดงผลที่ทุ่มเทเพราะนั่นคือวิธีที่เราตั้งค่าไว้เสมอ ฉันเดาว่าเป็นเหตุผลที่สำคัญเสมอที่จะตรวจสอบสมมติฐานของคุณอีกครั้ง ขอบคุณ!
ehsanul

1

นี่คือคำแนะนำบางอย่างในลำดับแบบสุ่มมากหรือน้อย:

  1. Autovacum ไม่เปิดตามค่าเริ่มต้นใน CentOS มีการตั้งค่าหลายอย่างที่คุณต้องตั้งค่าเพื่อเปิดใช้งาน ตรวจสอบอีกครั้งเพื่อให้กระบวนการ vacum ทำงานจริง มันง่ายที่จะพลาดหนึ่งในการตั้งค่าที่จำเป็น

  2. โปรดทราบว่าคุณต้องทำขั้นตอนที่สองของตัวกรองสำหรับแบบสอบถามซึ่งอาจมีราคาแพงขึ้นอยู่กับสิ่งที่คุณได้รับกลับ ฉันจะพิจารณาดัชนีเช่น:

    สร้าง INDEX consumer_m_lower_last ON consumer_m (ต่ำกว่า (นามสกุล)

    ซึ่งจะจับคู่กับแบบสอบถามของคุณและลบการตรวจสอบอีกครั้ง

  3. นอกจากนี้ดังที่ mattdm ชี้ให้เห็นคุณไม่สามารถเชื่อถือ iostat ในสภาพแวดล้อมเสมือนจริง

  4. คุณควรตรวจสอบhttp://lonesysadmin.net/2008/02/21/elevatornoop/หากคุณมีปัญหา IO ในสภาพแวดล้อม XEN การตั้งค่าลิฟต์อาจมีผลกระทบ แต่จะไม่ใหญ่มาก

  5. ดิสก์อ้างอิงใช้สแน็ปช็อต LVM หรือไม่ ในขณะที่สิ่งนี้มีประโยชน์มากจากมุมมองของผู้บริหาร แต่ก็สามารถฆ่าประสิทธิภาพของ IO ได้ สิ่งนี้เป็นจริงทั้งในกรณีที่อุปกรณ์บล็อกที่คุณลงชื่อเป็นสแน็ปช็อตและหากสแน็ปช็อตนั้นถูกนำไปใช้กับอุปกรณ์บล็อก


ขอบคุณสำหรับคำแนะนำ ดัชนีอยู่ที่ด้านล่าง (last_name) แม้ว่าฉันจะออก "ต่ำ" จากชื่อของดัชนี ดังนั้นฉันไม่รู้ว่าทำไมจึงมีการตรวจสอบเกิดขึ้นอีกครั้ง ดิสก์ที่เมาท์อยู่/นั้นใช้สแนปชอตของ LVM จริง ๆ แล้ว แต่ไม่ใช่สแน็ปช็อตที่เก็บฐานข้อมูล ดังนั้นฉันไม่คิดว่าเป็นอย่างนั้น ฉันจะพิจารณาคำแนะนำอื่น ๆ ของคุณ!
ehsanul

1

ฉันสงสัยว่านี่เป็นปัญหาของ PostgreSQL และน่าจะเป็นปัญหาของ Disk IO เท่านั้น ตามความคิดเห็นจากคำตอบอื่น ๆ ที่กล่าวถึงหากเป็นปัญหาของดิสก์ IO คุณควรวัดจาก Dom0 เพื่อให้ได้ภาพทุกอย่างที่เกิดขึ้น

ฉันมีปัญหาที่คล้ายกันมากในขณะที่กลับและมันก็กลายเป็นปัญหากับตัวควบคุมดิสก์ การเข้าถึงดิสก์ที่ช้ามากทำให้ระบบเกิดปัญหาคอขวดขณะรอดิสก์ IO (ซึ่งแสดงว่ามีโหลดเฉลี่ยสูงมากและรอเวลา แต่ยังทำให้กระบวนการรอให้ดิสก์ใช้ CPU มากกว่าที่พวกเขาต้องการ ไม่รู้จักตัวควบคุมอย่างถูกต้องและกลับไปที่ตัวควบคุม IDE ของโรงเรียนเก่าแทนที่จะเป็น SATA ที่รวดเร็ว

การแก้ไขคือการบูตด้วย

hda=noprobe hda=none 

ที่ส่วนท้ายของสตริงเคอร์เนลใน /etc/grub.conf (แน่นอนเพิ่มดิสก์ทั้งหมดที่คุณมี Ala: hdc=noprobe, hdc=none, hdd=... )


ขอบคุณ แต่มันกลับกลายเป็นว่าบางสิ่งบางอย่างที่ยิ่งใหญ่กว่าในกรณีนี้ โหวตใด ๆ
ehsanul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.