26 September 2013

คุม Bandwidth ด้วย cbq ตอน 1 การ Download

คนดูแลระบบเครือข่าย LAN ด้วยคอเดียวกันผมทราบว่าปัญหาใหญ่อย่างหนึ่งสำหรับสำนักงาน, หรือระบบเครือข่ายบ้านๆ จะต้องเจอกับเรื่อง Bandwidth ของการร่วมกันใช้ internet มีไม่เพียงพอกับความต้องการ แม้ทุกวันนี้ผู้ให้บริการจะมีการขยายความเร็วไปอย่างต่อเนื่อง แต่ก็ดูเหมือนผู้ใช้งานของเราก็มีความต้องการเติบโตตามกันทันทุกที

สำหรับสูตรสำเร็จของการควบคุมปริมาณการใช้งาน หรือการทำ Quality of Service (QoS) องค์กรที่มีเงินเยอะๆสามารถจบปัญหาได้ด้วยการจ่ายซื้ออุปกรณ์ QoS ราคาแพง ซึ่งเราจะพบในหน่วยงานราชการที่มีอินเตอร์เน็ตความเร็ว 2-4 Mbps และซื้อ firewall ที่ทำ QoS ได้ราคาหลายแสนมาแปะไว้ใช้งาน

สำหรับพวกเบี้ยน้อยแบบผม อยากขอแนะนำวิธีการคุม Bandwidth ด้วย Linux แบบพื้นๆด้วย cbq นะครับ

cbq หรือ Class Based-Queuing เป็นชุดการทำงานเฉพาะบนระบบปฏิบัติการ Linux ซึ่งทำหน้าที่ควบคุมการทำงานของ Linux Kernel ให้สามารถควบคุมปริมาณการส่งข้อมูลให้กับเครื่องอื่นๆได้ [อ่านคำจำกัดความ cbq] โดยเราสามารถเอามาประยุกต์ใช้เพื่อคุม bandwidth ต้นทุนจาก internet และ share ต่อให้กับเครื่องอื่นๆใน network ได้

ตาม Step เอาเลยนะครับ

1. ต้องมี Linux ที่เป็น firewall เรียบร้อย หรืออาจจะเป็น bridge ก็ได้ โดยมี Interface ด้านหนึ่งเป็น WAN และด้านหนึ่งเป็น LAN
สมมติให้ WAN เป็น eth0
สมมติให้ LAN เป็น eth1

2. เราต้องเป็น root นะครับ

3. ตรวจสอบว่าเครื่องมือ cbq เรียบร้อย โดยการพิมพ์ cbq ดู
> cbq 
Usage: cbq {start|compile|stop|restart|timecheck|list|stats}

ถ้าไม่มี cbq ให้หามาติดตั้งก่อน จริงๆแล้ว cbq เป็น shell script ที่จะเอาไว้สร้าง script ชื่อ cbq.init อีกทีหนึ่ง การติดตั้งอาจจะไม่ต้องใช้การ compile ใดๆก็ได้

4. พื้นที่ที่ใช้เก็บไฟล์ bandwidth profile คือ /etc/sysconfig/cbq ถ้าไม่มี path นี้ก็ให้เตรียมให้เรียบร้อย

5. สร้าง bandwidth profile โดยเป็นรูปแบบตาม format ของ cbq เริ่มที่ชื่อไฟล์ก่อน
ชื่อต้องสร้างในรูปแบบ cbq-hhhh.name ข้อสรุปการตั้งชื่อคือ
- นำด้วยคำว่า "cbq-" พร้อมกับขีด dash 1 ตัว
- เลข class ความยาว 4 หลัก เป็นเลขฐานสิบหก hexagonal
- และสุดท้าย เป็นชื่ออะไรก็ได้ โดยใช้ . เป็นตัวคั่น
ตัวอย่างเช่น cbq-0010.myprofile หรือ cbq-01ff.mycbq หรือ cbq-0001.jingjunpc

