Sunday, May 4, 2014

Light Weight Monitoring System (LWM) ตอนที่ 1

ข้อเขียนนี้ช่วยฉัน: 
โพสต์ครั้งแรก: 14 มีนาคม 2011


LWM คือระบบที่จะเก็บข้อมูลตามช่วงเวลาที่กำหนดเช่น ทุก ๆ 1 นาที หรือ 5 นาทีเป็นต้น และแสดงผลออกมาในรูปของกราฟ ระบบจะทำการ “เรียนรู้” จากข้อมูลที่ได้ในอดีตเพื่อที่จะสร้าง Baseline ที่ใกล้เคียงและสะท้อนถึงความเป็นจริงปัจจุบันมากที่สุดโดยอัตโนมัติ ซึ่งจะทำให้ผู้ดูแลระบบสามารถตรวจสอบสถานะของระบบโดยเปรียบเทียบกับ Baseline ที่ได้จากข้อมูลในอดีตโดยผ่านภาพกราฟฟิค
ปั
ญหาหนึ่งที่ผมพบอยู่เสมอ ๆ คือกรณีที่มีระบบฐานข้อมูลที่เราต้องดูแลเป็นจำนวนมาก การจะรู้ถึงปัญหาที่เกิดขึ้นกับระบบฐานข้อมูลตัวใด ๆ นั้นมักจะช้าเกินไป คือเมื่อมีปัญหาสักพักเราจึงจะรู้ เช่นเมื่อมีการรอคอยของ Session ใด ๆ นานผิดปกติ หรือการมีจำนวนของ Session มากขึ้นผิดปกติ เมื่อรู้ปัญหาถึงปัญหาช้าก็ทำให้เราแก้ไขได้ช้า ซึ่งอาจจะทำให้เราตกข้อตกลงที่ให้ไว้เกี่ยวกับระดับคุณภาพของการให้บริการหรือ Service Level Agreement (SLA) ได้ การมีเครื่องมือที่จะช่วยให้เราสามารถมองเห็นปัญหานี้แต่เนิ่น ๆ จะช่วยให้เราสามารถรับมือกับสถานการณ์ได้ดีขึ้น

บทความนี้จะแสดงถึงวิธีการสร้างเครื่องมือดังกล่าวที่จะแสดงผลออกมาเป็นกราฟที่สร้างขึ้นบน Microsoft Excel ซึ่งจะเปลี่ยนแปลงไปทุก ๆ นาที ยิ่งไปกว่านั้นบนกราฟยังประกอบด้วย Baseline เพื่อที่จะช่วยให้เราสามารถบอกได้ว่าเส้นกราฟที่เห็นมีความผิดปกติไปมากน้อยแค่ไหน เครื่องมือนี้ผมเป็นผู้เขียนขึ้นเพื่อแก้ปัญหาดังกล่าว และเรียกมันว่า "Light Weight Monitoring System" (LWM) ผู้สนใจสามารถนำไปพัฒนาใช้ต่อได้ ไม่สงวนลิขสิทธิ์ครับ แต่จะขอบคุณมากถ้าจะแจ้งให้ทราบถึงปัญหาหรือผลการใช้งานกันบ้างนะคร๊าบ : )


Light Weight Monitoring System
ปัญหาอันหนึ่งที่เราในฐานะผู้ดูแลระบบฐานข้อมูลพบกันบ่อย ๆ ก็คือ “ทำอย่างไรจึงจะสามารถบ่งชี้การเพิ่มขึ้นของตัวชี้วัดบางตัว (เช่นจำนวนของ Session ที่ทำงานอยู่ หรือเวลาที่ Session ได้ใช้ไปแล้วในการรันคำสั่งปัจจุบัน) หรือแม้ว่าเราจะรู้ว่าค่าของตัวชี้วัดเหล่านี้กำลังเพิ่มขึ้น เราจะรู้ได้อย่างไรว่าการเพิ่มขึ้นนี้ผิดปกติหรือไม่ ตัวอย่างเช่น ถ้าจำนวนของ Session เพิ่มขึ้นจาก 50 ไปเป็น 80 หมายถึงความผิดปกติหรือไม่ คำตอบคืออาจจะใช่ หรืออาจจะไม่ใช่ กล่าวได้ว่าถ้าเราไม่มีค่ากลาง ๆ ที่จะใช้ในการเปรียบเทียบ เราจะไม่มีทางรู้เลยว่าการเพิ่มขึ้นของตัวชี้วัดเหล่านี้มีความวิกฤตเพียงใด
LWM คือระบบที่จะเก็บข้อมูลตามช่วงเวลาที่กำหนดเช่น ทุก ๆ 1 นาที หรือ 5 นาทีเป็นต้น และแสดงผลออกมาในรูปของกราฟ ระบบจะทำการ “เรียนรู้” จากข้อมูลที่ได้ในอดีตเพื่อที่จะสร้าง Baseline ที่ใกล้เคียงและสะท้อนถึงความเป็นจริงปัจจุบันมากที่สุดโดยอัตโนมัติ ซึ่งจะทำให้ผู้ดูแลระบบสามารถตรวจสอบสถานะของระบบโดยเปรียบเทียบกับ Baseline ที่ได้จากข้อมูลในอดีตโดยผ่านภาพกราฟฟิค

lwm_excel
รูปที่1 LWM ใช้กราฟอัพเดท Real-time ที่สร้างขึ้นบน MS Excel เป็นตัวแสดงผล
ปกติปัญหาที่ไม่ได้ส่งผลปัจจุบันทันด่วนเช่น พวก ORA-00600 เราอาจจะสามารถใช้วิธีการอื่น ๆ เช่นเขียนสคริปต์เพื่อตรวจสอบ Error เหล่านี้ได้แบบวันต่อวัน แต่ปัญหาที่ส่งผลแบบปัจจุบันทันด่วนจะทำให้ผู้ใช้ระบบได้รับผลกระทบในทันที ซึ่งโดยมากจะทำให้ผู้ใช้ระบบต้องรอคอยเป็นเวลานาน วัตถุประสงค์ของ LWM คือการจับเอาแนวโน้มของค่าทางสถิติบางตัวที่เราสนใจซึ่งเบี่ยงเบนไปจากค่าเฉลี่ยเมื่อเวลาผ่านไป เพื่อให้ผู้ดูแลระบบสามารถที่จะพบปัญหาได้โดยง่ายก่อนที่ปัญหาจะบานปลายหรือ ก่อนที่จะมีผลกระทบกับผู้ใช้ระบบ
เพื่อที่จะตรวจดูแนวโน้มนี้บนกราฟได้ เราจะต้องกำหนดช่วงห่างเวลาของแต่ละ “Snapshot” (การเก็บข้อมูลในแต่ละจุดของเวลา) ยิ่งช่วงห่างนี้น้อยเท่าใดเราก็จะได้กราฟที่แสดงข้อมูลที่ล่าสุดที่สุด อย่างไรก็ตามช่วงห่างที่น้อยจะทำให้ระบบทำงานบ่อยมากกว่าการกำหนดช่วงห่างที่ห่างกว่าซึ่งอาจจะมีผลกับประสิทธิภาพโดยรวมของระบบบ้าง เราอาจจะกำหนดช่วงห่างเริ่มต้นไว้ที่ 1 ถึง 5 นาที แล้วปรับแต่งให้เข้ากับความจำเป็นของแต่ละระบบก็ได้ (ช่วงเวลาที่ห่างน้อยกว่า 1 นาทีมักจะไม่ค่อยแสดงความแตกต่างระหว่างจุดสองจุดมากนัก) เพื่อที่จะลดภาระของระบบข้อมูลที่เก็บจะต้องมากพอที่จะบอกถึงสภาวะโดยรวมของการเปลี่ยนแปลงของการทำงานบนระบบฐานข้อมูลที่เราสนใจ ในขณะเดียวกันข้อมูลที่เก็บจะต้องเล็กพอที่จะไม่ก่อให้เกิดการดึงประสิทธิภาพของระบบให้เลวลงด้วย