6. Template เพื่อการคุม bandwidth พื้นฐาน สำหรับ Client ผมเสนอให้ใช้ template นี้เลย
DEVICE=eth1,100Mbit,10Mbit
RATE=2048Kbit
WEIGHT=204Kbit
PRIO=5
LEAF=none
ISOLATED=yes
RULE=,192.168.16.10
Download direction
Traffic Direction โดย cbq ชุดนี้อธิบายการ
Shape bandwidth กับ client ในขา Download
คำอธิบายส่วนของ Config ประกอบด้วย
DEVICE - คือ Interface ที่จะทำให้มีผลจากการออกแบบตาม Profile Bandwidth Shaper ของเรา ซึ่งจะระบุความเร็วรวมทางทฤษฏีของ Interface ไว้ ซึ่งในที่นี้เป็นการ์ด LAN แบบ 100Mbps ซึ่งตรงนี้จะมี Throughput rate ด้วย ตามคู่มือบอกว่าให้เอา Bandwidth หารด้วย 10
RATE - คือความเร็วที่จะให้กับ Client ตามตัวอย่างคือ 2Mbps
WEIGHT - ปริมาณ ซึ่งต้องใส่ตัวเลขสัมพันธ์กับ RATE โดยตัวเลขควรจะเป็น RATE หารด้วย 10
PRIO - Priority ของ Class cbq ที่เราสร้างขึ้น มีคำได้ตั้งแต่ 1-8 แต่ถ้าไม่ใส่จะเป็นค่าเท่ากับ 5
LEAF - ใช้สำหรับกรณีการกำหนดแยก bandwidth profile แบบซับซ้อน คือ มีการคุมแยกเป็น class หลายๆส่วน ซึ่งของเรากำหนดเป็น none เพราะเราคุมตรงจาก bandwidth หลักเพียง class เดียว
ISOLATE - ใช้เฉพาะการอนุญาตให้ยืม bandwidth ข้ามกันกรณีเราทำ config แบบซับซ้อนไหม (กรณีเราก็ไม่ซับซ้อนแหละ) แต่เผื่อไว้ในอนาคตเราจะทำเป็น class แบ่ง การกำหนดเป็น yes เพื่อให้ constraint ของ config น้อยลง
RULE - ตามรูปแบบของ cbq จริงๆ สามารถรองรับได้ละเอียดมาก โดยอยู่ใน Syntax นี้คือ [[saddr[/prefix]][:port[/mask]],][daddr[/prefix]][:port[/mask]] ซึ่งสามารถกำหนดความเร็วเป็น IP, Subnet, ต้นทาง, ปลายทาง หรือแยกเป็น TCP port ได้ จากตัวอย่างคือเราจับ IP เดียว ที่อยู่ใน network ปลายทาง อย่าลืมมี Comma ด้านหน้า เพราะเราต้องการให้ IP address ของเครื่อง destination เป็นปลายทาง

7. ทำการ start cbq ด้วยคำสั่ง
cbq start
ถ้าไม่มี error ใดแสดงขึ้นมา แสดงว่าน่าจะไม่มีปัญหา

8. ดูสถานะของการ apply Traffic Control ได้ผ่านคำสั่ง
cbq stats
หรือ
cbq list

9. ถ้าต้องการคุม bandwidth ของกลุ่ม IP หรือ IP เดี่ยวเครื่องอื่น ต้องสร้าง bandwidth profile แยกเป็นรายการไป ซึ่งผมใช้วิธีการเขียน shell script เพื่อสร้าง bandwidth profile ทีละหลายๆไฟล์ให้แบบรวดเดียวเลย ง่ายดี

ทั้งนี้ cbq เป็นเพียง shell script ที่เอาไว้สร้าง shell script ที่เป็นคำสั่งของ tc (Traffic Control) อีกต่อหนึ่ง การใช้ cbq เพื่ออำนวยความสะดวกต่อผู้ดำเนินการระบบให้สามารถมอง config ได้เข้าใจมากขึ้น

เนื้อแท้ของ cbq โดยวิธีปฏิบัติจริง จะมีความสามารถในการทำงานบริหาร bandwidth ได้ซับซ้อนกว่านี้ โดยมีมุมมองเป็น Class แม่ เพื่อแชร์ความเร็วต่อลงไปเป็นลำดับชั้น แต่วิธีการ setup นี้เป็นเพียงสูตรสำเร็จของการคุม bandwidth สำหรับ IP address ธรรมดา ซึ่งเห็นว่าเราก็ใช้งาน Network กันแบบนี้เป็นส่วนใหญ่

จะมีต่อในตอนที่ 2 ด้วยหลักการเดียวกันแต่คุมข้อมูลจาก client ในขา upload นะครับ

Written by Tiwakorn Laophulsuk

No comments:

Post a Comment

Give a comment ...