เราแสดงอะไรบนกราฟบ้าง?
ตัวชี้วัดที่เราใส่ไว้ในกราฟประกอบด้วย
  • จำนวนของ Session: จำนวนของ Session ที่ Active หมายถึง Session ที่กำลังทำงานกับฐานข้อมูลอยู่ ณ เวลาที่ทำการเก็บข้อมูล ซึ่งทำโดยการ Select ข้อมูลจาก V$SESSION
  • ค่า Baseline ของจำนวน Session: ที่ได้จากการคำนวณโดยใช้ข้อมูลย้อนหลังไป 30 วัน Baseline นี้คำนวณจากการหาค่าเฉลี่ยของจำนวน Session ย้อนหลังไป 30 วัน
  • ค่าของ Last Call Elapse Time สูงสุด: เมื่อ Session ใด ๆ เชื่อมต่อกับฐานข้อมูลมันจะอยู่ในสถานะ Active ในบางช่วงเวลา และอยู่ในสถานะ Inactive ในบางช่วงเวลา เรารู้ว่าเมื่อ Session อยู่ในสถานะ Active แสดงว่ามันกำลังทำอะไรบางอย่างกับฐานข้อมูลอยู่ ค่านี้แสดงเวลาที่ผ่านไปแล้ว (เป็นวินาที) นับตั้งแต่ Session เริ่มอยู่ในสถานะ Active ครั้งหลังสุด ในการเก็บข้อมูลแต่ละครั้งเราจะเก็บเฉพาะค่า Last Call Elapse Time ที่มากที่สุด ณ ขณะนั้น โดยการ Select จาก V$SESSION เช่นกัน
  • ค่า Baseline ของค่า Last Call Elapse Time สูงสุด: ที่ได้จากการคำนวณโดยใช้ข้อมูลย้อนหลังไป 30 วัน ในทำนองเดียวกับการหาค่า Baseline ของจำนวน Session
V$SESSION เป็น Dynamic Performance View ที่ให้ข้อมูลเกี่ยวกับ Session ทั้งหมดที่กำลังติดต่อกับฐานข้อมูล ณ ขณะนั้น ๆ โดย มีสถานะต่าง ๆ ตามเอกสารอ้างอิงใน Oracle9i Database Reference Release 2 (9.2) ดังนี้
- ACTIVE currently executing SQL
- INACTIVE ยังคงเชื่อมต่ออยู่แต่ไม่ได้ทำกิจกรรมใด ๆ บนฐานข้อมูล
- KILLED marked to be killed
- CACHED temporarily cached for use by Oracle*XA
- SNIPED session inactive, waiting on the client

สถานะของ Session จะปรากฎในคอลัมน์ STATUS ใน V$SESSION และจะเปลี่ยนไปมาระหว่างที่ Session ยังติดต่อกับฐานข้อมูล กล่าวคือในบางขณะจะมีสถานะเป็น Active และในบางสถานะจะเป็น Inactive ฯลฯ โดยสถานะที่เราสนใจคือ Active ซึ่งเป็นสถานะที่ Session กำลังรัน SQL บนระบบฐานข้อมูล ถ้าเราใช้คอลัมน์นี้ร่วมกับคอลัมน์ LAST_CALL_ET (Last Call Elapse Time) เราจะรู้เวลา (เป็นวินาที) ที่ผ่านไปจากการรันคำสั่ง SQL ตัวปัจจุบันของ Session นั้น ๆ ดังนั้นหากค่าของ LAST_CALL_ET เพิ่มสูงขึ้นผิดปกติก็แสดงว่า Session กำลังใช้เวลาในการรันคำสั่งนานเกินไปนั่นเอง

โดยข้อมูลดังกล่าวถ้าเรารู้ค่าเฉลี่ยของ LAST_CALL_ET ที่สูงที่สุด ณ ช่วงเวลาต่าง ๆ โดยตัดเอาค่าที่สูงผิดปกติออกไป เราก็จะสามารถรู้ว่าระบบฐานข้อมูลตัวดังกล่าวควรจะมี LAST_CALL_ET ไม่เกินเท่าใดจึงจะถือว่าอยู่ในเกณฑ์ปกติ เราเรียกค่าเฉลี่ยนี้ว่า Baseline กรณีเดียวกันเราสามารถหาค่า Baseline ของจำนวน Session ปกติได้ โดยหาค่าเฉลี่ยของจำนวน Session ณ ช่วงเวลาต่าง ๆ และตัดเอาช่วงเวลาที่มีค่าจำนวน Session สูงผิดปกติออกไป


ขอบคุณที่ให้ความสนใจ โปรดติดตามต่อตอนหน้านะครับ


No comments:

Post a Comment